Initial version from https://github.com/tadas-s/OSC2Midi
https://github.com/tadas-s/OSC2Midi
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
4.3 KiB
177 lines
4.3 KiB
// Use from 0 to 4. Higher number, more debugging messages and memory usage.
|
|
#define _WIFIMGR_LOGLEVEL_ 1
|
|
#define DEBUG 1
|
|
|
|
#include <WiFi.h>
|
|
#include <WiFiManager.h>
|
|
#include "debug.h"
|
|
#include <Arduino.h>
|
|
#include <ESPmDNS.h>
|
|
#include <LiquidCrystal_I2C.h>
|
|
#include <looper.h>
|
|
#include <RunningMedian.h>
|
|
#include <ESPDateTime.h>
|
|
|
|
#define MDNS_NAME "wlanthermometer"
|
|
#define AP_SSID_CONFIG_NAME "WLANTHERMOMETER-Config"
|
|
#define AP_CONFIG_PASSWORD "wlanthermometer"
|
|
#define AP_DATA_RESET_PIN 35
|
|
#define TEMP_SENS_PIN 34
|
|
#define LCD_I2C_ADDR 0x3f
|
|
#define LCD_COL 20
|
|
#define LCD_ROW 4
|
|
#define KRATE_TEMP 5000
|
|
#define KRATE_TIME 500
|
|
#define MEDIAN_SAMPLES 60
|
|
#define ONBOARD_LED 2
|
|
#define NTP_TIMEOUT 15000
|
|
void check_mode(void);
|
|
|
|
LiquidCrystal_I2C lcd(LCD_I2C_ADDR, LCD_COL, LCD_ROW);
|
|
looper sched;
|
|
RunningMedian samples = RunningMedian(MEDIAN_SAMPLES);
|
|
float temp_min = (analogRead(TEMP_SENS_PIN) / 2048.0) * 330.0;
|
|
float temp_max = temp_min;
|
|
bool led_state;
|
|
|
|
void setup()
|
|
{
|
|
pinMode(AP_DATA_RESET_PIN, INPUT_PULLUP);
|
|
pinMode(ONBOARD_LED, OUTPUT);
|
|
|
|
Serial.begin(115200);
|
|
Serial.println(F("WLANThermometer (c)2020 H. Wirtz <wirtz@parasitstudio.de>"));
|
|
|
|
lcd.init();
|
|
lcd.backlight();
|
|
lcd.clear();
|
|
lcd.noCursor();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print(F("WLAN THERMOMETER"));
|
|
lcd.setCursor(0, 1);
|
|
lcd.print(F("(c)parasiTstudio"));
|
|
delay(1000);
|
|
|
|
DEBUG_MSG("Mode Client\n");
|
|
|
|
WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
|
|
|
|
WiFiManager wm;
|
|
|
|
if (digitalRead(AP_DATA_RESET_PIN) != LOW)
|
|
{
|
|
wm.resetSettings();
|
|
DEBUG_MSG("Resetting AP data\n");
|
|
lcd.clear();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print(F("Resetting AP data"));
|
|
delay(2000);
|
|
}
|
|
|
|
// Automatically connect using saved credentials,
|
|
// if connection fails, it starts an access point with the specified name ( "AutoConnectAP"),
|
|
// if empty will auto generate SSID, if password is blank it will be anonymous AP (wm.autoConnect())
|
|
// then goes into a blocking loop awaiting configuration and will return success result
|
|
|
|
lcd.clear();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print(F("Mode Config-AP"));
|
|
lcd.setCursor(0, 1);
|
|
lcd.print(F("192.168.4.1"));
|
|
|
|
if (!wm.autoConnect(AP_SSID_CONFIG_NAME, AP_CONFIG_PASSWORD))
|
|
{
|
|
DEBUG_MSG("Failed to connect\n");
|
|
lcd.setCursor(0, 2);
|
|
lcd.print(F("Failed "));
|
|
delay(1000);
|
|
lcd.setCursor(8, 2);
|
|
lcd.print(F("- restart"));
|
|
delay(1000);
|
|
ESP.restart();
|
|
}
|
|
else {
|
|
//if you get here you have connected to the WiFi
|
|
DEBUG_MSG("Connected\n");
|
|
|
|
|
|
if (!MDNS.begin(MDNS_NAME))
|
|
{
|
|
DEBUG_MSG("Error setting up MDNS responder!\n");
|
|
}
|
|
else
|
|
{
|
|
DEBUG_MSG("mDNS started.\n");
|
|
}
|
|
|
|
lcd.clear();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print(F("Mode WiFi client"));
|
|
lcd.setCursor(0, 1);
|
|
lcd.print(WiFi.localIP());
|
|
|
|
delay(500);
|
|
}
|
|
|
|
lcd.setCursor(0, 3);
|
|
lcd.print("Getting time...");
|
|
DateTime.setTimeZone(2);
|
|
DateTime.begin(NTP_TIMEOUT);
|
|
while (!DateTime.isTimeValid())
|
|
{
|
|
Serial.println("Failed to get time from server.");
|
|
DateTime.forceUpdate();
|
|
}
|
|
|
|
sched.addJob(show_temperature, KRATE_TEMP);
|
|
sched.addJob(show_time, KRATE_TIME);
|
|
|
|
lcd.clear();
|
|
show_time();
|
|
show_temperature();
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
sched.scheduler();
|
|
}
|
|
|
|
void show_time(void)
|
|
{
|
|
DateTimeParts p = DateTime.getParts();
|
|
char dt[21];
|
|
|
|
Serial.println(DateTime.format(DateFormatter::DATE_ONLY));
|
|
Serial.println(DateTime.format(DateFormatter::TIME_ONLY));
|
|
|
|
sprintf(dt, "%02d.%02d.%4d %02d:%02d:%02d", p.getMonthDay(), p.getMonth() + 1, p.getYear(), p.getHours(), p.getMinutes(), p.getSeconds());
|
|
lcd.setCursor(0, 0);
|
|
lcd.print(dt);
|
|
|
|
digitalWrite(ONBOARD_LED, led_state);
|
|
led_state = !led_state;
|
|
}
|
|
|
|
void show_temperature(void)
|
|
{
|
|
float temp = (analogRead(TEMP_SENS_PIN) / 2048.0) * 330.0;
|
|
|
|
Serial.println(temp, 1);
|
|
|
|
samples.add(temp);
|
|
|
|
if (samples.getLowest() < temp_min)
|
|
temp_min = samples.getLowest();
|
|
if (samples.getHighest() > temp_max)
|
|
temp_max = samples.getHighest();
|
|
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("Temperatur: ");
|
|
lcd.print(temp);
|
|
lcd.setCursor(0, 2);
|
|
lcd.print("Minimum: ");
|
|
lcd.print(temp_min);
|
|
lcd.setCursor(0, 3);
|
|
lcd.print("Maximum: ");
|
|
lcd.print(temp_max);
|
|
}
|
|
|