application.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #include <user_config.h>
  2. #include <SmingCore/SmingCore.h>
  3. #include <Libraries/DHT/DHT.h>
  4. ///////////////////////////////////////////////////////////////////
  5. // Set your SSID & Pass for initial configuration
  6. #include "../include/configuration.h" // application configuration
  7. ///////////////////////////////////////////////////////////////////
  8. #include "max7219.h"
  9. #include "webserver.h"
  10. DHT dht(DHT_PIN, DHT22);
  11. Timer procTimer, procRTimer;
  12. Timer displayTimer;
  13. // Sensors values
  14. float SensorT, SensorH, SensorHI, SensorCR;
  15. String StrCF;
  16. // Time values
  17. time_t Time, NTPLastUpdate;
  18. void process();
  19. void connectOk();
  20. void connectFail();
  21. void showTime();
  22. // NTP Client
  23. void onNtpReceive(NtpClient& client, time_t timestamp);
  24. NtpClient ntpClient ("ntps1-0.cs.tu-berlin.de", 300, onNtpReceive);
  25. void init()
  26. {
  27. spiffs_mount(); // Mount file system, in order to work with files
  28. Serial.begin(SERIAL_BAUD_RATE); // 115200 by default
  29. Serial.systemDebugOutput(false); // Debug output to serial
  30. Serial.println("Wall Segment Clock");
  31. ActiveConfig = loadConfig();
  32. //wait for sensor startup
  33. delay(1000);
  34. // DHT sensor start
  35. dht.begin();
  36. // 7-segment output
  37. MAX7219_Init();
  38. // set timezone hourly difference to UTC
  39. SystemClock.setTimeZone(ActiveConfig.AddTZ);
  40. WifiStation.config(ActiveConfig.NetworkSSID, ActiveConfig.NetworkPassword);
  41. WifiStation.enable(true);
  42. WifiAccessPoint.enable(false);
  43. WifiStation.waitConnection(connectOk, 20, connectFail); // We recommend 20+ seconds for connection timeout at start
  44. // раз в минуту?
  45. procTimer.initializeMs(60000, process).start();
  46. process();
  47. // обновление экрана два раза в секунду
  48. displayTimer.initializeMs(500, showTime).start();
  49. }
  50. void showTime()
  51. {
  52. static int8_t oldHour, oldMinute;
  53. static time_t oldTime;
  54. DateTime dt;
  55. Time = SystemClock.now();
  56. dt.setTime(Time);
  57. /*
  58. * теперь в dt у нас следующее:
  59. * int8_t Hour;
  60. * int8_t Minute;
  61. * int8_t Second;
  62. * int16_t Milliseconds;
  63. * int8_t Day;
  64. * int8_t DayofWeek; -- Sunday is day 0
  65. * int8_t Month; // Jan is month 0
  66. * int16_t Year; // Full Year numer
  67. */
  68. int8_t si = dt.Second / 5;
  69. if (oldTime != Time)
  70. {
  71. oldTime = Time;
  72. switch (si)
  73. {
  74. case 0:
  75. case 2:
  76. case 4:
  77. case 6:
  78. case 8:
  79. case 10:
  80. MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorT)/10);
  81. MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorT)%10);
  82. MAX7219_writeData(MAX7219_DIGIT7, SYM_Temp);
  83. break;
  84. case 1:
  85. case 3:
  86. case 7:
  87. case 9:
  88. MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorH)/10);
  89. MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorH)%10);
  90. MAX7219_writeData(MAX7219_DIGIT7, SYM_H);
  91. break;
  92. case 5:
  93. case 11:
  94. MAX7219_writeData(MAX7219_DIGIT5, SYM_BLANK);
  95. MAX7219_writeData(MAX7219_DIGIT6, dt.DayofWeek/10);
  96. MAX7219_writeData(MAX7219_DIGIT7, dt.DayofWeek%10);
  97. break;
  98. }
  99. if (oldMinute != dt.Minute)
  100. {
  101. oldMinute = dt.Minute;
  102. if (oldHour != dt.Hour)
  103. {
  104. oldHour = dt.Hour;
  105. }
  106. }
  107. if (si != 5 || si != 11)
  108. {
  109. MAX7219_writeData(MAX7219_DIGIT0, dt.Hour/10);
  110. MAX7219_writeData(MAX7219_DIGIT1, dt.Hour%10);
  111. MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus);
  112. MAX7219_writeData(MAX7219_DIGIT3, dt.Minute/10);
  113. MAX7219_writeData(MAX7219_DIGIT4, dt.Minute%10);
  114. }
  115. else if (si == 5 || si == 11)
  116. {
  117. MAX7219_writeData(MAX7219_DIGIT0, dt.Day/10);
  118. MAX7219_writeData(MAX7219_DIGIT1, dt.Day%10);
  119. MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus);
  120. MAX7219_writeData(MAX7219_DIGIT3, dt.Month/10);
  121. MAX7219_writeData(MAX7219_DIGIT4, dt.Month%10);
  122. }
  123. }
  124. else // time the same, output blank for "hh mm"
  125. {
  126. if (si != 5 || si != 11)
  127. {
  128. MAX7219_writeData(MAX7219_DIGIT2, SYM_BLANK);
  129. }
  130. }
  131. }
  132. /*
  133. * Читаем данные с DHT22, в случае неудачи -- данные остануться старыми.
  134. * меня это полностью устраивает.
  135. */
  136. void process()
  137. {
  138. TempAndHumidity th;
  139. ComfortState cf;
  140. static int8_t status;
  141. if(dht.readTempAndHumidity(th))
  142. {
  143. status = 0;
  144. SensorT = th.temp;
  145. SensorH = th.humid;
  146. SensorHI = dht.getHeatIndex();
  147. SensorCR = dht.getComfortRatio(cf);
  148. switch(cf)
  149. {
  150. case Comfort_OK:
  151. StrCF = "OK";
  152. break;
  153. case Comfort_TooHot:
  154. StrCF = "Too Hot";
  155. break;
  156. case Comfort_TooCold:
  157. StrCF = "Too Cold";
  158. break;
  159. case Comfort_TooDry:
  160. StrCF = "Too Dry";
  161. break;
  162. case Comfort_TooHumid:
  163. StrCF = "Too Humid";
  164. break;
  165. case Comfort_HotAndHumid:
  166. StrCF = "Hot And Humid";
  167. break;
  168. case Comfort_HotAndDry:
  169. StrCF = "Hot And Dry";
  170. break;
  171. case Comfort_ColdAndHumid:
  172. StrCF = "Cold And Humid";
  173. break;
  174. case Comfort_ColdAndDry:
  175. StrCF = "Cold And Dry";
  176. break;
  177. default:
  178. StrCF = "Unknown";
  179. break;
  180. }
  181. }
  182. else
  183. {
  184. /*
  185. * В случае, если от датчика ничего не получили, запустим повторный опрос через
  186. * 10 секунд, но не более 5 раз подряд.
  187. */
  188. if (status < 6)
  189. {
  190. status ++;
  191. procRTimer.initializeMs(10000, process).startOnce();
  192. }
  193. }
  194. }
  195. void connectOk()
  196. {
  197. WifiAccessPoint.enable(false);
  198. Serial.print("I'm connecteed. IP: ");
  199. Serial.println(WifiStation.getIP().toString());
  200. startWebServer();
  201. }
  202. /*
  203. * в случае неудачи подключения поднимаем точку доступа без авторизации
  204. */
  205. void connectFail()
  206. {
  207. WifiAccessPoint.config("MeteoConfig", "", AUTH_OPEN);
  208. WifiAccessPoint.enable(true);
  209. // Stop main screen output
  210. procTimer.stop();
  211. displayTimer.stop();
  212. Serial.println("WiFi MeteoConfig");
  213. Serial.println(WifiAccessPoint.getIP());
  214. startWebServer();
  215. WifiStation.waitConnection(connectOk); // Wait connection
  216. }
  217. /*
  218. * NTP Client
  219. */
  220. void onNtpReceive(NtpClient& client, time_t timestamp) {
  221. SystemClock.setTime(timestamp, eTZ_UTC);
  222. NTPLastUpdate = SystemClock.now();
  223. Serial.println("*** Time synchronized OK! ***"); // DEBUG
  224. }