serre en avril

[Domotique] arrosage automatique de la serre – partie 1

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

Montage

Arduino + rtc + relay 5v

prototype arduino relay rtc ds3231
prototype avec arduino

Raspberry

Le test s'effectue sur une led au lieu de la pompe
prototype
Pour tester avec une LED

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.

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&param=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…