123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- #include <user_config.h>
- #include <SmingCore/SmingCore.h>
- #include <Libraries/DHT/DHT.h>
- ///////////////////////////////////////////////////////////////////
- // 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
- }
|