application.cpp 8.7 KB

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