DIY fertilizer mixer and plant watering machine https://www.xythobuz.de/giessomat.html
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

WifiStuff.cpp 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. #include <Arduino.h>
  2. #ifdef PLATFORM_ESP
  3. #if defined(ARDUINO_ARCH_ESP8266)
  4. #include <ESP8266WiFi.h>
  5. #include <ESP8266WebServer.h>
  6. #include <ESP8266mDNS.h>
  7. #elif defined(ARDUINO_ARCH_ESP32)
  8. #include <WiFi.h>
  9. #include <WebServer.h>
  10. #include <ESPmDNS.h>
  11. #endif
  12. #include <WebSocketsServer.h>
  13. #include "wifi.h"
  14. #include "config.h"
  15. #include "config_pins.h"
  16. #include "Functionality.h"
  17. #include "SimpleUpdater.h"
  18. #include "WifiStuff.h"
  19. UPDATE_WEB_SERVER server(80);
  20. WebSocketsServer socket = WebSocketsServer(81);
  21. SimpleUpdater updater;
  22. unsigned long last_server_handle_time = 0;
  23. String message_buffer_a;
  24. String message_buffer_b;
  25. String message_buffer_c;
  26. String message_buffer_d;
  27. void wifi_set_message_buffer(String a, String b, String c, String d) {
  28. message_buffer_a = a;
  29. message_buffer_b = b;
  30. message_buffer_c = c;
  31. message_buffer_d = d;
  32. a.replace("\"", "'");
  33. b.replace("\"", "'");
  34. c.replace("\"", "'");
  35. d.replace("\"", "'");
  36. String ws = "{\n";
  37. ws += "\"a\": \"" + a + "\",\n";
  38. ws += "\"b\": \"" + b + "\",\n";
  39. ws += "\"c\": \"" + c + "\",\n";
  40. ws += "\"d\": \"" + d + "\",\n";
  41. ws += "\"state\": \"" + String(control_state_name()) + "\"\n";
  42. ws += "}";
  43. socket.broadcastTXT(ws);
  44. }
  45. void handleRoot() {
  46. String message = F("<!DOCTYPE html>\n");
  47. message += F("<html><head>\n");
  48. message += F("<meta charset='utf-8'/>\n");
  49. message += F("<meta name='viewport' content='width=device-width, initial-scale=1'/>\n");
  50. message += F("<title>Gieß-o-mat</title>\n");
  51. message += F("<style type='text/css'>\n");
  52. message += F(".container {\n");
  53. message += F("display: flex;\n");
  54. message += F("}\n");
  55. message += F(".ui {\n");
  56. message += F("width: max-content;\n");
  57. message += F("margin-right: 1em;\n");
  58. message += F("padding: 0 1.0em;\n");
  59. message += F("border: 1px dashed black;\n");
  60. message += F("}\n");
  61. message += F(".info {\n");
  62. message += F("flex-grow: 1;\n");
  63. message += F("}\n");
  64. message += F(".pad {\n");
  65. message += F("background: black;\n");
  66. message += F("border: 3px solid black;\n");
  67. message += F("width: max-content;\n");
  68. message += F("padding: 1.5em;\n");
  69. message += F("margin-left: auto;\n");
  70. message += F("margin-right: auto;\n");
  71. message += F("}\n");
  72. message += F(".pad input {\n");
  73. message += F("background: #fff0cf;\n");
  74. message += F("font-weight: bold;\n");
  75. message += F("font-family: monospace;\n");
  76. message += F("padding: 0.5em 1em;\n");
  77. message += F("margin: 0.5em;\n");
  78. message += F("}\n");
  79. // https://codepen.io/hawkz/pres/RpPaGK
  80. message += F(".lcd {\n");
  81. //message += F("background: #9ea18c;\n");
  82. message += F("background: #9ed18c;\n");
  83. message += F("border: 3px solid black;\n");
  84. message += F("width: max-content;\n");
  85. message += F("padding: 0.65em 1em;\n");
  86. message += F("box-shadow: inset 0 0 5px 5px rgba(0,0,0,.1);\n");
  87. message += F("font-weight: bold;\n");
  88. message += F("font-family: monospace;\n");
  89. message += F("letter-spacing: 0.1em;\n");
  90. message += F("font-size: 1.2em;\n");
  91. message += F("line-height: 160%;\n");
  92. message += F("color: #21230e;\n");
  93. message += F("text-shadow: -1px 2px 1px rgba(0,0,0,.1);\n");
  94. message += F("}\n");
  95. message += F("</style>\n");
  96. message += F("</head><body>\n");
  97. message += F("<h1>Gieß-o-mat</h1>\n");
  98. message += F("<div class='container'>\n");
  99. message += F("<div class='ui'>\n");
  100. message += F("<pre class='lcd'>\n");
  101. message += message_buffer_a + '\n';
  102. message += message_buffer_b + '\n';
  103. message += message_buffer_c + '\n';
  104. message += message_buffer_d + '\n';
  105. message += F("</pre>\n");
  106. message += F("<form class='pad'>\n");
  107. message += F("<input type='button' value='1'>");
  108. message += F("<input type='button' value='2'>");
  109. message += F("<input type='button' value='3'>");
  110. message += F("<br>\n");
  111. message += F("<input type='button' value='4'>");
  112. message += F("<input type='button' value='5'>");
  113. message += F("<input type='button' value='6'>");
  114. message += F("<br>\n");
  115. message += F("<input type='button' value='7'>");
  116. message += F("<input type='button' value='8'>");
  117. message += F("<input type='button' value='9'>");
  118. message += F("<br>\n");
  119. message += F("<input type='button' value='*'>");
  120. message += F("<input type='button' value='0'>");
  121. message += F("<input type='button' value='#'>");
  122. message += F("</form>\n");
  123. message += F("<p id='state'>\n");
  124. message += F("State: ");
  125. message += control_state_name();
  126. message += F("</p></div>\n");
  127. message += F("<div class='info'><p>\n");
  128. message += F("Version: ");
  129. message += FIRMWARE_VERSION;
  130. message += F("\n<br>\n");
  131. message += F("MAC: ");
  132. message += WiFi.macAddress();
  133. message += F("\n</p>\n");
  134. #if defined(ARDUINO_ARCH_ESP8266)
  135. message += F("\n<p>\n");
  136. message += F("Reset reason: ");
  137. message += ESP.getResetReason();
  138. message += F("\n<br>\n");
  139. message += F("Free heap: ");
  140. message += String(ESP.getFreeHeap());
  141. message += F(" (");
  142. message += String(ESP.getHeapFragmentation());
  143. message += F("% fragmentation)");
  144. message += F("\n<br>\n");
  145. message += F("Free sketch space: ");
  146. message += String(ESP.getFreeSketchSpace());
  147. message += F("\n<br>\n");
  148. message += F("Flash chip real size: ");
  149. message += String(ESP.getFlashChipRealSize());
  150. if (ESP.getFlashChipSize() != ESP.getFlashChipRealSize()) {
  151. message += F("\n<br>\n");
  152. message += F("WARNING: sdk chip size (");
  153. message += (ESP.getFlashChipSize());
  154. message += F(") does not match!");
  155. }
  156. message += F("\n</p>\n");
  157. #elif defined(ARDUINO_ARCH_ESP32)
  158. message += F("\n<p>\n");
  159. message += F("Free heap: ");
  160. message += String(ESP.getFreeHeap() / 1024.0);
  161. message += F("k\n<br>\n");
  162. message += F("Free sketch space: ");
  163. message += String(ESP.getFreeSketchSpace() / 1024.0);
  164. message += F("k\n<br>\n");
  165. message += F("Flash chip size: ");
  166. message += String(ESP.getFlashChipSize() / 1024.0);
  167. message += F("k\n</p>\n");
  168. #endif
  169. message += F("<p>\n");
  170. message += F("Try <a href='/update'>/update</a> for OTA firmware updates!\n");
  171. message += F("</p></div>\n");
  172. message += F("</div></body>\n");
  173. message += F("<script type='text/javascript'>\n");
  174. message += F("var socket = new WebSocket('ws://' + window.location.hostname + ':81');\n");
  175. message += F("socket.onmessage = function(e) {\n");
  176. message += F( "var msg = JSON.parse(e.data);\n");
  177. message += F( "var str = msg.a + '\\n' + msg.b + '\\n' + msg.c + '\\n' + msg.d;\n");
  178. message += F( "console.log(str);\n");
  179. message += F( "var lcd = document.getElementsByClassName('lcd');\n");
  180. message += F( "lcd[0].innerHTML = str;\n");
  181. message += F( "var state = document.getElementById('state');\n");
  182. message += F( "state.innerHTML = \"State: \" + msg.state;\n");
  183. message += F("};\n");
  184. message += F("var buttons = document.getElementsByTagName('input');\n");
  185. message += F("for (let i = 0; i < buttons.length; i++) {\n");
  186. message += F( "buttons[i].addEventListener('click', updateButton);\n");
  187. message += F("}\n");
  188. message += F("function updateButton() {\n");
  189. message += F( "socket.send(this.value);\n");
  190. message += F("}\n");
  191. message += F("</script>\n");
  192. message += F("</html>\n");
  193. server.send(200, "text/html", message);
  194. }
  195. void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) {
  196. if ((type != WStype_TEXT) || (length != 1)) {
  197. return;
  198. }
  199. char c = payload[0];
  200. if ((c >= '0') && (c <= '9')) {
  201. control_act_input(c - '0');
  202. } else if (c == '*') {
  203. control_act_input(-1);
  204. } else if (c == '#') {
  205. control_act_input(-2);
  206. }
  207. }
  208. void wifi_setup() {
  209. // Build hostname string
  210. String hostname = "giess-o-mat";
  211. #if defined(ARDUINO_ARCH_ESP8266)
  212. // Connect to WiFi AP
  213. Serial.println("WiFi: initializing");
  214. WiFi.hostname(hostname);
  215. WiFi.mode(WIFI_STA);
  216. Serial.print("WiFi: connecting");
  217. WiFi.begin(WIFI_SSID, WIFI_PW);
  218. while (WiFi.status() != WL_CONNECTED) {
  219. Serial.print(".");
  220. delay(LED_CONNECT_BLINK_INTERVAL);
  221. digitalWrite(BUILTIN_LED_PIN, !digitalRead(BUILTIN_LED_PIN));
  222. }
  223. Serial.println();
  224. #elif defined(ARDUINO_ARCH_ESP32)
  225. // Set hostname workaround
  226. Serial.println("WiFi: set hostname");
  227. WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
  228. WiFi.setHostname(hostname.c_str());
  229. // Workaround for WiFi connecting only every 2nd reset
  230. // https://github.com/espressif/arduino-esp32/issues/2501#issuecomment-513602522
  231. Serial.println("WiFi: connection work-around");
  232. WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) {
  233. if (info.disconnected.reason == 202) {
  234. esp_sleep_enable_timer_wakeup(10);
  235. esp_deep_sleep_start();
  236. delay(100);
  237. }
  238. }, WiFiEvent_t::SYSTEM_EVENT_STA_DISCONNECTED);
  239. // Connect to WiFi AP
  240. Serial.println("WiFi: SSID=" WIFI_SSID);
  241. Serial.print("WiFi: connecting");
  242. WiFi.mode(WIFI_STA);
  243. WiFi.begin(WIFI_SSID, WIFI_PW);
  244. while (WiFi.status() != WL_CONNECTED) {
  245. Serial.print(".");
  246. delay(LED_CONNECT_BLINK_INTERVAL);
  247. digitalWrite(BUILTIN_LED_PIN, !digitalRead(BUILTIN_LED_PIN));
  248. }
  249. Serial.println();
  250. // Set hostname workaround
  251. Serial.println("WiFi: set hostname work-around");
  252. WiFi.setHostname(hostname.c_str());
  253. #endif
  254. // Setup HTTP Server
  255. Serial.println("WiFi: initializing HTTP server");
  256. MDNS.begin(hostname.c_str());
  257. updater.setup(&server);
  258. server.on("/", handleRoot);
  259. server.begin();
  260. MDNS.addService("http", "tcp", 80);
  261. socket.begin();
  262. socket.onEvent(webSocketEvent);
  263. Serial.println("WiFi: setup done");
  264. }
  265. void wifi_run() {
  266. if ((millis() - last_server_handle_time) >= SERVER_HANDLE_INTERVAL) {
  267. last_server_handle_time = millis();
  268. server.handleClient();
  269. socket.loop();
  270. #ifdef ARDUINO_ARCH_ESP8266
  271. MDNS.update();
  272. #endif // ARDUINO_ARCH_ESP8266
  273. }
  274. // reset ESP every 6h to be safe
  275. if (millis() >= (6 * 60 * 60 * 1000)) {
  276. ESP.restart();
  277. }
  278. }
  279. #endif // PLATFORM_ESP