application.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  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. Timer showHighTimer, showLowTimer;
  14. Timer brightTimer;
  15. // Sensors values
  16. float SensorT, SensorH, SensorHI, SensorCR;
  17. String StrCF;
  18. // Time values
  19. time_t Time, NTPLastUpdate;
  20. DateTime dt;
  21. void process(void);
  22. void connectOk(void);
  23. void connectFail(void);
  24. void showWatch(void);
  25. void showTime(void);
  26. void showTemperature(void);
  27. void showHumidity(void);
  28. void setBright(void);
  29. // NTP Client
  30. void
  31. onNtpReceive(NtpClient& client, time_t timestamp);
  32. NtpClient ntpClient("ntps1-0.cs.tu-berlin.de", 300, onNtpReceive);
  33. void init()
  34. {
  35. spiffs_mount(); // Mount file system, in order to work with files
  36. Serial.begin(SERIAL_BAUD_RATE); // 115200 by default
  37. Serial.systemDebugOutput(false); // Debug output to serial
  38. Serial.println("Wall Segment Clock");
  39. ActiveConfig = loadConfig();
  40. // set timezone hourly difference to UTC
  41. SystemClock.setTimeZone(ActiveConfig.AddTZ);
  42. WifiStation.config(ActiveConfig.NetworkSSID, ActiveConfig.NetworkPassword);
  43. WifiStation.enable(true);
  44. WifiAccessPoint.enable(false);
  45. WifiStation.waitConnection(connectOk, 20, connectFail); // We recommend 20+ seconds for connection timeout at start
  46. // DHT sensor start
  47. dht.begin();
  48. // опрос датчиков -- раз в минуту?
  49. procTimer.initializeMs(60000, process).start();
  50. process();
  51. // 7-segment output
  52. MAX7219_Init();
  53. tmpTimer.initializeMs(10, MAX7219_FillMinus).startOnce();
  54. brightTimer.initializeMs(1000, setBright).start();
  55. // обновление экрана два раза в секунду
  56. displayTimer.initializeMs(500, showWatch).start();
  57. }
  58. void showWatch()
  59. {
  60. static uint8_t oldHour, oldMinute, old_si;
  61. static time_t oldTime;
  62. Time = SystemClock.now();
  63. dt.setTime(Time);
  64. /*
  65. * теперь в dt у нас следующее:
  66. * int8_t Hour;
  67. * int8_t Minute;
  68. * int8_t Second;
  69. * int16_t Milliseconds;
  70. * int8_t Day;
  71. * int8_t DayofWeek; -- Sunday is day 0
  72. * int8_t Month; // Jan is month 0
  73. * int16_t Year; // Full Year numer
  74. */
  75. uint8_t si = dt.Second / 5;
  76. /*
  77. * 0 - Temp
  78. * 1 - Humidity
  79. * 2 - Temp
  80. * 3 - Humidity
  81. * 4 - Temp
  82. * 5 - Humidity
  83. * 6 - Temp
  84. * 7 - Humidity
  85. * 8 - Temp
  86. * 9 - Humidity
  87. * 10 - Temp
  88. * 11 - Humidity
  89. */
  90. if (oldTime == Time)
  91. {
  92. // Старая секунда
  93. // time the same, output blank for [HH MM]
  94. MAX7219_writeData(MAX7219_DIGIT2, SYM_BLANK);
  95. /*
  96. if (si != 5 || si != 11)
  97. {
  98. MAX7219_writeData(MAX7219_DIGIT2, SYM_BLANK);
  99. }
  100. */
  101. }
  102. else
  103. {
  104. // Новая секунда
  105. oldTime = Time;
  106. // Обновление индикаторов
  107. if (oldMinute != dt.Minute)
  108. {
  109. oldMinute = dt.Minute;
  110. MAX7219_writeData(MAX7219_DIGIT3, dt.Minute / 10);
  111. MAX7219_writeData(MAX7219_DIGIT4, dt.Minute % 10);
  112. if (oldHour != dt.Hour)
  113. {
  114. oldHour = dt.Hour;
  115. MAX7219_writeData(MAX7219_DIGIT0, dt.Hour / 10);
  116. MAX7219_writeData(MAX7219_DIGIT1, dt.Hour % 10);
  117. }
  118. }
  119. switch(dt.Second / 15)
  120. {
  121. case 0:
  122. MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus);
  123. break;
  124. case 1:
  125. MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus2L);
  126. break;
  127. case 2:
  128. MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus2H);
  129. break;
  130. case 3:
  131. MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus3);
  132. break;
  133. }
  134. if (old_si != si)
  135. {
  136. old_si = si;
  137. switch (si)
  138. {
  139. case 0:
  140. showLowTimer.initializeMs(10, showTemperature).startOnce();
  141. break;
  142. case 1:
  143. showLowTimer.initializeMs(10, showHumidity).startOnce();
  144. break;
  145. case 2:
  146. showLowTimer.initializeMs(10, showTemperature).startOnce();
  147. break;
  148. case 3:
  149. showLowTimer.initializeMs(10, showHumidity).startOnce();
  150. break;
  151. case 4:
  152. showLowTimer.initializeMs(10, showTemperature).startOnce();
  153. break;
  154. case 5:
  155. showLowTimer.initializeMs(10, showHumidity).startOnce();
  156. break;
  157. case 6:
  158. showLowTimer.initializeMs(10, showTemperature).startOnce();
  159. break;
  160. case 7:
  161. showLowTimer.initializeMs(10, showHumidity).startOnce();
  162. break;
  163. case 8:
  164. showLowTimer.initializeMs(10, showTemperature).startOnce();
  165. break;
  166. case 9:
  167. showLowTimer.initializeMs(10, showHumidity).startOnce();
  168. break;
  169. case 10:
  170. showLowTimer.initializeMs(10, showTemperature).startOnce();
  171. break;
  172. case 11:
  173. showLowTimer.initializeMs(10, showHumidity).startOnce();
  174. break;
  175. }
  176. }
  177. }
  178. }
  179. /*
  180. * Выводим текущее время [HH MM] на верхние индикаторы
  181. */
  182. void showTime(void)
  183. {
  184. // уберём ведущий ноль у часов
  185. if (dt.Hour >= 9)
  186. {
  187. MAX7219_writeData(MAX7219_DIGIT0, dt.Hour / 10);
  188. }
  189. else
  190. {
  191. MAX7219_writeData(MAX7219_DIGIT0, MAX7219_CHAR_BLANK);
  192. }
  193. MAX7219_writeData(MAX7219_DIGIT1, dt.Hour % 10);
  194. MAX7219_writeData(MAX7219_DIGIT3, dt.Minute / 10);
  195. MAX7219_writeData(MAX7219_DIGIT4, dt.Minute % 10);
  196. }
  197. /*
  198. * Выводим температуру на нижние индикаторы
  199. */
  200. void showTemperature(void)
  201. {
  202. MAX7219_writeData(MAX7219_DIGIT5, SYM_Temp);
  203. MAX7219_writeData(MAX7219_DIGIT6, (int) (SensorT) / 10);
  204. MAX7219_writeData(MAX7219_DIGIT7, (int) (SensorT) % 10);
  205. }
  206. /*
  207. * Выводим влажность на нижние индикаторы
  208. */
  209. void showHumidity(void)
  210. {
  211. MAX7219_writeData(MAX7219_DIGIT5, SYM_H_SM);
  212. MAX7219_writeData(MAX7219_DIGIT6, (int) (SensorH) / 10);
  213. MAX7219_writeData(MAX7219_DIGIT7, (int) (SensorH) % 10);
  214. }
  215. /*
  216. * Выводим дату на верхние индикаторы [DD MM]
  217. */
  218. /*
  219. void showDate(void)
  220. {
  221. MAX7219_writeData(MAX7219_DIGIT0, dt.Day/10);
  222. MAX7219_writeData(MAX7219_DIGIT1, dt.Day%10);
  223. MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus);
  224. MAX7219_writeData(MAX7219_DIGIT3, dt.Month/10);
  225. MAX7219_writeData(MAX7219_DIGIT4, dt.Month%10);
  226. MAX7219_writeData(MAX7219_DIGIT6, (uint8_t)(dt.DayofWeek / 10));
  227. MAX7219_writeData(MAX7219_DIGIT7, (uint8_t)(dt.DayofWeek % 10));
  228. }
  229. */
  230. /*
  231. * Автоматическая регулировка яркости индикаторов
  232. */
  233. void setBright(void)
  234. {
  235. // приведём к диапазону 0-16
  236. uint8_t bright = (1024 - system_adc_read()) >> 6;
  237. // растянем диапазон значений 10-16
  238. if (bright > 14)
  239. {
  240. bright = 14;
  241. }
  242. if (bright >= 7)
  243. {
  244. bright = ( (bright - 7) * 2 ) + 1;
  245. }
  246. else
  247. {
  248. bright = 1;
  249. }
  250. /*
  251. if (bright < 1) { bright = 1; }
  252. if (bright > 15) { bright = 15; }
  253. */
  254. MAX7219_writeData(MAX7219_MODE_INTENSITY, bright);
  255. }
  256. /*
  257. * Читаем данные с DHT22, в случае неудачи -- данные остануться старыми.
  258. * меня это полностью устраивает.
  259. */
  260. void process()
  261. {
  262. TempAndHumidity th;
  263. ComfortState cf;
  264. static int8_t status;
  265. if (dht.readTempAndHumidity(th))
  266. {
  267. status = 0;
  268. SensorT = th.temp;
  269. SensorH = th.humid;
  270. SensorHI = dht.getHeatIndex();
  271. SensorCR = dht.getComfortRatio(cf);
  272. switch (cf)
  273. {
  274. case Comfort_OK:
  275. StrCF = "OK";
  276. break;
  277. case Comfort_TooHot:
  278. StrCF = "Too Hot";
  279. break;
  280. case Comfort_TooCold:
  281. StrCF = "Too Cold";
  282. break;
  283. case Comfort_TooDry:
  284. StrCF = "Too Dry";
  285. break;
  286. case Comfort_TooHumid:
  287. StrCF = "Too Humid";
  288. break;
  289. case Comfort_HotAndHumid:
  290. StrCF = "Hot And Humid";
  291. break;
  292. case Comfort_HotAndDry:
  293. StrCF = "Hot And Dry";
  294. break;
  295. case Comfort_ColdAndHumid:
  296. StrCF = "Cold And Humid";
  297. break;
  298. case Comfort_ColdAndDry:
  299. StrCF = "Cold And Dry";
  300. break;
  301. default:
  302. StrCF = "Unknown";
  303. break;
  304. }
  305. }
  306. else
  307. {
  308. /*
  309. * В случае, если от датчика ничего не получили, запустим повторный опрос через
  310. * 10 секунд, но не более 5 раз подряд.
  311. */
  312. if (status < 6)
  313. {
  314. status++;
  315. procRTimer.initializeMs(10000, process).startOnce();
  316. }
  317. }
  318. }
  319. void connectOk()
  320. {
  321. WifiAccessPoint.enable(false);
  322. Serial.print("I'm connecteed. IP: ");
  323. Serial.println(WifiStation.getIP().toString());
  324. startWebServer();
  325. }
  326. /*
  327. * в случае неудачи подключения поднимаем точку доступа без авторизации
  328. */
  329. void connectFail()
  330. {
  331. WifiAccessPoint.config("MeteoConfig", "", AUTH_OPEN);
  332. WifiAccessPoint.enable(true);
  333. // Stop main screen output
  334. procTimer.stop();
  335. displayTimer.stop();
  336. Serial.println("WiFi MeteoConfig");
  337. Serial.println(WifiAccessPoint.getIP());
  338. startWebServer();
  339. WifiStation.waitConnection(connectOk); // Wait connection
  340. }
  341. /*
  342. * NTP Client
  343. */
  344. void onNtpReceive(NtpClient& client, time_t timestamp)
  345. {
  346. SystemClock.setTime(timestamp, eTZ_UTC);
  347. NTPLastUpdate = SystemClock.now();
  348. Serial.println("*** Time synchronized OK! ***"); // DEBUG
  349. }