application.cpp 5.9 KB

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