ESP32 WebSockets code repeats continuously
Posted: Sun Dec 11, 2022 5:00 am
Hello All
I have created a Gate Lock Device using ESP32 WebSockets Wifi Mode. On pressing button, ESP32 sends a serial command to Arduino mini and then Arduino mini operates the Output Relay.
Anytime i turn on the device, it is ok but as the button is pressed, it keeps on sending same command again and again (in a loop) and then the server gets stuck. Please advice the solution.
CODE ATTACHED
I have created a Gate Lock Device using ESP32 WebSockets Wifi Mode. On pressing button, ESP32 sends a serial command to Arduino mini and then Arduino mini operates the Output Relay.
Anytime i turn on the device, it is ok but as the button is pressed, it keeps on sending same command again and again (in a loop) and then the server gets stuck. Please advice the solution.
CODE ATTACHED
- // Import required libraries
- #include <WiFi.h>
- #include <AsyncTCP.h>
- #include <ESPAsyncWebServer.h>
- // Replace with your network credentials
- const char* ssid = "wifi"; // hidden intentionally
- const char* password = "password"; // hidden intentionally
- bool ledState = 0;
- const int ledPin = 2;
- // Create AsyncWebServer object on port 80
- AsyncWebServer server(80);
- AsyncWebSocket ws("/ws");
- const char index_html[] PROGMEM = R"rawliteral(
- <!DOCTYPE HTML><html>
- <head>
- <title>Gate Lock Interface</title>
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="icon" href="data:,">
- <style>
- html {
- font-family: Arial, Helvetica, sans-serif;
- text-align: center;
- }
- h1 {
- font-size: 1.8rem;
- color: white;
- }
- h2{
- font-size: 1.5rem;
- font-weight: bold;
- color: #143642;
- }
- .topnav {
- overflow: hidden;
- background-color: #143642;
- }
- body {
- margin: 0;
- }
- .content {
- padding: 30px;
- max-width: 600px;
- margin: 0 auto;
- }
- .card {
- background-color: #F8F7F9;;
- box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5);
- padding-top:10px;
- padding-bottom:20px;
- }
- .button {
- padding: 15px 50px;
- font-size: 24px;
- text-align: center;
- outline: none;
- color: #fff;
- background-color: #0f8b8d;
- border: none;
- border-radius: 5px;
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0,0,0,0);
- }
- /*.button:hover {background-color: #0f8b8d}*/
- .button:active {
- background-color: #0f8b8d;
- box-shadow: 2 2px #CDCDCD;
- transform: translateY(2px);
- }
- .state {
- font-size: 1.5rem;
- color:#8c8c8c;
- font-weight: bold;
- }
- </style>
- <title>Gate Lock Interface</title>
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="icon" href="data:,">
- </head>
- <body>
- <div class="topnav">
- <h1>ESP GATE LOCK INTERFACE</h1>
- </div>
- <div class="content">
- <div class="card">
- <h2>Push the Button</h2>
- <p class="state">state: <span id="state">%STATE%</span></p>
- <p><button id="button" class="button">Press</button></p>
- </div>
- </div>
- <script>
- var gateway = `ws://${window.location.hostname}/ws`;
- var websocket;
- window.addEventListener('load', onLoad);
- function initWebSocket() {
- console.log('Trying to open a WebSocket connection...');
- websocket = new WebSocket(gateway);
- websocket.onopen = onOpen;
- websocket.onclose = onClose;
- websocket.onmessage = onMessage; // <-- add this line
- }
- function onOpen(event) {
- console.log('Connection opened');
- }
- function onClose(event) {
- console.log('Connection closed');
- setTimeout(initWebSocket, 2000);
- }
- ////////////////////////////////////////////////// ------ LED STATE STRING UPDATE ON WEBPAGE --------- /////////////////////////////////////////////////////////
- function onMessage(event) {
- var state;
- if (event.data == "1"){
- state = "ON";
- }
- else{
- state = "OFF";
- }
- document.getElementById('state').innerHTML = state;
- }
- function onLoad(event) {
- initWebSocket();
- initButton();
- }
- ///////////////////////////////////////////////----------- BUTTON CLICK ---------//////////////////////////////////////////////////////////////////////////////
- function initButton() {
- document.getElementById('button').addEventListener('click', toggle);
- }
- function toggle(){
- websocket.send('toggle');
- }
- </script>
- </body>
- </html>
- )rawliteral";
- //////////////////////////////////////////// --- NOTIFY CLIIENTS ------ //////////////////////////////////////////////////////////////////////////////////////
- void notifyClients() {
- ws.textAll(String(ledState));
- }
- void handleWebSocketMessage(void *arg, uint8_t *data, size_t len) {
- AwsFrameInfo *info = (AwsFrameInfo*)arg;
- if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) {
- data[len] = 0;
- if (strcmp((char*)data, "toggle") == 0) {
- ledState = !ledState;
- Serial.write('A');
- notifyClients();
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type,
- void *arg, uint8_t *data, size_t len) {
- switch (type) {
- case WS_EVT_CONNECT:
- Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str());
- break;
- case WS_EVT_DISCONNECT:
- Serial.printf("WebSocket client #%u disconnected\n", client->id());
- break;
- case WS_EVT_DATA:
- handleWebSocketMessage(arg, data, len);
- break;
- case WS_EVT_PONG:
- case WS_EVT_ERROR:
- break;
- }
- }
- void initWebSocket() {
- ws.onEvent(onEvent);
- server.addHandler(&ws);
- }
- String processor(const String& var){
- Serial.println(var);
- if(var == "STATE"){
- if (ledState){
- return "ON";
- }
- else{
- return "OFF";
- }
- }
- return String();
- }
- void setup(){
- // Serial port for debugging purposes
- Serial.begin(9600);
- pinMode(ledPin, OUTPUT);
- digitalWrite(ledPin, LOW);
- // Connect to Wi-Fi
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) {
- delay(1000);
- Serial.println("Connecting to WiFi..");
- }
- // Print ESP Local IP Address
- Serial.println(WiFi.localIP());
- initWebSocket();
- // Route for root / web page
- server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
- request->send_P(200, "text/html", index_html, processor);
- });
- // Start server
- server.begin();
- }
- void loop() {
- ws.cleanupClients();
- digitalWrite(ledPin, ledState);
- }