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…