Arduino - WebSocket

Dans ce guide, nous explorerons ce qu'est WebSocket, pourquoi il est utile pour contrôler efficacement un Arduino, et comment implémenter WebSocket avec Arduino. À travers un exemple pratique, nous démontrerons comment construire une application de chat qui connecte un navigateur web à un Arduino, vous permettant de :

Arduino websocket

Préparation du matériel

1×Arduino UNO R4 WiFi
1×USB Cable Type-C
1×(Optional) 9V Power Adapter for Arduino
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

Qu'est-ce que WebSocket Arduino?

Vous pourriez vous demander, "Qu'est-ce que WebSocket ?" C'est assez simple : WebSocket est une technologie qui permet à un navigateur web de communiquer directement avec un serveur web en temps réel.

  • Sans WebSocket, vous devriez actualiser la page web pour voir les nouvelles mises à jour. Ce n'est pas très pratique.
  • Avec WebSocket, la page web reste continuellement connectée au serveur. Cela leur permet d'échanger des informations instantanément sans avoir besoin de rafraîchir la page.

Vous rencontrez probablement régulièrement la technologie WebSocket dans les applications web quotidiennes telles que les jeux en ligne, la messagerie instantanée et les mises à jour du marché boursier.

Pourquoi avons-nous besoin de WebSocket pour contrôler Arduino de manière fluide ?

Imaginez que vous souhaitez contrôler votre voiture télécommandée à l'aide d'une interface web sur votre téléphone ou votre ordinateur. Sans WebSocket, chaque fois que vous voudriez changer la direction ou la vitesse de la voiture, vous devriez rafraîchir la page web. C'est comme si vous deviez appuyer sur un bouton "recharger" chaque fois que vous donnez un ordre à la voiture.

Avec WebSocket, cependant, c'est comme s'il y avait une connexion continue et directe entre votre téléphone ou votre ordinateur et la voiture. Vous n'avez pas besoin de rafraîchir la page pour diriger la voiture ou changer sa vitesse. C'est comme si la voiture écoutait constamment vos commandes en temps réel, sans aucun délai causé par la nécessité de recharger la page.

Dans l'ensemble, WebSocket facilite :

  • Envoi de données du navigateur web à Arduino sans avoir à recharger la page.
  • Envoi de données d'Arduino vers le navigateur web sans rafraîchir la page.

Cela permet une communication fluide et bidirectionnelle en temps réel.

Avantages de WebSocket avec Arduino :

  • Contrôle en temps réel : WebSocket permet une communication instantanée avec l'Arduino, assurant des réponses rapides aux commandes pour une expérience utilisateur fluide.
  • Connexion persistante : Maintenez un lien continu sans rafraîchir la page de contrôle, créant une ligne de communication toujours prête pour des instructions immédiates.
  • Efficacité : Bénéficiez de réponses promptes sans nécessité de recharger constamment la page, améliorant ainsi le plaisir et l'efficacité globale de l'utilisateur.

Discussion Web avec Arduino via WebSocket

Le contenu de la page web (HTML, CSS, JavaScript) est stocké séparément dans un fichier index.h. Ainsi, nous aurons deux fichiers de code sur l'IDE Arduino :

  • Un fichier .ino qui est un code Arduino, lequel crée un serveur web et un serveur WebSocket.
  • Un fichier .h, qui contient le contenu de la page web.

Étapes rapides

  • Si c'est la première fois que vous utilisez Arduino Uno R4, consultez comment configurer l'environnement pour Arduino Uno R4 sur Arduino IDE.
  • Connectez la carte Arduino à votre PC via un câble micro USB.
  • Ouvrez l'Arduino IDE sur votre PC.
  • Sélectionnez la bonne carte Arduino (Arduino Uno R4 WiFi) et le port COM.
  • Ouvrez le gestionnaire de bibliothèques en cliquant sur l'icône Gestionnaire de bibliothèques dans la barre de navigation gauche de l'IDE Arduino.
  • Recherchez “mWebSockets”, puis trouvez mWebSockets créé par Dawid Kurek.
  • Cliquez sur le bouton Install pour installer la bibliothèque mWebSockets.
Bibliothèque mWebSockets Arduino
  • Sur l'IDE Arduino, créez une nouvelle esquisse, donnez-lui un nom, par exemple, ArduinoGetStarted.com.ino
  • Copiez le code ci-dessous et ouvrez-le avec l'IDE Arduino
