Évolution du Système d’Arrosage Automatique

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)
Les sorties d’alimentation de l’ESP32 ne délivrant que 3.3Volts, nous avons adapté la configuration en remplaçant notre carte relais en 5V (asservie initialement au Raspberry PI) par une carte module 4 relais commandés en 3.3 Volts au prix également très faible. Il est cependant probable que l’ancienne carte ait bien interprété les nouveaux signaux d’entrée mais cet essai n’a pas été réalisé.

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)

Exemple pour la Zone4 :

L’action « On » exécutera une page html écrite dans le code de l’ESP32 (voir plus loin) en renseignant l’adresse IP de celui-ci sur le réseau WIFI. La liaison se fera directement à la ligne   void page_html_zone4_on()  du code

Il en ira de même pour l’action «  Off » qui renverra à : void page_html_zone4_off()

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 

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *