Arrosage automatique piloté par un BeagleBone Black

Arrosage automatique piloté par un BeagleBone Black

Les beaux jours et le soleil sont de retour. Il est temps de se préoccuper de choisir une bonne solution d'arrosage automatique pour le jardin, si l'on veut être certain d'avoir quelque chose qui fonctionne vraiment bien au moment des premières grosses chaleurs. Avez-vous déjà un système d'arrosage automatique centralisé ? Si oui, nous allons voir ici comment le rendre plus intelligent à l'aide d'un BeagleBone Black et d'un module Yoctopuce.



Le principe d'un arrosage automatique par minuterie n'est pas mauvais. Le bon moment pour arroser est avant tout défini par l'heure du jour: soit à l'aube, soit en toute fin de journée (voire la nuit). Ceci minimise les pertes par évaporation, qui peuvent sinon atteindre 60% de l'eau consommée. Le seul problème, c'est que la fréquence d'arrosage nécessaire varie grandement en fonction de la météo passée et à venir.

Faute de mieux, on peut arroser tous les deux jours sans se poser de question, et rallonger la durée sur le programmateur pendant les mois chauds. Mais c'est un énorme gaspillage: même sous nos latitudes, l'arrosage d'une surface cultivée (fleurs, potager, etc.) de 200m2 utilise chaque année jusqu'à 100'000 litres d'eau! Il y a donc matière à faire des économies considérables en arrosant que lorsque c'est nécessaire.

La solution standard

Une méthode standard consiste à couper l'arrosage quand il a "bien plu" avant, en utilisant un détecteur d'humidité.

 
Un détecteur d'humidité low-tech Mini-Click de Hunter: lorsque les rondelles de liège sont gonflées d'humidité, elles appuient sur l'interrupteur situé au fond de la cavité.



Les programmateurs d'arrosage centralisés disposent en général d'une entrée pour une sonde d'humidité comme celle-ci. Lorsque ce n'est pas le cas, il est aussi possible de la brancher directement sur l'alimentation 24V des électro-vannes, car les systèmes d'arrosage centralisés utilisent des vannes qui se ferment automatiquement au repos. Ainsi, lorsque l'alimentation des vannes est coupée par le capteur d'humidité, l'arrosage est désactivé même si le programmateur tourne encore.

Les deux branchements possibles d'un détecteur d'humidité 'normalement fermé'
Les deux branchements possibles d'un détecteur d'humidité 'normalement fermé'



Ca a l'avantage d'être très simple. Le problème, c'est que les seuils de d'enclenchement et de déclenchement sont mal spécifiés et peu contrôlables. Or un système de contrôle automatique dont les paramètres sont mal définis et dont le contrôle nécessite d'aller voir sous la pluie si des gouttes sortent ou non d'un tuyau, c'est un peu une bouteille à la mer. Sans parler des l'arrosages inutiles avant les orages nocturnes estivaux que le détecteur d'humidité ne pourra pas anticiper.

La solution connectée

On peut faire beaucoup mieux à peu de frais. L'idée consiste à remplacer remplacer le détecteur d'humidité low-tech par un simple relais USB piloté par un mini-PC, qui pourra décider des périodes d'arrosage de manière plus déterministe et surtout vous en informer sur votre smartphone. Nous utiliserons ici un BeagleBone Black, mais un Rasberry Pi pourrait aussi l'affaire puisque la pile USB ne sera pas trop sollicitée dans cette application.

On remplace le détecteur d'humidité 'normalement fermé' par un relais USB 'normalement fermé'
On remplace le détecteur d'humidité 'normalement fermé' par un relais USB 'normalement fermé'



Par principe de précaution, on connecte le système d'arrosage sur la borne A du Yocto-PowerRelay, qui est la position "normalement fermée". Ainsi, en cas de panne de l'informatique de contrôle, l'arrosage retournera en fonctionnement sur simple minuterie en attendant que vous puissiez résoudre le problème.

Notre système d'arrosage automatique piloté par BeagleBone Black
Notre système d'arrosage automatique piloté par BeagleBone Black


Pour prendre la décision d'arroser ou pas, une solution simple consiste à utiliser un service de relevé et de prévision météorologique. A moins que vous habitiez dans une rare singularité météorologique, il y a toute les chances que l'interpolation des conditions de température et de précipitation relevées aux stations les plus proches de chez vous donne une information plus utilisables qu'un bouchon mouillé dans votre jardin. Et de plus, vous pourrez utiliser les prévisions des prochaines 24h, qui ont elles aussi toutes les chances d'être correctes.

Récupérer les données météo

Nous utiliserons l'API gratuite de OpenWeatherMap, mais vous pourrez facilement en utiliser un autre service comme forecast.io si vous désirez des informations plus complètes: toutes ces API fonctionnent sur un principe similaire.

On obtient le dernier relevé météorologique par une simple requête HTTP en passant en paramètre le lieu désiré. La structure JSON est facilement décodée dans la plupart des langages, y compris en Python que nous utiliserons pour cet exemple:

LOCATION = "Cartigny,ch" # Use the nearest place or city
URL = "http://api.openweathermap.org/data/2.5"

class WeatherInfo:
    def __init__(self, record):
        self.time = time.strftime("%Y-%m-%d %H:%M:%S",
                                  time.localtime(record['dt']))
        self.temp = math.ceil((record['main']['temp'] - 273.15) * 10) / 10
        self.rain = 0
        if 'rain' in record: self.rain = record['rain']['3h']

