#include #include #include /////////////////////////////////////////////////////////////////// // Set your SSID & Pass for initial configuration #include "../include/configuration.h" // application configuration /////////////////////////////////////////////////////////////////// #include "max7219.h" #include "webserver.h" DHT dht (DHT_PIN, DHT22); Timer procTimer, procRTimer; Timer displayTimer; // Sensors values float SensorT, SensorH, SensorHI, SensorCR; String StrCF; // Time values time_t Time, NTPLastUpdate; void process (); void connectOk (); void connectFail (); void showTime (); // NTP Client void onNtpReceive (NtpClient& client, time_t timestamp); NtpClient ntpClient ("ntps1-0.cs.tu-berlin.de", 300, onNtpReceive); void init () { spiffs_mount (); // Mount file system, in order to work with files Serial.begin (SERIAL_BAUD_RATE); // 115200 by default Serial.systemDebugOutput (false); // Debug output to serial Serial.println ("Wall Segment Clock"); ActiveConfig = loadConfig (); //wait for sensor startup delay (1000); // DHT sensor start dht.begin (); // 7-segment output MAX7219_Init (); // set timezone hourly difference to UTC SystemClock.setTimeZone (ActiveConfig.AddTZ); WifiStation.config (ActiveConfig.NetworkSSID, ActiveConfig.NetworkPassword); WifiStation.enable (true); WifiAccessPoint.enable (false); WifiStation.waitConnection (connectOk, 20, connectFail); // We recommend 20+ seconds for connection timeout at start // раз в минуту? procTimer.initializeMs (60000, process).start (); process (); // обновление экрана два раза в секунду displayTimer.initializeMs (500, showTime).start (); } void showTime () { static int8_t oldHour, oldMinute, pos = 1; static time_t oldTime; DateTime dt; Time = SystemClock.now (); dt.setTime (Time); /* * теперь в dt у нас следующее: * int8_t Hour; * int8_t Minute; * int8_t Second; * int16_t Milliseconds; * int8_t Day; * int8_t DayofWeek; -- Sunday is day 0 * int8_t Month; // Jan is month 0 * int16_t Year; // Full Year numer */ int8_t si = dt.Second / 5; if (oldTime != Time) { oldTime = Time; if (pos > 8) { pos = 1; } MAX7219_writeData (pos, pos); pos++; /* switch (si) { case 0: case 2: case 4: case 6: case 8: case 10: MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorT)/10); MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorT)%10); MAX7219_writeData(MAX7219_DIGIT7, SYM_Temp); break; case 1: case 3: case 7: case 9: MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorH)/10); MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorH)%10); MAX7219_writeData(MAX7219_DIGIT7, SYM_H); break; case 5: case 11: MAX7219_writeData(MAX7219_DIGIT5, SYM_BLANK); MAX7219_writeData(MAX7219_DIGIT6, dt.DayofWeek/10); MAX7219_writeData(MAX7219_DIGIT7, dt.DayofWeek%10); break; } */ /* if (oldMinute != dt.Minute) { oldMinute = dt.Minute; if (oldHour != dt.Hour) { oldHour = dt.Hour; } } if (si != 5 || si != 11) { MAX7219_writeData(MAX7219_DIGIT0, dt.Hour/10); MAX7219_writeData(MAX7219_DIGIT1, dt.Hour%10); MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus); MAX7219_writeData(MAX7219_DIGIT3, dt.Minute/10); MAX7219_writeData(MAX7219_DIGIT4, dt.Minute%10); } else if (si == 5 || si == 11) { MAX7219_writeData(MAX7219_DIGIT0, dt.Day/10); MAX7219_writeData(MAX7219_DIGIT1, dt.Day%10); MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus); MAX7219_writeData(MAX7219_DIGIT3, dt.Month/10); MAX7219_writeData(MAX7219_DIGIT4, dt.Month%10); } */ /* if ((si & 1) == 0) { MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorT)/10); MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorT)%10); MAX7219_writeData(MAX7219_DIGIT7, SYM_Temp); } else { MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorH)/10); MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorH)%10); MAX7219_writeData(MAX7219_DIGIT7, SYM_H); } */ } /* else // time the same, output blank for "hh mm" { if (si != 5 || si != 11) { MAX7219_writeData(MAX7219_DIGIT2, SYM_BLANK ); } } */ } /* * Читаем данные с DHT22, в случае неудачи -- данные остануться старыми. * меня это полностью устраивает. */ void process () { TempAndHumidity th; ComfortState cf; static int8_t status; if (dht.readTempAndHumidity (th)) { status = 0; SensorT = th.temp; SensorH = th.humid; SensorHI = dht.getHeatIndex (); SensorCR = dht.getComfortRatio (cf); switch (cf) { case Comfort_OK: StrCF = "OK"; break; case Comfort_TooHot: StrCF = "Too Hot"; break; case Comfort_TooCold: StrCF = "Too Cold"; break; case Comfort_TooDry: StrCF = "Too Dry"; break; case Comfort_TooHumid: StrCF = "Too Humid"; break; case Comfort_HotAndHumid: StrCF = "Hot And Humid"; break; case Comfort_HotAndDry: StrCF = "Hot And Dry"; break; case Comfort_ColdAndHumid: StrCF = "Cold And Humid"; break; case Comfort_ColdAndDry: StrCF = "Cold And Dry"; break; default: StrCF = "Unknown"; break; } } else { /* * В случае, если от датчика ничего не получили, запустим повторный опрос через * 10 секунд, но не более 5 раз подряд. */ if (status < 6) { status++; procRTimer.initializeMs (10000, process).startOnce (); } } } void connectOk () { WifiAccessPoint.enable (false); Serial.print ("I'm connecteed. IP: "); Serial.println (WifiStation.getIP ().toString ()); startWebServer (); } /* * в случае неудачи подключения поднимаем точку доступа без авторизации */ void connectFail () { WifiAccessPoint.config ("MeteoConfig", "", AUTH_OPEN); WifiAccessPoint.enable (true); // Stop main screen output procTimer.stop (); displayTimer.stop (); Serial.println ("WiFi MeteoConfig"); Serial.println (WifiAccessPoint.getIP ()); startWebServer (); WifiStation.waitConnection (connectOk); // Wait connection } /* * NTP Client */ void onNtpReceive (NtpClient& client, time_t timestamp) { SystemClock.setTime (timestamp, eTZ_UTC); NTPLastUpdate = SystemClock.now (); Serial.println ("*** Time synchronized OK! ***"); // DEBUG }