application.cpp 8.2 KB

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