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)
![]() |
![]() |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
/* * 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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
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 |