def currWeather():
    response = requests.get(URL+"/weather?q="+LOCATION)
    if response.status_code != 200: return None
    return WeatherInfo(response.json())


Le résultat est un objet de ce type:

{'temp': 14.4, 'rain': 0, 'time': '2014-04-15 17:20:00'}


La fonction qui retourne les prévisions pour les 24h à venir est très similaires:

def comingWeather():
    response = requests.get(URL+"/forecast?q="+LOCATION)
    res = []
    if response.status_code == 200:
        now = time.time()
        for entry in response.json()['list']:
            # only return forecasts for the coming 24h
            entryTime = entry['dt']
            if entryTime >= now+3600 and entryTime < now+86400:
                res.append(WeatherInfo(entry))
    return res


Le tableau de prévision retourné ressemblera à cela:

{'rain': 0, 'temp': 11.2, 'time': '2014-04-15 20:00:00'}
{'rain': 0, 'temp': 8.8, 'time': '2014-04-15 23:00:00'}
{'rain': 0, 'temp': 7.0, 'time': '2014-04-16 02:00:00'}
{'rain': 0, 'temp': 4.3, 'time': '2014-04-16 05:00:00'}
{'rain': 0, 'temp': 3.2, 'time': '2014-04-16 08:00:00'}
{'rain': 0, 'temp': 10.2, 'time': '2014-04-16 11:00:00'}
{'rain': 0, 'temp': 14.1, 'time': '2014-04-16 14:00:00'}
{'rain': 0, 'temp': 15.2, 'time': '2014-04-16 17:00:00'}



La commande d'arrosage

Il ne reste plus qu'à ajouter la logique pour décider quand désactiver l'arrosage. La méthode choisie consiste à enregistrer les conditions météorologiques 4 fois par heure, et à décider chaque jour au moment d'arroser si c'est vraiment nécessaire en estimant l'évapotranspiration et les précipitations reçues.

history = []
while True:
    # wait for approx 1 minute
    YAPI.Sleep(58*1000)
    now = time.localtime()
    print("Now %02d:%02d" % (now.tm_hour, now.tm_min))

    # Archive weather event records every 15 min
    if (now.tm_min % 15) == 0:
        YAPI.Sleep(3*1000)
        history.append(currWeather())

    # Evaluate the need for water at 7:45PM
    if now.tm_hour == 19 and now.tm_min == 45:
        # Integrate water history from recent events
        sum_rain = 0
        sum_etp = 0
        for event in history:
            if event.rain > 0:
                sum_rain += event.rain / 12
            elif event.temp > 10:
                sum_etp += 0.01 * (event.temp - 10)


La logique de décision est la suivante: si l'apport en eau est nettement positif, on n'arrose pas. Si il est clairement déficitaire, on arrose. Sinon, on arrose au minimum tous les 3 jours.

        if sum_rain < 2:
            dryDays += 1
        period = "last "+str(len(history)/4)+"h"
        if sum_rain - sum_etp > 3:
            watering = False
            reason = str(sum_rain)+"mm rain in "+period
        elif sum_etp - sum_rain > 5:
            watering = True
            reason = str(sum_rain)+"mm water missing in "+period
        elif dryDays >= 3:
            watering = True
            reason = "No water for last "+str(dryDays)+" days"
        else:
            watering = False
            reason = "Enough water for now"


Et bien sur, on annule l'arrosage si il va pleuvoir au moins 3mm dans les 24h:

        forecast = comingWeather()
        if watering:
            new_rain = 0
            for event in forecast:
                new_rain += event.rain
            if new_rain >= 3:
                watering = False
                reason += " but "+str(new_rain)+"mm rain is coming"


Il ne reste qu'à commuter le relais en position ouverte (pour 90 minutes) lorsque l'arrosage doit être désactivé, et à me tenir informer du bon fonctionnement du système. Grâce à la fonction pulse du Yocto-PowerRelay, on est certain que même en cas d'arrêt inopiné du logiciel de contrôle, l'arrosage ne sera pas désactivé plus d'un cycle.

        # Apply decision (open relay for 90 min to disable watering today)
        if not watering:
            relay.pulse(90*60*1000)

        # Keep me informed of what is going on
        subject = "Watering" if watering else "No watering"
        body = reason + ".\r\n\r\nWeather records:\r\n"
        for event in history:
            body += pprint.pformat(vars(event)) + "\r\n"
        body += "\r\nForecast:\r\n"
        for event in forecast:
            body += pprint.pformat(vars(event)) + "\r\n"
        sendMail(subject, body)



Vous trouverez le fichier source au complet sur GitHub. Et voilà le résultat:

Enfin un arrosage automatique qui explique ce qu'il fait !
Enfin un arrosage automatique qui explique ce qu'il fait !



Si vous aimez raffiner, vous pouvez bien entendu améliorer le système de contrôle. Vous pouvez aussi faire varier la durée d'arrosage en coupant la vanne en cours d'arrosage. Vous pouvez aussi compléter votre système de contrôle par un Yocto-Meteo, un détecteur de pluie ou une sonde d'humidité du sol connectée à un Yocto-4-20mA-Rx... ou même un Mini-Click connecté à un Yocto-Button si vous voulez intégrer la décision qu'aurait prise le bouchon de liège. Grâce au remplacement d'un capteur "opaque" par une décision logique programmable et explicables, vous serez en mesure de parfaire votre arrosage tout en réduisant au maximum votre consommation d'eau.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.