/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-websocket */ #include <WiFiS3.h> #include <WebSocketServer.h> #include "index.h" using namespace net; WebSocketServer wss(81); WiFiServer server(80); const char ssid[] = "YOUR_WIFI_SSID"; // change your network SSID const char pass[] = "YOUR_WIFI_PASSWORD"; // change your network password int status = WL_IDLE_STATUS; void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) Serial.println("Please upgrade the firmware"); // attempt to connect to WiFi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 4 seconds for connection: delay(4000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); server.begin(); wss.onConnection([](WebSocket &ws) { const auto protocol = ws.getProtocol(); if (protocol) { Serial.print(F("Client protocol: ")); Serial.println(protocol); } ws.onMessage([](WebSocket &ws, const WebSocket::DataType dataType, const char *message, uint16_t length) { switch (dataType) { case WebSocket::DataType::TEXT: Serial.print(F("Received: ")); Serial.println(message); break; case WebSocket::DataType::BINARY: Serial.println(F("Received binary data")); break; } String reply = "Received: " + String((char *)message); ws.send(dataType, reply.c_str(), reply.length()); }); ws.onClose([](WebSocket &, const WebSocket::CloseCode, const char *, uint16_t) { Serial.println(F("Disconnected")); }); Serial.print(F("New WebSocket Connnection from client: ")); Serial.println(ws.getRemoteIP()); const char message[]{ "Hello from Arduino server!" }; ws.send(WebSocket::DataType::TEXT, message, strlen(message)); }); wss.begin(); } void loop() { wss.listen(); // listen for incoming clients WiFiClient client = server.available(); if (client) { // read the HTTP request header line by line while (client.connected()) { if (client.available()) { String HTTP_header = client.readStringUntil('\n'); // read the header line of HTTP request if (HTTP_header.equals("\r")) // the end of HTTP request break; Serial.print("<< "); Serial.println(HTTP_header); // print HTTP request to Serial Monitor } } // send the HTTP response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println(); // the separator between HTTP header and body String html = String(HTML_CONTENT); client.println(html); client.flush(); // give the web browser time to receive the data delay(50); // close the connection: client.stop(); } }
  • Modifiez les informations WiFi (SSID et mot de passe) dans le code pour correspondre à vos propres identifiants de réseau.
  • Créez le fichier index.h dans l'IDE Arduino en :
    • Cliquant sur le bouton juste en dessous de l'icône du moniteur série et choisissez Nouvel Onglet, ou utilisez les touches Ctrl+Shift+N.
    L'IDE Arduino 2 ajoute un fichier
    • Donnez le nom du fichier index.h et cliquez sur le bouton OK.
    Arduino IDE 2 ajoute le fichier index.h
    • Copiez le code ci-dessous et collez-le dans index.h.
    /* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-websocket */ const char *HTML_CONTENT = R"=====( <!DOCTYPE html> <html> <head> <title>Arduino WebSocket</title> <meta name="viewport" content="width=device-width, initial-scale=0.7, maximum-scale=0.7"> <link rel="icon" href="https://diyables.io/images/page/diyables.svg"> <style> /* Add some basic styling for the chat window */ body { background-color: #E1EFEF; font-size: 20px; line-height: 1.3; } button, input { font-size: 20px; line-height: 1.3; } .chat-container { margin: 0 auto; padding: 10px; } .chat-messages { height: 250px; overflow-y: auto; padding: 5px; margin-bottom: 5px; } .user-input { display: flex; margin-bottom: 20px; } .user-input input { flex: 1; border: 1px solid #444; padding: 5px; } .user-input button { margin-left: 5px; background-color: #007bff; color: #fff; border: none; padding: 5px 10px; cursor: pointer; } .websocket { display: flex; align-items: center; margin-bottom: 5px; } .websocket button { background-color: #007bff; color: #fff; border: none; padding: 5px 10px; cursor: pointer; } .websocket .label { margin-left: auto; } .message-sent { border-radius: 25px; background-color: #d35400; float: right; width: fit-content; padding: 10px 20px; margin: 0; } .message-received { border-radius: 25px; background-color: white; float: left; width: fit-content; padding: 10px 20px; margin: 0; } </style> <script> var ws; var wsm_max_len = 4096; /* bigger length causes uart0 buffer overflow with low speed smart device */ function update_text(text) { var chat_messages = document.getElementById("chat-messages"); chat_messages.innerHTML += '<div style="width:100%;overflow: auto;">' + text + '</div>'; chat_messages.scrollTop = chat_messages.scrollHeight; } function send_onclick() { if(ws != null) { var message = document.getElementById("message").value; if (message) { document.getElementById("message").value = ""; ws.send(message + "\n"); update_text('<p class="message-sent">' + message + '</p>'); // You can send the message to the server or process it as needed } } } function connect_onclick() { if(ws == null) { ws = new WebSocket("ws://" + window.location.host + ":81"); document.getElementById("ws_state").innerHTML = "CONNECTING"; ws.onopen = ws_onopen; ws.onclose = ws_onclose; ws.onmessage = ws_onmessage; } else ws.close(); } function ws_onopen() { document.getElementById("ws_state").innerHTML = "<span style='color:blue'>CONNECTED</span>"; document.getElementById("bt_connect").innerHTML = "Disconnect"; document.getElementById("chat-messages").innerHTML = ""; } function ws_onclose() { document.getElementById("ws_state").innerHTML = "<span style='color:gray'>CLOSED</span>"; document.getElementById("bt_connect").innerHTML = "Connect"; ws.onopen = null; ws.onclose = null; ws.onmessage = null; ws = null; } function ws_onmessage(e_msg) { e_msg = e_msg || window.event; // MessageEvent console.log(e_msg.data); update_text('<p class="message-received">' + e_msg.data + '</p>'); } </script> </head> <body> <div class="chat-container"> <h2>Arduino WebSocket</h2> <div class="websocket"> <button class="connect-button" id="bt_connect" onclick="connect_onclick()">Connect</button> <span class="label">WebSocket: <span id="ws_state"><span style="color:blue">CLOSED</span></span></span> </div> <div class="chat-messages" id="chat-messages"></div> <div class="user-input"> <input type="text" id="message" placeholder="Type your message..."> <button onclick="send_onclick()">Send</button> </div> <div class="sponsor">Sponsored by <a href="https://amazon.com/diyables">DIYables</a></div> </div> </body></html> )=====";
    • Vous avez maintenant le code dans deux fichiers : ArduinoGetStarted.com.ino et index.h
    • Cliquez sur le bouton Upload dans l'IDE Arduino pour téléverser le code vers l'Arduino.

    Vous verrez une erreur comme ci-dessous :

    In file included from c:\Users\YOU_ACCOUNT\Documents\Arduino\libraries\mWebSockets\src/utility.h:3:0, from c:\Users\YOU_ACCOUNT\Documents\Arduino\libraries\mWebSockets\src/WebSocket.h:5, from c:\Users\YOU_ACCOUNT\Documents\Arduino\libraries\mWebSockets\src/WebSocketServer.h:5, from C:\Users\YOU_ACCOUNT\Documents\Arduino\ArduinoGetStarted.com\ArduinoGetStarted.com.ino:2: C:\Users\YOU_ACCOUNT\Documents\Arduino\libraries\mWebSockets\src/platform.h:54:12: fatal error: Ethernet.h: No such file or directory # include <Ethernet.h> ^~~~~~~~~~~~ compilation terminated. exit status 1

    Pour corriger cette erreur :

    • Allez dans le répertoire C:\Utilisateurs\VOTRE_COMPTE\Documents\Arduino\libraries\mWebSockets\src/.
    • Trouvez le fichier config.h et ouvrez-le avec un éditeur de texte.
    • Regardez la ligne 26, vous verrez quelque chose comme ci-dessous :
    #define NETWORK_CONTROLLER ETHERNET_CONTROLLER_W5X00
    • Modifiez cette ligne par celle ci-dessous et enregistrez-la :
    #define NETWORK_CONTROLLER NETWORK_CONTROLLER_WIFI
    • Cliquez sur le bouton Upload dans l'IDE Arduino pour téléverser le code sur Arduino.
    • Ouvrez le moniteur série
    • Consultez le résultat sur le moniteur série.
    COM6
    Send
    Connecting to WiFi... Connected to WiFi Arduino Web Server's IP address IP address: 192.168.0.2
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Prenez note de l'adresse IP affichée, et saisissez cette adresse dans la barre d'adresse d'un navigateur web sur votre smartphone ou PC.
    • Vous verrez la page web comme ci-dessous :
    Navigateur web websocket Arduino
    • Cliquez sur le bouton CONNECTER pour connecter la page web à Arduino via WebSocket.
    • Tapez quelques mots et envoyez-les à Arduino.
    • Vous verrez la réponse d'Arduino.
    Serveur de discussion WebSocket Arduino

    ※ NOTE THAT:

    Si vous modifiez le contenu HTML dans le index.h et que vous ne touchez à rien dans le fichier ArduinoGetStarted.com.ino, lorsque vous compilez et téléchargez le code sur Arduino, l'IDE Arduino ne mettra pas à jour le contenu HTML. Pour que l'IDE Arduino mette à jour le contenu HTML dans ce cas, apportez une modification dans le fichier ArduinoGetStarted.com.ino (par exemple, ajouter une ligne vide, ajouter un commentaire...).

    Explication du code ligne par ligne

    Le code Arduino ci-dessus contient des explications ligne par ligne. Veuillez lire les commentaires dans le code !

Comment fonctionne le système

Le code Arduino fonctionne en configurant à la fois un serveur web et un serveur WebSocket. Voici comment cela fonctionne :

  • Lorsque vous saisissez l'adresse IP de l'Arduino dans un navigateur web, celui-ci demande la page web (Interface Utilisateur) à l'Arduino.
  • Le serveur web de l'Arduino envoie alors le contenu de la page web (HTML, CSS, JavaScript) à votre navigateur.
  • Votre navigateur web affiche la page web.
  • En cliquant sur le bouton CONNECTER sur la page web, le code JavaScript à l'intérieur de la page initie une connexion WebSocket avec le serveur WebSocket sur l'Arduino.
  • Une fois la connexion WebSocket active, si vous tapez quelque chose et appuyez sur le bouton ENVOYER, le JavaScript envoie votre texte à l'Arduino via la connexion WebSocket en arrière-plan.
  • Après avoir reçu votre saisie, le serveur WebSocket sur l'Arduino renvoie une réponse à votre page web.

Vous pouvez découvrir d'autres exemples de WebSocket Arduino ci-dessous :

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!