Help understanding why websockets does not work in arduino sketch
-
have taken som existing code which reads a sensor and outputs to a webserver using websockets (running on an ESP8266) that connects to a wifi-network. I tried to modify the code so that instead of connecting to an existing wifi it creates a AP that I can connect to login to the webserver to show the data.
I can connect to the AP and also connect to the webserver after logging in to the AP. But ít only shows a empty table. If I look at the serial monitor the sensor outputs all data correctly.
Have I done anything wrong modifying the code?
// ESP8266 Pins // 4(SDA) --- AMG8833 SDA // 5(SCL) --- AMG8833 SCL // 13 --- LED (Anode) via 100ohm #include <pgmspace.h> #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <WebSocketsServer.h> #include <ESP8266mDNS.h> #include <ArduinoOTA.h> #include <Wire.h> #include <Adafruit_AMG88xx.h> Adafruit_AMG88xx amg; const char* ssid = "Jacksson"; const char* password = "mandelvatten"; const int pin_led = 13; ESP8266WebServer server(80); WebSocketsServer webSocket(81); void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { switch (type) { case WStype_DISCONNECTED: Serial.printf("[%u] Disconnected!\n", num); break; case WStype_CONNECTED: IPAddress ip = webSocket.remoteIP(num); Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); break; } } void toggle() { static bool last_led = false; last_led = !last_led; digitalWrite(pin_led, last_led); } void handleRoot() { auto ip = WiFi.localIP(); String ip_str = String(ip[0]) + "." + ip[1] + "." + ip[2] + "." + ip[3]; server.send(200, "text/html", String(ws_html_1()) + ip_str + ws_html_2()); // server.send(200, "text/html", "<h1>You are connected</h1>"); } void handleNotFound() { String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET)?"GET":"POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i = 0; i<server.args(); i++){ message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); } void WiFiEvent(WiFiEvent_t event) { switch(event) { case WIFI_EVENT_STAMODE_DISCONNECTED: digitalWrite(pin_led, LOW); Serial.println("WiFi lost connection: reconnecting..."); WiFi.begin(); break; case WIFI_EVENT_STAMODE_CONNECTED: Serial.print("Connected to "); Serial.println(ssid); break; case WIFI_EVENT_STAMODE_GOT_IP: digitalWrite(pin_led, HIGH); Serial.print("IP address: "); Serial.println(WiFi.localIP()); if (MDNS.begin("esp8266-amg8833")) { Serial.println("MDNS responder started"); } enableOTA(); break; } } void enableOTA() { // Port defaults to 8266 // ArduinoOTA.setPort(8266); // Hostname defaults to esp8266-[ChipID] // ArduinoOTA.setHostname("myesp8266"); // No authentication by default // ArduinoOTA.setPassword((const char *)"123"); ArduinoOTA.onStart([]() { Serial.println("Start"); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); } void setup(void) { delay(1000); Serial.begin(115200); Serial.println(); Serial.print("Configuring access point..."); /* You can remove the password parameter if you want the AP to be open. */ WiFi.softAP(ssid, password); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); server.on("/", handleRoot); server.begin(); Serial.println("HTTP server started"); server.on("/current", [](){ String str; server.send(200, "text/plain", get_current_values_str(str)); }); server.onNotFound(handleNotFound); server.begin(); webSocket.begin(); webSocket.onEvent(webSocketEvent); Serial.println("HTTP server started"); amg.begin(0x69); delay(100); // let sensor boot up } void loop(void) { ArduinoOTA.handle(); server.handleClient(); webSocket.loop(); static unsigned long last_read_ms = millis(); unsigned long now = millis(); if (now - last_read_ms > 100) { last_read_ms += 100; String str; get_current_values_str(str); Serial.println(str); webSocket.broadcastTXT(str); } } String& get_current_values_str(String& ret) { float pixels[AMG88xx_PIXEL_ARRAY_SIZE]; amg.readPixels(pixels); ret = "["; for(int i = 0; i < AMG88xx_PIXEL_ARRAY_SIZE; i++) { if( i % 8 == 0 ) ret += "\r\n"; ret += pixels[i]; if (i != AMG88xx_PIXEL_ARRAY_SIZE - 1) ret += ", "; } ret += "\r\n]\r\n"; return ret; } const __FlashStringHelper* ws_html_1() { return F("<!DOCTYPE html>\n" "<html>\n" "<head>\n" "<title>thermo</title>\n" "<style>\n" "body {\n" " background-color: #667;\n" "}\n" "table#tbl td {\n" " width: 64px;\n" " height: 64px;\n" " border: solid 1px grey;\n" " text-align: center;\n" "}\n" "</style>\n" "</head>\n" "<body>\n" "<h1>Exjobbsgrejs</h1>" "<table border id=\"tbl\"></table>\n" "<script>\n" "function bgcolor(t) {\n" " if (t < 0) t = 0;\n" " if (t > 30) t = 30;\n" " return \"hsl(\" + (360 - t * 12) + \", 100%, 80%)\";\n" "}\n" "\n" "var t = document.getElementById('tbl');\n" "var tds = [];\n" "for (var i = 0; i < 8; i++) {\n" " var tr = document.createElement('tr');\n" " for (var j = 0; j < 8; j++) {\n" " var td = tds[i*8 + 7 - j] = document.createElement('td');\n" " tr.appendChild(td);\n" " }\n" " t.appendChild(tr);\n" "}\n" "var connection = new WebSocket('ws://"); } const __FlashStringHelper* ws_html_2() { return F(":81/');\n" "connection.onmessage = function(e) {\n" " const data = JSON.parse(e.data);\n" " for (var i = 0; i < 64; i++) {\n" " tds[i].innerHTML = data[i].toFixed(2);\n" " tds[i].style.backgroundColor = bgcolor(data[i]);\n" " }\n" "};\n" "</script>\n" "</body>\n" "</html>\n"); }
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login