Sommaire
Objectif
Arrosage automatique dans la serre, tous les jours pendant 15 minutes. Utilisation de l’Arduino nano s’il n’y pas besoin de log. Sinon on utilisera un Raspberry zero W qui enverra les informations sur domoticz
Matériel
- Kit d’arrosage https://www.amazon.fr/Eterbiz-dirrigation-dArrosage-Automatique-Irrigation/dp/B0824YH5W7/ref=psdc_4338694031_t2_B0831LFYZD (quelque chose comme ça mais pour 10m).
- Pompe 12 v pour bateau : https://www.puntoenergiashop.it/fr/les-pompes-de-cale/564-pompe-de-cale-380-gph-12v-8380056470043.html (il existe d’autres modèles moins chers mais je ne retrouve plus le lien).
- Batterie 12v (récupération voiture)
- Panneau solaire 12v
- Arduino, Arduino Nano ou Raspberry zero W
- relay 5v
- RTC DS3231 (facultatif)
Montage
Arduino + rtc + relay 5v
Raspberry
Code
Arduino Nano + relay
int pinOut = 6; //const int timeWork = 1800000; 30 minutes //const int timeWait = 84600000; 23h30 void setup() { Serial.begin(9600); pinMode(6, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); } void loop() { // ouverture du courant pour une durée de 30 minutes ; led allumé pour confirmation Serial.println("Ouverture pour 30 minutes"); digitalWrite(pinOut, HIGH); digitalWrite(LED_BUILTIN, HIGH); delay(1000); // fermeture du courant pour une durée de 23 heures et 30 minutes Serial.print("Fermeture pour 23 heures et 30 minutes "); digitalWrite(pinOut, LOW); digitalWrite(LED_BUILTIN, LOW); delay(1000); }
Cela ne nécessite rien comme librairie, le relai est connecté sur le Pin 6, mais le résultat est bof. L’idéal est de brancher également un module RTC qui s’occupera de gérer l’heure. Dans ce cas le code est un peu plus élaboré.
Arduino nano + relay 5v + RTC DS3132
#include <Wire.h> #include <DS3231.h> DS3231 clock; RTCDateTime dt; // paramétrage de l'alarme int heureAlarme = 18; int minuteAlarme = 15; int finMinuteAlarme = 30; // pin de controle d'alimentation de la pompe int pinOut = 6; void setup() { Serial.begin(9600); // Initialisation Serial.println("Initialisation du DS3231");; clock.begin(); // récupération de la date au moment de la compilation clock.setDateTime(__DATE__, __TIME__); // mode de controle du relais pinMode(6, OUTPUT); digitalWrite(pinOut, LOW); } void loop() { // récupération de l'heure dt = clock.getDateTime(); Serial.print("Heure actuelle (attente) : "); Serial.print(dt.hour);Serial.print(":");Serial.print(dt.minute);Serial.print(":");Serial.println(dt.second); if(dt.hour == heureAlarme && dt.minute == minuteAlarme) { //activation de la pompe Serial.println("Activation de la pompe"); digitalWrite(pinOut, HIGH); while(dt.minute < finMinuteAlarme) { dt = clock.getDateTime(); Serial.print("Heure actuelle (fonctionnement) : "); Serial.print(dt.hour);Serial.print(":");Serial.print(dt.minute);Serial.print(":");Serial.println(dt.second); delay(1000); } delay(1000); //desactivation de la pompe ; Serial.println("Désactivation de la pompe"); digitalWrite(pinOut, LOW); } delay(1000); }
Sur le même principe, cette fois ci l’alarme est gérée par une simple boucle puis une seconde boucle permet d’attendre la fin de l’alarme ; évidement cela ne fonctionne que pour des cas qui sont inférieurs à 60 minutes, sinon il faut rajouter une seconde condition à la boucle while.
Il existe une possibilité de gérer nativement les alarmes dans la librairie DS3231 ; mais je n’ai pas été fichu de comprendre comment cela fonctionnait… d’où la solution de contournement.
Enfin la dernière solution, usage d’un raspberry zero (en mutualisation avec d’autres projets)
Raspberry zero W + relay
Le script d’ouverture (récupéré sur ce site : https://blog.bandinelli.net/index.php?post/2015/07/18/Raspberry-Pi%2C-un-relai%2C-quelques-branchements-%3A-interrupteur-intelligent)
#! /usr/bin/python import RPi.GPIO as GPIO ## Import GPIO library GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) ## Use board pin numbering GPIO.setup(7, GPIO.OUT) ## Setup GPIO Pin 7 to OUT GPIO.output(7,True) ## Turn on GPIO pin 7
Le script de fermeture
#! /usr/bin/python import RPi.GPIO as GPIO ## Import GPIO library GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) ## Use board pin numbering GPIO.setup(7, GPIO.OUT) ## Setup GPIO Pin 7 to OUT GPIO.output(7,False) ## Turn on GPIO pin 7
Le déclenchement est géré directement par le crontab.
- https://journaldunarchiviste.fr/2019/01/15/domotique-poulailler-connecte-partie-2/ pour un exemple
- http://fr.wikipedia.org/wiki/Crontab
Pour la partie récupération des informations, il suffit d’ajouter un troisième script (send_domoticz.py) :
#! /usr/bin/python from requests.auth import HTTPBasicAuth import requests import sys # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # fonction # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def maj_widget(val_url): requete = 'http://' + domoticz_ip + ':' + domoticz_port + val_url # print requete r = requests.get(requete, auth=HTTPBasicAuth(user, password)) if r.status_code != 200: print("Erreur API Domoticz") # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # les parametres de Domoticz # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ domoticz_ip = '' domoticz_port = '8080' user = '' password = '' domoticz_idx = '' def status(value): state = '/json.htm?type=command¶m=udevice&idx=' + str(domoticz_idx) state += '&svalue=' state += value print(state) maj_widget(state)
Et rajouter dans les deux premiers :
#! /usr/bin/python#! import send_domoticz as domo #... #ouverture ou fermeture de la pompe #... domo.status("ouverture de la pompe") # ou bien domo.status("fermeture de la pompe")
Et après
Passage en production, une fois que j’aurai reçu le raccord entre le kit d’arrosage et la pompe…