// Use from 0 to 4. Higher number, more debugging messages and memory usage. #define _WIFIMGR_LOGLEVEL_ 1 #define DEBUG 1 #include #include #include "debug.h" #include #include #include #include #include #include #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 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; void setup() { pinMode(AP_DATA_RESET_PIN, INPUT_PULLUP); Serial.begin(115200); Serial.println(F("WLANThermometer (c)2020 H. Wirtz ")); 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, 3); lcd.print(F("Mode Config-AP")); lcd.setCursor(0, 4); 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, 4); lcd.print(F("Failed ")); delay(1000); lcd.setCursor(8, 4); 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); } DateTime.setTimeZone(2); DateTime.begin(); if (!DateTime.isTimeValid()) { Serial.println("Failed to get time from server."); } 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); } 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); }