Display.ino 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. #ifdef ENABLE_LCD_I2C
  2. // LCD
  3. unsigned char display_customCharSun[] = {B00100, B10001, B01110, B11111, B11111, B01110, B10001, B00100};
  4. //unsigned char display_customCharMoon[] = {B11000, B01110, B00110, B00111, B00111, B00110, B01110, B11000};
  5. unsigned char display_customCharMoon[] = {B00011, B01110, B01100, B11100, B11100, B01100, B01110, B00011};
  6. unsigned char display_customCharArrowRight[] = {B01000, B01100, B01110, B01111, B01110, B01100, B01000, B00000};
  7. unsigned char display_customCharDegC[] = {B01000, B10100, B01000, B00011, B00100, B00100, B00011, B00000};
  8. unsigned char display_customCharConn[] = {B00000, B00000, B11100, B00010, B11001, B00101, B10101, B00000};
  9. unsigned char display_customCharDisconn[] = {B10001, B01010, B00100, B01010, B10001, B00000, B10000, B00000};
  10. unsigned char display_customCharReduction2[] = {B00000, B11111, B01110, B00100, B00000, B11111, B01110, B00100}; //(2 arrows down)
  11. unsigned char display_customCharFlame[] = {B00100, B00100, B01010, B01010, B10101, B10101, B10101, B01110};
  12. unsigned char display_customCharLock[] = {B01110, B10001, B10001, B11111, B11011, B11011, B11111, B00000};
  13. unsigned char display_customCharPause[] = {B11011, B11011, B11011, B11011, B11011, B11011, B11011, B11011};
  14. unsigned long display_lastOnMillis = 0;
  15. void display_enable()
  16. {
  17. lcd.backlight();
  18. display_active = true;
  19. display_lastOnMillis = millis();
  20. }
  21. void display_disable()
  22. {
  23. lcd.noBacklight();
  24. display_active = false;
  25. }
  26. void display_extendTimeout() {
  27. display_lastOnMillis = millis();
  28. }
  29. void display_handleTimeout()
  30. {
  31. if (display_active && (millis() - display_lastOnMillis) > (confDisplay.displayTimeout * 1000)) {
  32. display_disable();
  33. }
  34. }
  35. void display_init()
  36. {
  37. lcd.init();
  38. lcd.createChar(0, display_customCharMoon);
  39. lcd.createChar(1, display_customCharSun);
  40. lcd.createChar(2, display_customCharArrowRight); // replaced by > char
  41. lcd.createChar(3, display_customCharDegC);
  42. lcd.createChar(4, display_customCharConn);
  43. lcd.createChar(5, display_customCharDisconn);
  44. lcd.createChar(6, display_customCharReduction2);
  45. lcd.createChar(7, display_customCharFlame);
  46. //lcd.createChar(7, display_customCharLock);
  47. // only 8 custom chars are possible :-/
  48. lcd.setCursor(0, 0);
  49. #ifdef FIRMWARE_VARIANT_THERMOSTAT
  50. lcd.print("WiFiThermostat ");
  51. #elif FIRMWARE_VARIANT_HEATCONTROL
  52. lcd.print("HeatControl ");
  53. #else
  54. lcd.print("ESPIoTBase ");
  55. #endif
  56. lcd.setCursor(0, 1);
  57. lcd.print("(c) by FloKra.at");
  58. // for ( int i = 0; i < 3; i++) {
  59. // lcd.backlight();
  60. // delay(200);
  61. // lcd.noBacklight();
  62. // delay(200);
  63. // }
  64. lcd.backlight();
  65. // delay(1000);
  66. /// lcd.clear();
  67. display_active = true;
  68. display_lastOnMillis = millis();
  69. }
  70. void display_showWifiConnected()
  71. {
  72. lcd.setCursor(0, 0);
  73. lcd.print("WIFI CONNECTED: ");
  74. lcd.setCursor(0, 1);
  75. lcd.print(" ");
  76. lcd.setCursor(0, 1);
  77. //lcd.print(WiFi.localIP());
  78. lcd.print(WiFi.SSID().c_str());
  79. lcd.backlight();
  80. display_active = true;
  81. display_lastOnMillis = millis();
  82. display_overrideInterval = 3;
  83. display_updateImmediately = false;
  84. }
  85. uint8_t display_nextMsgToShow = 0;
  86. void display_showNextMessageAfterTimeout() {
  87. if(display_nextMsgToShow == 1) {
  88. display_nextMsgToShow = 0;
  89. display_showAPModeActive();
  90. }
  91. }
  92. void display_showAPModeActive() {
  93. char _buf[17];
  94. lcd.setCursor(0, 0);
  95. lcd.print(" ");
  96. lcd.setCursor(0, 0);
  97. snprintf(_buf, 16, "AP: %s", persWM.getApSsid().c_str());
  98. lcd.print(_buf);
  99. lcd.setCursor(0, 1);
  100. lcd.print(" ");
  101. lcd.setCursor(0, 1);
  102. if(strlen(confSecrets.WiFiAPModePassword) > 0) {
  103. snprintf(_buf, 16, "PW: %s", confSecrets.WiFiAPModePassword);
  104. lcd.print(_buf);
  105. }
  106. else {
  107. lcd.print(" NO PASSWORD ");
  108. }
  109. display_active = true;
  110. display_lastOnMillis = millis();
  111. display_showFullscreenMsg = true;
  112. // set a message that will be displayed after this one
  113. //display_nextMsgToShow = 0;
  114. // reset countInterval and set new Timeout to 4 sec
  115. display_countInterval = 0;
  116. display_overrideInterval = 15;
  117. display_updateImmediately = false;
  118. }
  119. void display_showWifiConnectionError()
  120. {
  121. lcd.setCursor(0, 0);
  122. lcd.print("WIFI CONNECT ");
  123. lcd.setCursor(0, 1);
  124. lcd.print(" !!! FAILED !!! ");
  125. lcd.backlight();
  126. display_active = true;
  127. display_lastOnMillis = millis();
  128. display_showFullscreenMsg = true;
  129. // set a message that will be displayed after this one
  130. display_nextMsgToShow = 1;
  131. // reset countInterval and set new Timeout to 4 sec
  132. display_countInterval = 0;
  133. display_overrideInterval = 4;
  134. display_updateImmediately = false;
  135. //delay(2000);
  136. //
  137. //lcd.setCursor(0, 0);
  138. //lcd.print("AP MODE ACTIVE: ");
  139. //lcd.setCursor(0, 1);
  140. //lcd.print(" ");
  141. //lcd.setCursor(0, 1);
  142. //lcd.print(persWM.getApSsid());
  143. //lcd.backlight();
  144. //display_active = true;
  145. //display_lastOnMillis = millis();
  146. //delay(3000);
  147. //
  148. //lcd.setCursor(0, 0);
  149. //lcd.print("AP PASSWORD: ");
  150. //lcd.setCursor(0, 1);
  151. //lcd.print(" ");
  152. //lcd.setCursor(0, 1);
  153. //lcd.print(confSecrets.WiFiAPModePassword);
  154. //lcd.backlight();
  155. //display_active = true;
  156. //display_lastOnMillis = millis();
  157. //delay(7000);
  158. }
  159. void display_showMQTTConnected()
  160. {
  161. lcd.setCursor(0, 0);
  162. if(mqttclient.state() == 0) {
  163. lcd.print("MQTT CONNECTED: ");
  164. lcd.setCursor(0, 1);
  165. lcd.print(" ");
  166. lcd.setCursor(0, 1);
  167. lcd.print(confMqtt.mqtt_server);
  168. }
  169. else {
  170. lcd.print("MQTT: ");
  171. lcd.setCursor(0, 1);
  172. lcd.print("- DISCONNECTED -");
  173. }
  174. lcd.backlight();
  175. display_active = true;
  176. display_lastOnMillis = millis();
  177. display_showFullscreenMsg = true;
  178. display_countInterval = 0;
  179. display_overrideInterval = display_overlayMsgTimeout;
  180. }
  181. void display_showMQTTConnectionError() {
  182. lcd.setCursor(0, 0);
  183. lcd.print("MQTT CONNECTION ");
  184. lcd.setCursor(0, 1);
  185. lcd.print(" !!! FAILED !!! ");
  186. lcd.backlight();
  187. display_active = true;
  188. display_lastOnMillis = millis();
  189. display_showFullscreenMsg = true;
  190. display_countInterval = 0;
  191. display_overrideInterval = display_overlayMsgTimeout;
  192. }
  193. void display_showWifi() {
  194. if(WifiInApMode) {
  195. char _buf[17];
  196. lcd.setCursor(0, 0);
  197. lcd.print(" ");
  198. lcd.setCursor(0, 0);
  199. snprintf(_buf, 16, "AP: %s", persWM.getApSsid().c_str());
  200. lcd.print(_buf);
  201. lcd.setCursor(0, 1);
  202. lcd.print(" ");
  203. lcd.setCursor(0, 1);
  204. if(strlen(confSecrets.WiFiAPModePassword) > 0) {
  205. snprintf(_buf, 16, "PW: %s", confSecrets.WiFiAPModePassword);
  206. lcd.print(_buf);
  207. }
  208. else {
  209. lcd.print(" NO PASSWORD ");
  210. }
  211. lcd.print(_buf);
  212. }
  213. else {
  214. if( (strlen(confSecrets.WiFiPW1) > 3 && strlen(confDevWiFi.WiFiSSID1) > 2) || \
  215. (strlen(confSecrets.WiFiPW2) > 3 && strlen(confDevWiFi.WiFiSSID1) > 2) ) {
  216. lcd.setCursor(0, 0);
  217. if(WiFi.status() == WL_CONNECTED) {
  218. lcd.print("WIFI CONNECTED: ");
  219. }
  220. else {
  221. lcd.print("WIFI: ");
  222. }
  223. lcd.setCursor(0, 1);
  224. lcd.print(" ");
  225. lcd.setCursor(0, 1);
  226. if(WiFi.status() == WL_CONNECTED) {
  227. lcd.print(WiFi.SSID().c_str());
  228. }
  229. else {
  230. lcd.print("- DISCONNECTED -");
  231. }
  232. }
  233. else {
  234. lcd.setCursor(0, 0);
  235. lcd.print("WIFI: ");
  236. lcd.setCursor(0, 1);
  237. // (" ");
  238. lcd.print(" NOT CONFIGURED ");
  239. }
  240. }
  241. lcd.backlight();
  242. display_active = true;
  243. display_lastOnMillis = millis();
  244. display_showFullscreenMsg = true;
  245. display_countInterval = 0;
  246. display_overrideInterval = display_overlayMsgTimeout;
  247. }
  248. void display_showIP()
  249. {
  250. lcd.setCursor(0, 0);
  251. lcd.print("IP: ");
  252. lcd.setCursor(0, 1);
  253. lcd.print(" ");
  254. lcd.setCursor(0, 1);
  255. if(WifiInApMode) {
  256. lcd.print("192.168.4.1");
  257. }
  258. else {
  259. lcd.print(WiFi.localIP().toString().c_str());
  260. }
  261. lcd.backlight();
  262. display_active = true;
  263. display_lastOnMillis = millis();
  264. display_showFullscreenMsg = true;
  265. display_countInterval = 0;
  266. display_overrideInterval = display_overlayMsgTimeout;
  267. }
  268. void display_showHostname()
  269. {
  270. lcd.setCursor(0, 0);
  271. lcd.print("Hostname: ");
  272. lcd.setCursor(0, 1);
  273. lcd.print(" ");
  274. lcd.setCursor(0, 1);
  275. lcd.print(confDevWiFi.hostName);
  276. lcd.backlight();
  277. display_active = true;
  278. display_lastOnMillis = millis();
  279. display_showFullscreenMsg = true;
  280. display_countInterval = 0;
  281. display_overrideInterval = display_overlayMsgTimeout;
  282. }
  283. void display_showUptime()
  284. {
  285. lcd.setCursor(0, 0);
  286. lcd.print("System Uptime: ");
  287. lcd.setCursor(0, 1);
  288. lcd.print(" ");
  289. lcd.setCursor(0, 1);
  290. //lcd.print("1d 10h 45m ");
  291. lcd.print(getUptimeStr());
  292. lcd.backlight();
  293. display_active = true;
  294. display_lastOnMillis = millis();
  295. display_showFullscreenMsg = true;
  296. display_countInterval = 0;
  297. display_overrideInterval = display_overlayMsgTimeout;
  298. }
  299. #ifdef ENABLE_FEATURE_NTP_TIME
  300. void display_showDateTime()
  301. {
  302. lcd.setCursor(0, 0);
  303. lcd.print("Date/Time: ");
  304. lcd.setCursor(0, 1);
  305. lcd.print(" ");
  306. lcd.setCursor(0, 1);
  307. char _buf[17];
  308. updateTime();
  309. if(lt.tm_year > 70) {
  310. strftime(_buf, sizeof(_buf), "%H:%M %d.%m.%Y", &lt);
  311. lcd.print(_buf);
  312. }
  313. else {
  314. lcd.print("unavailable");
  315. }
  316. lcd.backlight();
  317. display_active = true;
  318. display_lastOnMillis = millis();
  319. display_showFullscreenMsg = true;
  320. display_countInterval = 0;
  321. display_overrideInterval = display_overlayMsgTimeout;
  322. }
  323. #endif // ENABLE_FEATURE_NTP_TIME
  324. void display_showRow2OverlayMessage(char *msg)
  325. {
  326. lcd.setCursor(0, 1);
  327. lcd.print(" ");
  328. lcd.setCursor(0, 1);
  329. lcd.write((uint8_t)2); // arrow right symbol
  330. lcd.print(" ");
  331. lcd.print(msg);
  332. for (int i = strlen(msg); i < 14; i++)
  333. {
  334. lcd.print(" ");
  335. }
  336. display_showRow2OverlayMsg = true;
  337. display_countInterval = 0;
  338. display_overrideInterval = display_overlayMsgTimeout;
  339. }
  340. void display_addConnectionIcon()
  341. {
  342. lcd.setCursor(14, 1);
  343. lcd.print(" ");
  344. if (mqtt_connected)
  345. lcd.write((uint8_t)4); // connected symbol
  346. else
  347. lcd.write((uint8_t)5); // disconnected symbol
  348. }
  349. uint8_t display_currentFullscreenMsg = 0;
  350. void display_toggleFullscreenMessage() {
  351. if(!display_showFullscreenMsg || display_currentFullscreenMsg == 0) {
  352. display_currentFullscreenMsg++;
  353. display_showWifi();
  354. sendLog(F("DISP: showWifi"));
  355. }
  356. else if(display_currentFullscreenMsg == 1) {
  357. display_currentFullscreenMsg++;
  358. display_showIP();
  359. sendLog(F("DISP: showIP"));
  360. }
  361. else if(display_currentFullscreenMsg == 2) {
  362. display_currentFullscreenMsg++;
  363. display_showHostname();
  364. sendLog(F("DISP: showHostname"));
  365. }
  366. else if(display_currentFullscreenMsg == 3) {
  367. display_currentFullscreenMsg++;
  368. display_showMQTTConnected();
  369. sendLog(F("DISP: showMQTT"));
  370. }
  371. else if(display_currentFullscreenMsg == 4) {
  372. display_currentFullscreenMsg++;
  373. display_showUptime();
  374. sendLog(F("DISP: showUptime"));
  375. }
  376. else if(display_currentFullscreenMsg == 5) {
  377. display_currentFullscreenMsg = 0;
  378. #ifdef ENABLE_FEATURE_NTP_TIME
  379. if (confTime.ntpEnable) {
  380. display_showDateTime();
  381. sendLog(F("DISP: showDateTime"));
  382. }
  383. #endif
  384. }
  385. else {
  386. sendLog(F("DISP: show???"));
  387. display_currentFullscreenMsg = 0;
  388. }
  389. }
  390. #ifdef DISPLAY_USE_MINIMAL_LAYOUT
  391. void display_update()
  392. {
  393. if (display_showFullscreenMsg)
  394. {
  395. if(display_nextMsgToShow > 0) {
  396. display_showNextMessageAfterTimeout();
  397. }
  398. else {
  399. display_showFullscreenMsg = false;
  400. //display_overrideInterval = confDisplay.displayInterval;
  401. display_overrideInterval = 0;
  402. display_updateImmediately = true;
  403. }
  404. }
  405. else
  406. {
  407. display_lastDisplayUpdate = millis();
  408. lcd.setCursor(0, 0);
  409. // LCD line 2
  410. // display target temperature to line 2, 8 chars length incl space at the end
  411. lcd.setCursor(0, 1);
  412. if (system_doRestart) { lcd.print("Restarting... "); }
  413. else if (system_pendingRestart)
  414. {
  415. lcd.print("Restart? ");
  416. }
  417. // Status Message in Display Row 2
  418. else if (display_showRow2OverlayMsg)
  419. {
  420. display_showRow2OverlayMsg = false;
  421. display_overrideInterval = confDisplay.displayInterval;
  422. display_updateImmediately = true;
  423. }
  424. else
  425. {
  426. display_addConnectionIcon();
  427. }
  428. }
  429. }
  430. #endif // DISPLAY_USE_MINIMAL_LAYOUT
  431. #endif // ENABLE_LCD_I2C