Utilisation d’un ESP32 pour la commande des électrovannes – un article de Philippe
L’apparition sur le marché des modules ESP32 a apporté une nouvelle réflexion sur la conception de mon système d’arrosage, en raison principalement de ses faibles cout et encombrement, mais aussi par la possibilité de l’interfacer encore plus facilement avec le serveur Domoticz.
ESP32 est une série de microcontrôleurs de type système sur une puce (SoC) d’Espressif Systems, basé sur l’architecture Xtensa LX6 de Tensilica, intégrant la gestion du Wi-Fi et du Bluetooth (jusqu’à LE 5.0 et 5.11) en mode double. C’est une évolution d’ESP8266. Son support Wi-Fi et Bluetooth, en fait un système apprécié dans le domaine de l’internet des objets. Ce SoC rencontre un certain succès depuis quelques années à la fois pour son coût, ses capacités et son intégration dans un nombre croissant de systèmes. La programmation du microcontrôleur se fait aisément avec l’IDE du fameux logiciel Arduino, historiquement utilisé pour encoder les Arduino. Le code compilé sera téléversé dans l’ESP32.
![]() |
Mon choix s’est porté sur l’ESP-32 à 30 Pins de très faible cout (inférieur à 2 Euros) et d’encombrement réduit (5×3 Cm) |
Le Montage :
![]() |
![]() |
![]() |
L’Intégration dans Domoticz :
Après création dans Domoticz de 4 dispositifs virtuels de type on/off (les 4 zones d’arrosage) , il faudra affecter les actions de ces interrupteurs aux 4 sorties choisies du ESP32 pour commander les relais. (D5-D18-D19-D21 dans notre exemple)
Le code : Il sera édité dans l’IDE Arduino puis téléversé dans l’ESP connecté en USB (à copier-coller dans l’éditeur)
![]() |
![]() |
/*
* Communication entre Domoticz et ESP32 via Wifi+Http
* pour gestion d'un arrosage 4 zones
*/
// Librairies à utiliser
#include <WiFi.h> # Utilisation de la librairie WiFi.h (gestion du wifi)
#include <HTTPClient.h> # Utilisation de la librairie HTTPClient.h (et pas HttpClient.h !) (traitement des requetes http)
#include <WebServer.h> # Utilisation de la librairie WebServer.h (serveur http)
// Paramétres WIFI à modifier en fonction des paramètres locaux
#define wifi_ssid "*****"
#define wifi_password "*********"
// Paramètres Domoticz à modifier en fonction des paramètres locaux
const char* HOST = "192.168.1.101"; //IP de Domoticz sur le réseau WIFI
const int PORT = 8080; //Port "
// Autres éléments à initialiser
int Zone1 = 5; // Utilisation de la Zone 1 via GPIO 5
int Zone2 = 18; // Utilisation de la Zone 2 via GPIO 18
int Zone3 = 19; // Utilisation de la Zone 3 via GPIO 19
int Zone4 = 21; // Utilisation de la Zone 4 via GPIO 21
// Activation du protocole http
HTTPClient http;
// Création d’une instance serveur
WebServer server(80); // PORT d’écoute 80
void setup() {
pinMode(Zone1, OUTPUT);
pinMode(Zone2, OUTPUT);
pinMode(Zone3, OUTPUT);
pinMode(Zone4, OUTPUT);
digitalWrite(Zone1, LOW); // arrêt de la Zone 1
digitalWrite(Zone2, LOW); // arrêt de la Zone 2
digitalWrite(Zone3, LOW); // arrêt de la Zone 3
digitalWrite(Zone4, LOW); // arrêt de la Zone 4
// Lancement de la connexion série avec l'ESP32
Serial.begin(115200);
// Connexion au réseau WiFi
setup_wifi();
// Initialisation du serveur web
server.on("/", page_html); // page d'accueil
server.on("/zone1_on", page_html_zone1_on); // page /zone1_on et traitement associé
server.on("/zone1_off", page_html_zone1_off); // page /zone1_off et traitement associé
server.on("/zone2_on", page_html_zone2_on); // page /zone2_on et traitement associé
server.on("/zone2_off", page_html_zone2_off); // page /zone2_off et traitement associé
server.on("/zone3_on", page_html_zone3_on); // page /zone3_on et traitement associé
server.on("/zone3_off", page_html_zone3_off); // page /zone3_off et traitement associé
server.on("/zone4_on", page_html_zone4_on); // page /zone4_on et traitement associé
server.on("/zone4_off", page_html_zone4_off); // page /zone4_off et traitement associé
server.onNotFound(page_html_non_trouve); // page non trouvée et traitement de l'erreur
server.begin(); // démarre le serveur HTTP
}
//Connexion au réseau WiFi et affichage de la connexion dans le moniteur série
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifi_ssid);
WiFi.mode(WIFI_STA); // configure le WIFI en mode station
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
char adr_ip[20]; // contient l’adresse IP fournit par le point d’accès WiFi
IPAddress ip; // définition de la variable ip qui est une adresse IP
ip = WiFi.localIP(); // on récupère l’adresse IP
Serial.println("");
Serial.println("WiFi connexion OK ");
Serial.print("=> Addresse IP : ");
Serial.println(WiFi.localIP());
}
// Définition du traitement pour les pages html
void page_html() {
server.send(200, "text/plain"," Active (/zone1_on) ou Stoppe (/zone1_off) la Zone à arroser - max 4 zones "); // affiche un message
}
void page_html_zone1_on() {
server.send(200, "text/plain"," Zone1 on ");
digitalWrite(Zone1, HIGH); // lancement de la zone 1
Serial.println("Zone 1 On");
}
void page_html_zone2_on() {
server.send(200, "text/plain"," Zone2 on ");
digitalWrite(Zone2, HIGH); // lancement de la zone 2
Serial.println("Zone 2 On");
}
void page_html_zone3_on() {
server.send(200, "text/plain"," Zone3 on ");
digitalWrite(Zone3, HIGH); // lancement de la zone 3
Serial.println("Zone 3 On");
}
void page_html_zone4_on() {
server.send(200, "text/plain"," ZONE on ");
digitalWrite(Zone4, HIGH); // lancement de la zone 4
Serial.println("Zone 4 On");
}
void page_html_zone1_off() {
server.send(200, "text/plain"," ZONE off ");
digitalWrite(Zone1, LOW); // arrêt de la zone 1
Serial.println("Zone 1 Off");
}
void page_html_zone2_off() {
server.send(200, "text/plain"," ZONE off ");
digitalWrite(Zone2, LOW); // arrêt de la zone 2
Serial.println("Zone 2 Off");
}
void page_html_zone3_off() {
server.send(200, "text/plain"," ZONE off ");
digitalWrite(Zone3, LOW); // arrêt de la zone 3
Serial.println("Zone 3 Off");
}
void page_html_zone4_off() {
server.send(200, "text/plain"," ZONE off ");
digitalWrite(Zone4, LOW); // arrêt de la zone 4
Serial.println("Zone 4 Off");
}
void page_html_non_trouve() {
server.send(404, "text/plain","404: Not found");
}
// Envoi d'une réponse http à Domoticz
void sendToDomoticz(String url){
Serial.print("Connecting to ");
Serial.println(HOST);
Serial.print("Requesting URL: ");
Serial.println(url);
http.begin(HOST,PORT,url);
int httpCode = http.GET();
if (httpCode) {
if (httpCode == 200) {
String payload = http.getString();
Serial.println("Domoticz response ");
Serial.println(payload);
}
}
Serial.println("closing connection");
http.end();
}
// Boucle du programme qui s'exécute perpétuellement
void loop(){
server.handleClient(); // attend une requête HTTP venant de Domoticz
}
|
Chacune des électrovannes sera asservie d’une durée et d’un d’ un ordre on/off transmis à l’ESP32 et peut être actionnée individuellement par Domoticz |
Un cycle complet peut aussi être planifié dans domoticz et être déclenché par un script. |
|
Chacune des électrovannes sera active pendant la durée prévue (480s dans l’exemple ci-contre), seule une commande ‘on’ est donc nécessaire dans le planning |
Script de déclenchement d’un cycle complet d’arrosage : script_time_arrosage_cycle .lua
commandArray = {}
-- chargement des modules (http://easydomoticz.com/forum/viewtopic.php?f=17&t=3940)
-- Ce script s'executera toutes les minutes si on a forcé le device Cycle sur On et defini des temps d'extinction de chaque zone dans les dispositifs
-- il scrutera l'état des devices et variables toutes les minutes pour réagir en conséquence
--dofile('/home/pi/domoticz/scripts/lua/modules.lua')
-----------------------------------------------------------------------------------------------------------
a = uservariables["z1"] --définition des variables
b = uservariables["z2"] --sont normalement à 0
c = uservariables["z3"]
d = uservariables["z4"]
f = uservariables["fin_zone"]
g = uservariables["cycle_en_cours"] -- Cette variable permet de mémoriser qu'un cycle est en cours pour pouvoir lancer manuellement des zones (hors cycle) dont la duréee
-- ne soit pas interrompue par ce script à la ligne 74 qui teste si un cycle est en cours (g=1). Sans cette variable le constat par ce
-- script du device 'Cycle Arrosage' sur off toutes les minutes couperait tout arrosage en cours y compris manuel.
------------------------------------------------------------------------------------------------------------
if (otherdevices['Cycle Arrosage']=='On') then
--si un cycle est lancé
commandArray['Variable:cycle_en_cours'] = tostring(1) --mémorisation du déclenchement du cycle
--zone1
if a == 0 then --si la zone1 n'a pas encore été arrosée
commandArray['Arrosage Zone 1']='On' --on lance la zone1 (durera le temps d'extinction du device (à renseigner dans modifier/extinction du device))
commandArray['Variable:z1'] = tostring(1) --variable zone1 en cours passe à 1
if (otherdevices['Arrosage Zone 1']=='Off') then --quand le délai d'extinction est atteint
commandArray['Variable:fin_zone'] = tostring(1) --la variable fin_zone est mise à 1 (1 zone a été arrosée)
end
end
--zone2
if (otherdevices['Arrosage Zone 1']=='Off') and b == 0 and f == 1 then --si zone 1 terminée et zone 2 pas encore arrosée
commandArray['Arrosage Zone 2']='On' --on lance la zone 2 (durera le temps d'extinction du device)
commandArray['Variable:z2'] = tostring (1) --la variable zone2 en cours passe à 1
if (otherdevices['Arrosage Zone 2']=='Off') then --quand le délai d'extinction est atteint
commandArray['Variable:fin_zone'] = tostring(2) --la variable fin_zone est mise à 2 (2 zones ont été arrosées)
end
end
--zone3
if (otherdevices['Arrosage Zone 2']=='Off') and c == 0 and f == 2 then --si zone 2 terminée et zone 3 pas encore arrosée
commandArray['Arrosage Zone 3']='On' --on lance la zone 3 et on signale z3 arrosée (durera le temps d'extinction du device)
commandArray['Variable:z3'] = tostring (1) --la variable zone3 en cours est mise à 1
if (otherdevices['Arrosage Zone 3']=='Off') then --quand le délai d'extinction est atteint
commandArray['Variable:fin_zone'] = tostring(3) --la variable fin_zone est mise à 3 (3 zones ont été arrosées)
end
end
--zone4
if (otherdevices['Arrosage Zone 3']=='Off') and d == 0 and f == 3 then --etc
commandArray['Arrosage Zone 4']='On'
commandArray['Variable:z4'] = tostring (1)
if (otherdevices['Arrosage Zone 4']=='Off') then
commandArray['Variable:fin_zone'] = tostring(4)
end
end
-- fin normale du cycle
if (otherdevices['Arrosage Zone 4']=='Off') and f == 4 then --si zone 4 terminée et si toutes les zones ont été arrosées
commandArray['Cycle Arrosage']='Off'
commandArray['Variable:z1'] = tostring(0) --réinitialisation des variables pour un prochain cycle
commandArray['Variable:z2'] = tostring(0)
commandArray['Variable:z3'] = tostring(0)
commandArray['Variable:z4'] = tostring(0)
commandArray['Variable:fin_zone'] = tostring(0)
commandArray['Variable:cycle_en_cours'] = tostring(0)
end
end
-----------------------------------------------------------------------------------------------------------
--en cas d'arret manuel du cycle
if (otherdevices['Cycle Arrosage']=='Off') and g == 1 then --si un cycle est arrété en manuel
commandArray['Arrosage Zone 1']='Off' --on stoppe tout arrosage en cours
commandArray['Arrosage Zone 2']='Off'
commandArray['Arrosage Zone 3']='Off'
commandArray['Arrosage Zone 4']='Off'
commandArray['Variable:z1'] = tostring(0) --réinitialisation des variables à 0 pour un prochain cycle
commandArray['Variable:z2'] = tostring(0)
commandArray['Variable:z3'] = tostring(0)
commandArray['Variable:z4'] = tostring(0)
commandArray['Variable:fin_zone'] = tostring(0)
commandArray['Variable:cycle_en_cours'] = tostring(0)
end
return commandArray











