|
@@ -13,7 +13,7 @@
|
|
|
DHT dht (DHT_PIN, DHT22);
|
|
|
|
|
|
Timer procTimer, procRTimer;
|
|
|
-Timer displayTimer;
|
|
|
+Timer displayTimer, tmpTimer;
|
|
|
|
|
|
// Sensors values
|
|
|
float SensorT, SensorH, SensorHI, SensorCR;
|
|
@@ -21,14 +21,10 @@ String StrCF;
|
|
|
// Time values
|
|
|
time_t Time, NTPLastUpdate;
|
|
|
|
|
|
-void
|
|
|
-process ();
|
|
|
-void
|
|
|
-connectOk ();
|
|
|
-void
|
|
|
-connectFail ();
|
|
|
-void
|
|
|
-showTime ();
|
|
|
+void process ();
|
|
|
+void connectOk ();
|
|
|
+void connectFail ();
|
|
|
+void showTime ();
|
|
|
|
|
|
// NTP Client
|
|
|
void
|
|
@@ -38,153 +34,154 @@ NtpClient ntpClient ("ntps1-0.cs.tu-berlin.de", 300, onNtpReceive);
|
|
|
void
|
|
|
init ()
|
|
|
{
|
|
|
- spiffs_mount (); // Mount file system, in order to work with files
|
|
|
+ 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");
|
|
|
+ Serial.begin (SERIAL_BAUD_RATE); // 115200 by default
|
|
|
+ Serial.systemDebugOutput (false); // Debug output to serial
|
|
|
+ Serial.println ("Wall Segment Clock");
|
|
|
|
|
|
- ActiveConfig = loadConfig ();
|
|
|
+ ActiveConfig = loadConfig ();
|
|
|
|
|
|
- //wait for sensor startup
|
|
|
- delay (1000);
|
|
|
- // DHT sensor start
|
|
|
- dht.begin ();
|
|
|
+ //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);
|
|
|
|
|
|
- // set timezone hourly difference to UTC
|
|
|
- SystemClock.setTimeZone (ActiveConfig.AddTZ);
|
|
|
+ WifiStation.config (ActiveConfig.NetworkSSID, ActiveConfig.NetworkPassword);
|
|
|
+ WifiStation.enable (true);
|
|
|
+ WifiAccessPoint.enable (false);
|
|
|
|
|
|
- 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
|
|
|
|
|
|
- WifiStation.waitConnection (connectOk, 20, connectFail); // We recommend 20+ seconds for connection timeout at start
|
|
|
+ // опрос датчиков -- раз в минуту?
|
|
|
+ procTimer.initializeMs (60000, process).start ();
|
|
|
+ process ();
|
|
|
|
|
|
- // раз в минуту?
|
|
|
- procTimer.initializeMs (60000, process).start ();
|
|
|
- process ();
|
|
|
+ // 7-segment output
|
|
|
+ MAX7219_Init ();
|
|
|
+ tmpTimer.initializeMs(10, MAX7219_FillMinus).startOnce();
|
|
|
|
|
|
- // обновление экрана два раза в секунду
|
|
|
- displayTimer.initializeMs (500, showTime).start ();
|
|
|
+ // обновление экрана два раза в секунду
|
|
|
+ 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)
|
|
|
+ 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)
|
|
|
{
|
|
|
- pos = 1;
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ */
|
|
|
}
|
|
|
- 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 );
|
|
|
- }
|
|
|
- }
|
|
|
- */
|
|
|
+ /*
|
|
|
+ else // time the same, output blank for "hh mm"
|
|
|
+ {
|
|
|
+ if (si != 5 || si != 11)
|
|
|
+ {
|
|
|
+ MAX7219_writeData(MAX7219_DIGIT2, SYM_BLANK );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ */
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -194,74 +191,74 @@ showTime ()
|
|
|
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)
|
|
|
+ TempAndHumidity th;
|
|
|
+ ComfortState cf;
|
|
|
+ static int8_t status;
|
|
|
+
|
|
|
+ if (dht.readTempAndHumidity (th))
|
|
|
{
|
|
|
- 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;
|
|
|
+ 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)
|
|
|
+ else
|
|
|
{
|
|
|
- status++;
|
|
|
- procRTimer.initializeMs (10000, process).startOnce ();
|
|
|
+ /*
|
|
|
+ * В случае, если от датчика ничего не получили, запустим повторный опрос через
|
|
|
+ * 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 ());
|
|
|
+ WifiAccessPoint.enable (false);
|
|
|
+ Serial.print ("I'm connecteed. IP: ");
|
|
|
+ Serial.println (WifiStation.getIP ().toString ());
|
|
|
|
|
|
- startWebServer ();
|
|
|
+ startWebServer ();
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -270,17 +267,17 @@ connectOk ()
|
|
|
void
|
|
|
connectFail ()
|
|
|
{
|
|
|
- WifiAccessPoint.config ("MeteoConfig", "", AUTH_OPEN);
|
|
|
- WifiAccessPoint.enable (true);
|
|
|
- // Stop main screen output
|
|
|
- procTimer.stop ();
|
|
|
- displayTimer.stop ();
|
|
|
+ WifiAccessPoint.config ("MeteoConfig", "", AUTH_OPEN);
|
|
|
+ WifiAccessPoint.enable (true);
|
|
|
+ // Stop main screen output
|
|
|
+ procTimer.stop ();
|
|
|
+ displayTimer.stop ();
|
|
|
|
|
|
- Serial.println ("WiFi MeteoConfig");
|
|
|
- Serial.println (WifiAccessPoint.getIP ());
|
|
|
+ Serial.println ("WiFi MeteoConfig");
|
|
|
+ Serial.println (WifiAccessPoint.getIP ());
|
|
|
|
|
|
- startWebServer ();
|
|
|
- WifiStation.waitConnection (connectOk); // Wait connection
|
|
|
+ startWebServer ();
|
|
|
+ WifiStation.waitConnection (connectOk); // Wait connection
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -289,7 +286,7 @@ connectFail ()
|
|
|
void
|
|
|
onNtpReceive (NtpClient& client, time_t timestamp)
|
|
|
{
|
|
|
- SystemClock.setTime (timestamp, eTZ_UTC);
|
|
|
- NTPLastUpdate = SystemClock.now ();
|
|
|
- Serial.println ("*** Time synchronized OK! ***"); // DEBUG
|
|
|
+ SystemClock.setTime (timestamp, eTZ_UTC);
|
|
|
+ NTPLastUpdate = SystemClock.now ();
|
|
|
+ Serial.println ("*** Time synchronized OK! ***"); // DEBUG
|
|
|
}
|