Programmation de l’ESP32 par le Wifi
L’ESP32 est un microcontrôleur très intéressant, car il regroupe des entrées sorties analogiques et numériques ainsi qu’un accès WIFI et Bluetooth. Une fois mis en place pour une application donnée, il peut être nécessaire de modifier son programme. Mais s’il se trouve éloigné ou inaccessible de votre PC servant à la programmation, il est possible de le modifier en passant par le Wifi. Cette technique est appelée OTA (Over The Air).
Choix de la carte ESP32
Il existe de nombreuses cartes sur le marché à base d’ESP32. Cela peut-être difficile parfois de trouver la définition des broches de sorties (GPIO). Ici on utilise une carte de développement AZ-Delivery avec un ESP32-Wroom et 2×19 broches. Achat possible chez Amazon.
IDE Arduino
La programmation de la carte se fait à l’aide de l’outil de développement IDE d’Arduino. Il faut dans les préférences faire appel au gestionnaire de carte de « Espressif » qui développe l’ESP32. Allez dans Fichier / Préférences et mettez l’adresse : https://dl.espressif.com/dl/package_esp32_index.json
Dans le gestionnaire de cartes, choisissez la votre. Dans notre cas ce sera « ESP 32 Dev Module ».
Basic OTA
Dans les exemples, sélectionnez le programme « Basic OTA ».
On va légèrement modifier le programme proposé pour imposer une adresse IP à l’ESP32.
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
const char* ssid = "YOUR SSID";
const char* password = "THE PASSWORD";
// Set your Static IP address
IPAddress local_IP(192, 168, 0, 208); //HERE DEFINE YOUR IP ADRESS
// Set your Gateway IP address
IPAddress gateway(192, 168, 0, 254); //DEFINE THE GATEWAY
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8); //optional
IPAddress secondaryDNS(8, 8, 4, 4); //optional
void setup() {
Serial.begin(115200);
Serial.println("Booting");
// Configures static IP address
if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
Serial.println("STA Failed to configure");
}
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Connection Failed! Rebooting...");
delay(5000);
ESP.restart();
}
ArduinoOTA
.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";
// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Serial.println("Start updating " + type);
})
.onEnd([]() {
Serial.println("\nEnd");
})
.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
})
.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();
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
ArduinoOTA.handle();
}
Adaptez le code, « SSID du WIFI, Password et adresse IP.
Téléchargez ce code par la liaison série. Sur le moniteur, vous retrouverez l’adresse IP prise en compte. Un appui sur le bouton RST permet de bien tester l’ensemble. À ce stade, il vous sera possible de mettre à jour la programmation via le web en choisissant non plus le port série dans l’Ide Arduino, mais le port réseau, dans notre cas 192.168.0.208. Dans votre code, il faudra intégrer la partie ArduinoOTA afin de conserver cette possibilité.
Exemple avec « Debug »
En passant par le Wifi vous allez perdre la possibilité de debug par le port série. La biblothèque « RemoteDebug » va nous permettre de retrouver cette possibilité par une écoute Telnet sur le port 23. A titre d’exemple, on va faire un petit serveur web sur le port 80.
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ArduinoOTA.h>
#include <RemoteDebug.h>
const char* ssid = "MyWIFI";
const char* password = "12345678";
RemoteDebug Debug;
unsigned long previousMillis;
// Set your Static IP address
IPAddress local_IP(192, 168, 0, 208);
// Set your Gateway IP address
IPAddress gateway(192, 168, 0, 254);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8); //optional
IPAddress secondaryDNS(8, 8, 4, 4); //optional
WebServer server(80);
void handleRoot() {
Debug.println(F("Client Web"));
server.send(200, "text/plain", "Hello Client");
}
void handleNotFound() {
Debug.println(F("File Not Found"));
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 setup() {
// Configures static IP address
if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
Debug.println("STA Failed to configure");
}
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Debug.println("Connection Failed! Rebooting...");
delay(5000);
ESP.restart();
}
// init remote debug
Debug.begin("ESP32");
initOTA();
Debug.println("Ready");
Debug.print("IP address: ");
Debug.println(WiFi.localIP());
server.on("/", handleRoot);
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
server.onNotFound(handleNotFound);
server.begin();
Debug.println("HTTP server started");
}
void loop() {
ArduinoOTA.handle();
Debug.handle();
server.handleClient();
if (millis() - previousMillis >= 5000) {
previousMillis = millis();
Debug.println(F("Code has been update"));
}
}
void initOTA() {
// Port defaults to 3232
// ArduinoOTA.setPort(3232);
// Hostname defaults to esp3232-[MAC]
ArduinoOTA.setHostname("ESP32");
// No authentication by default
// ArduinoOTA.setPassword("admin");
// Password can be set with it's md5 value as well
// MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
// ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
ArduinoOTA
.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";
// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Debug.println("Start updating " + type);
})
.onEnd([]() {
Debug.println("\nEnd");
})
.onProgress([](unsigned int progress, unsigned int total) {
Debug.printf("Progress: %u%%\r", (progress / (total / 100)));
})
.onError([](ota_error_t error) {
Debug.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Debug.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Debug.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Debug.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Debug.println("Receive Failed");
else if (error == OTA_END_ERROR) Debug.println("End Failed");
});
ArduinoOTA.begin();
}
Cette fois-ci, téléchargez le code via le réseau Wifi. En parallèle, ouvrez une session Telnet avec un programme comme Putty. Rentrez l’adresse IP de l’ESP32 et le port 23. Ouvrez votre navigateur web, et rentrez l’adresse IP de l’ESP.
Vous pouvez à présent vous inspirer de cette exemple pour votre application à mettre à jour via le Wifi.
Bugs IDE Arduino
En attendant des corrections, l’IDE Arduino a 2 désagréments :
– il demande un mot de passe pour télécharger en mode OTA bien que la programmation n’en impose pas. Il suffit de rentrer une lettre quelconque.
– parfois en fin de téléchargement la flèche reste orange. Il faut relancer l’IDE pour télécharger à nouveau.
Intéressant, du bon travail Mr André ! Merci !
Je vais m’en inspirer !
Bonjour,
A quoi correspond la ligne: IPAddress gateway(192, 168, 0, 254) par rapport a IPAddress local_IP(192, 168, 0, 208) qui est l’adresse local.
Ou trouver ou comment déterminer IPAddress gateway.
D’avance merci.
Gateway, c’est la passerelle qui vous permet d’accéder au monde extérieur. En pratique c’est l’adresse IP de votre box internet sur le réseau interne à la maison. 192.168. et se termine souvent en 0.1 ou 0.254 ou 1.0 ou 1.254.
Bonjour,
Je viens de tester l’OTA.
Avant chaque téléversement, il me demande un MP? Dans le doute j’ai saisie celui du MD5(admin) et cela fonctionne mais je ne comprends pas pourquoi vu que dans le sketch il est en commentaire?
A la fin du téléchargement, l’IDE ne le détecte pas et l’animation de téléchargement continue. le bouton « téléverser » reste en jaune. Je dois fermer Arduino IDE pour pouvoir refaire un téléchargement!
Vous avez une idée de la portée du WiFi?
Prendre un ESP avec antenne externe est vraiment un plus?
Merci d’avance pour vos réponses.
Ce sont les petits désagréments de l’IDE d’Arduino.
Pour le mot de passe, mettez n’importe quoi. Une lettre suffit.
Pour le téléverser en jaune, je peste aussi. Mais certains jours cela marche. Je n’ai pas encore compris pourquoi.
Bonjour Mr Andre,
Me suis inspirer de cet excellent travail pour monter un routeur solaire….Mais j »ai un souci pour communiquer en WIFI .
voici le rapport arduino IDE 2.0.4 :
Le croquis utilise 846766 octets (64%) de l’espace de stockage de programmes. Le maximum est de 1310720 octets.
Les variables globales utilisent 47112 octets (14%) de mémoire dynamique, ce qui laisse 280568 octets pour les variables locales. Le maximum est de 327680 octets.
Sending invitation to 192.168.1.60
12:11:36 [ERROR]: No response from device
Failed uploading: uploading error: exit status 1
E t voici le rapport via putty de ESP32 :
(D) Power:95.00
* Debug: Command received: d
* Debug level set to Debug
(D) V25:-401.43
(D) Idx0:21
(D) Power:98.00
(D) V25:-432.51
(D) Idx0:45
(D) Power:99.00
(D) Start updating sketch
Error[3]: Receive Failed
(D) V25:-403.28
Je n’arrive pas a trouver ce qui ne va pas …. ça semble communiquer … mais rien ne se transfert …
Si vous avez une idée …
Merci
Cordialement
Pat34
PS:
J’ai fait des sauvegardes écran que je peux vous transférer par mail
Au moment ou l’IDE Arduino veut lancer le transfert. Appuyez sur le bouton reset de la carte. Certaines cartes l’exigent.
Cdlt
xfert OK . Merci
Pour avoir 231V au display sur la WEB, la valeur Kv a été mise a 0,2141.
Cette valeur est bien lue au display sur le web a 231V au démarrage
Le problème : Cette valeur décroit dans le temps pour passer au bout de 30mn a …. 40V.
Avez vous rencontré ce pb ?
Merci de votre aide.
Pat34
Pour info, l’intensité est stable et conforme a la réalité …
Alors là, vous me laissez sans voix… Je n’ai aucune idée de la cause.
Cdlt
André
Bonjour André
Merci pour ce beau travail !
Tout ce passe bien sauf au moment de la compilation.J’ai le message d’erreur suivant :
fatal error: RemoteDebug.h: No such file or directory
compilation terminated.Manque t il quelque chose ?
Merci par avance pour votre lumière.
Cordialement,
Christophe
Vous avez oublié je pense d’installer la bibliothèque RemoteDebug de JaoLopes
73
Bonjour , nous sommes intéressés par le projet mais la version du EP32 nous fais douter , pouvez vous nous confirmer quelle est la version ESP32D-CH9102X WROOM 32 qu’il faut acheter svp ? sachant qu’il y a des USB C … merci beaucoup
Oui mais je pense qu’il y a une faute (D) dans votre référence. C’est plutôt ESP32-CH9102X WROOM 32D
Cdlt
Bonjour, comment changer le nom d’un nouveau SSID et un nouveau mot de passe? Merci
J’ai oublier de mentionner que c’est la version V 3.04Uxl que j’ai télécharger ssid et mot de passe avec 192.168.4.1. Mais je voudrai changer de réseau où modifier le ssid et le nouveau mot de passe? Impossible de rouvrir le site 192.168.4.1 pour mofifier. Cordialement
Bonjour,j’ai télécharger la version V 3.04Uxl mis le ssid et le mot de passe avec 192.168.4.1. Mais je voudrai changer de réseau , comment modifier le ssid et le nouveau mot de passe? Impossible de rouvrir le site 192.168.4.1 pour modifier. Cordialement
A la ligne 19 vous changez un chiffre quelconque de la constante.
#define CLE_Rom_Init 1234567892
Merci.
Bonjour, J’ai enfin réussi mon installation non sans difficultés, ce n’est pas la partie hardware qui me pose problème mais logiciel par manque de connaissances. Je suis enfin arrivé à l’étape où la led clignote toutes les 2s mais en voulant me connecter via le navigateur à l’aide de l’adresse IP de l’esp32, rien ne se passe, aucun accès. Ai-je loupé quelque chose ? Merci !
Avez vous récupérez l’adresse IP attribuée par votre box? Elle est donnée sur le moniteur serie de l’IDE Arduino quand vous êtes connecté en USB.
Cdlt
Bonsoir André,
Pour rappel, je suis avec deux ESP32 qui sont en service avec la version V6_01, tout ça fonctionne très bien, « je suis sur un nuage »
Là ou « je ne suis plus sur un nuage » c’est avec la fonction OTA, où je n’y comprends pas grand chose, pour simplifier, je vais vous dire se que je crois avoir compris.
1_ Si j’ai bien compris il faut adapter BasicOTA, est ce qu’il faut copier/coller l’intégralité de l’exemple que vous donnez ici, mettre le nom de ma BOX et de son mot de passe, là ou je suis noyé c’est avec cette adresse IP: IPAddress local_IP(192, 168, 0, 208);
est ce qu’il faut sauvegarder ces modifications et où.
2_ Est ce qu’il faut passer par l’adresse IP d’une de mes deux cartes, adresses IP que je vois bien dans Outils/Réseaux ports.
3_ Comme se n’est pas correctement configurait quelque part, pour le moment ça ne fonctionne pas, oui, ça téléverse, puis message d’erreur
https://ibb.co/wKt83Cf
https://ibb.co/DWzJWT1
https://ibb.co/ydyjqDS
https://ibb.co/Hz40Qtr
Peut être qu’avec de l’aide je vais finir par comprendre quelque chose. Merci.
Jean
L’OTA est déjà implanté dans le programme du routeur. Vous n’avez rien à changer.
Cela peut vous servir à installer la version 6.02 en lieu et place de la 6.01
Vous ouvrez la version 6.02 dans l’IDE, vous sélectionnez la carte comme sur votre première photo. Le logiciel sera chargé en passant par le Wifi (OTA=On The Air, par Radio) et non pas par câble USB comme la première fois.
Les messages « No Monitor available.. » sont normaux et pas gênants. C’est juste pour dire que vous ne pouvez pas avoir de sortie sur moniteur comme lorsque vous êtes branchés en USB.
Cdlt
Merci André,
Je viens d’essayer de nouveau, avec l’adresse IP du routeur de la salle de bain 192.168.1.163, message d’erreur à la fin du téléversement.
https://ibb.co/ctrMWVc
Bien sur je vérifie sur la page web du routeur, et voir si ça a changé de version en bas de la page d’accueil
Bonjour,
Je ne suis pas trés alaise en informatique , je voudrai contruire votre routeur
je rencontre des probléme avec les erreurs au moment de verifier le programme
quel sont les programmes à téléchargeur sur la biblioteque Arduino et les drivers
fatal error: hwcrypto/sha.h: No such file or directory
#include
je vous remercie pour votre aide
La réponse est ici au chapitre Bugs Soft
https://f1atb.fr/fr/routeur-photovoltaique-realisation-logicielle/
Cdlt
Bonjour, je tente de compiler les le SOLAR_ROUTER _V8_RMS.ino et j’obtiens le message suivant en fin de compilation : Compilation error: RemoteDebug.h: No such file or directory
J’ai tenté des debug mais rien n’y fait.
Aussi je n’arrive pas à ouvrir l’adresse IP 192.168.4.1 que vous indiquez mais il n’y a pas d’accès possible.
Je vous remercie pour votre aide
Cordialement
Vous n’avez pas installé la bibliothèque RemoteDebug
et attention au point cité au chapitre Bugs Soft
https://f1atb.fr/fr/routeur-photovoltaique-realisation-logicielle/
Bonjour, j’essaie de compiler le programme de routeur Solar_Router_V8_09_RMS mais je reçois le message d’erreur intitulé :
pageHtmlBrute.h
introuvable dans la bibliothèque.
merci pour votre retour
Vous avez du oublier de déziper (extraire) le fichier .zip dans un dossier.
Cdlt
En effet.
Merci beaucoup.
J’ai un autre souci, lorsque je me connecte sur le réseau wifi de la carte esp32 et que je rentre son adresse IP dans la barre de recherche internet, je reçois le message « serveur introuvable ».
Comment régler ce problème svp?
merci
Regardez sur le port série, le moniteur, l’adresse IP auquel se connecte l’ESP. L’info est donnée toutes les 30s. Il y a une erreur quelque part.
Bonjour André , j’ai injecté la V9 sur mon ESP coté maison . sur mon coffret déporté je ne vois pas la puissance mesurée par mon premier boitier .
D’où cela peut venir? Avez vous une idée? la marche forcée fonctionne bien mais du coup pas de régulation. Merci pour les pistes!!!
Il faut la même version sur tous les ESP routeurs.
Cdlt
En faisant j’ai ce message d’erreur!! jamais eu celui là encore !!!! ligne 338 wifi client
exit status 1
Compilation error: ‘WiFiClient’ does not name a type; did you mean ‘Client’?
https://f1atb.fr/forum_f1atb/thread-2.html