Système d'arrosage automatique des plantes avec Arduino
Pourquoi ?
Je voulais construire un système capable d’arroser mes plantes, avec un entretien minime.
Le système doit répondre à ces exigences :
- Démarrage/arrêt instantané
- Sécurité en cas de problème (pas d’inondation, détection des pannes)
- Affichage de l’état
- Programmable (minuterie marche/arrêt) pour éviter les perturbations nocturnes
- Détection autonome des niveaux d’humidité et déclenchement de l’arrosage
- Contrôler l’état de chaque pompe
Matériel utilisé
Pour répondre à chacune des exigences de ce système, et maintenir le prix au plus bas possible, j’ai utilisé cette liste de matériel (chaque numéro correspond aux numéros des exigences) :
- Arduino UNO pour un démarrage instantané, et un gros bouton rouge pour couper rapidement l’électricité.
- Le programme détecte les anomalies et empêche les pompes d’arroser si besoin.
- Écran OLED I2C 128x64
- Bouton poussoir pour alterner entre les différents états du système.
- Le programme intéragit avec:
- 2x Senseurs d’humidité dans le sol pour la détection
- 2x Pompes submersibles 12V
- 2x Relais 12V pour alimenter les pompes
- Interrupteurs ON/OFF
Et beaucoup de câbles, ainsi que des gaines thermorétractables, et une breadboard.
Explication du logiciel
Chaque pompe a un statut :
- READY: La pompe est activée et attend que toutes les conditions soient réunies avant de se déclencher. L’événement qui empêche la pompe de se déclencher est affiché dans la colonne “wait”.
- RUN: S’il n’y a pas d’événement dans la colonne “wait”, la pompe arrose la plante jusqu’à la fin du délai d’activité. → Passera en mode PAUSED
- PAUSED: La pompe est désactivée après avoir arrosé, et attend la fin d’un délai avant de revenir à l’état READY. Cela permet d’assurer un délai entre 2 activations pour laisser l’eau s’infiltrer dans le sol et atteindre le capteur. Le délai est affiché dans la colonne “wait” de la pompe.
- LVL_ERR: La lecture du capteur est anormale (moins de 10% ou plus de 90% d’humidité). La pompe ne doit pas fonctionner tant que les relevés d’humidité ne sont pas revenus à la normale.
- BLOCKED: Une anomalie est détectée, soit la pompe ne fonctionne pas (par exemple, problème électrique, plus d’eau dans le réservoir…), soit le senseur est cassé. Cet état est déclenché automatiquement lorsque le niveau d’humidité n’a pas augmenté d’au moins 2% après 3 arrosages successifs. Par sécurité, la seule façon de débloquer une pompe est de passer en mode manuel et de vérifier la pompe bloquée.
- OFF : L’interrupteur de la pompe est réglé sur la position OFF. La pompe est désactivée.
Les évennements “wait” sont les suivants: Un délai, un état de la pompe (attendre que la pompe soit à ON), un rafraîchissement de la lecture du senseur, un état du système (attendre que le système soit à ON), un niveau d’humidité.
Voici le diagramme de la machine à état pour chaque pompe :
Il existe plusieurs états pour le système :
- Le système est ON
- La minuterie est ON (→ Passera à Système OFF, Minuterie ON)
- La minuterie est OFF
- System is OFF
- La minuterie est ON (→ Passera à Système ON, Minuterie ON)
- La minuterie est OFF
- Manual Mode
Dans les modes 1 et 2, les deux interrupteurs sont utilisés pour activer ou désactiver chaque pompe (enabled signifie que l’état de la pompe est READY).
En Manual Mode, les interrupteurs déclenchent l’arrosage des pompes, elles fonctionneront jusqu’à ce que l’interrupteur soit éteint (état des pompes RUNNING).
Alterner entre les modes se fait avec le bouton poussoir de contrôle d’état, pour entrer dans le Manual Mode, tous les interrupteurs des pompes doivent être éteints.
Voici le diagramme de la machine à états correspondante aux états du système :
Câblage
Pour être aussi clair que possible, voici le câblage que j’ai fait :
Vues du produit final
Partie codage
Le code est hébergé sur Github, disponible ici.
Il est divisé en trois parties :
ligne 1 à 53
Déclaration des variables contenant la configuration et l’état du systèmeligne 54 à 302
La partie commande de l’affichage : affiche la bonne vue en fonction de l’état de la machine (Système et minuteurs ON/OFF ou mode test), et de l’état de chaque composant (niveau d’humidité, seuil d’activation des pompes, état des pompe).Ligne 304 à 477
partie contrôle du système.
Améliorations
Après avoir terminé ce projet, j’ai quelques idées sur la façon de l’améliorer et sur ce que je voudrais changer.
Pour l’esthétique, j’ai utilisé une boîte de champagne qui traînait. Un boîtier imprimée en 3D aurait pu être un meilleur choix.
En ce qui concerne le code, tout est dans le même fichier. La programmation orientée objet pourrait être mieux adaptée, une classe pour l’affichage, une classe pour la pompe, une classe pour le capteur.
J’ai utilisé des pompes à moteur sans balais. Elles fonctionnent bien tant qu’il y a de l’eau sous pression dans le tuyau d’entrée : le réservoir d’eau doit être au-dessus de la pompe. Les pompes à vide sont plus chères mais elles fonctionnent même si le réservoir d’eau est plus bas que les pompes.
Le seuil d’humidité est codé en dur pour chaque capteur, ce qui signifie que si vous changez de plante, vous devez modifier le code pour qu’il corresponde aux besoins en humidité de la plante, et mettre à jour l’arduino (c’est pourquoi le câble USB de débogage est toujours dans la boîte à champagne 🧙♂️). Je vois deux façons de résoudre ce problème :
- Créer un nouvel état “Paramètres” et utiliser un potentiomètre pour faire varier les valeurs codées en dur
- Virage vers l’IoT 🚀 Un moyen rapide est de configurer MQTT pour envoyer et recevoir des données
Pro Tips 🌱
J’ai une Calathea, et elle semble vraiment apprécier une humidité de 60 %. Elle n’a pas cessé de grandir pendant ces 7 derniers mois !
Edit:
Un grand merci à Pierre Fontaine, qui a suggéré d’ajouter les diagrammes de machines d’état et plusieurs améliorations à cet article !