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 :

  1. Démarrage/arrêt instantané
  2. Sécurité en cas de problème (pas d’inondation, détection des pannes)
  3. Affichage de l’état
  4. Programmable (minuterie marche/arrêt) pour éviter les perturbations nocturnes
  5. Détection autonome des niveaux d’humidité et déclenchement de l’arrosage
  6. 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) :

  1. Arduino UNO pour un démarrage instantané, et un gros bouton rouge pour couper rapidement l’électricité.
  2. Le programme détecte les anomalies et empêche les pompes d’arroser si besoin.
  3. Écran OLED I2C 128x64
  4. Bouton poussoir pour alterner entre les différents états du système.
  5. Le programme intéragit avec:
  6. 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 :

  1. 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”.
  2. 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
  3. 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.
  4. 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.
  5. 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.
  6. 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 :

Diagramme de machine à état pour les pompes.

Diagramme de machine à état pour les pompes.

Il existe plusieurs états pour le système :

  1. Le système est ON
    • La minuterie est ON (→ Passera à Système OFF, Minuterie ON)
    • La minuterie est OFF
  2. System is OFF
    • La minuterie est ON (→ Passera à Système ON, Minuterie ON)
    • La minuterie est OFF
  3. 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 :

Diagramme de la machine à état du système.

Diagramme de la machine à état du système.

Câblage

Pour être aussi clair que possible, voici le câblage que j’ai fait :

Câblage avec tous les composants.

Câblage avec tous les composants.

Vues du produit final

La vue de dessus, face au plafond dans les conditions habituelles.

La vue de dessus, face au plafond dans les conditions habituelles.

Vue de côté.

Vue de côté.

Vue de l’intérieur. Le circuit électrique et le circuit d’eau sont séparés, les pompes sont en bas pour éviter tout dommage en cas de fuite.

Vue de l’intérieur. Le circuit électrique et le circuit d’eau sont séparés, les pompes sont en bas pour éviter tout dommage en cas de fuite.

Quelques affichages des écrans avec différents états du système et des pompes.

Quelques affichages des écrans avec différents états du système et des pompes.

Partie codage

Le code est hébergé sur Github, disponible ici.

Il est divisé en trois parties :

  1. ligne 1 à 53 Déclaration des variables contenant la configuration et l’état du système
  2. ligne 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).
  3. 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 :

  1. Créer un nouvel état “Paramètres” et utiliser un potentiomètre pour faire varier les valeurs codées en dur
  2. 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 !