Raspberry Pi, Python et arrosage des plantes d'intérieur

Je n'ai aucune relation avec les plantes d'intérieur. Le fait est que j'oublie de les arroser. Sachant cela, j'ai commencé à réfléchir sur le fait que quelqu'un, à coup sûr, avait déjà trouvé un moyen d'automatiser l'irrigation. Il s'est avéré qu'il existe de nombreuses façons. À savoir, nous parlons de solutions basées sur Arduino ou Raspberry Pi. Dans cet article, je veux parler de la façon dont j'ai créé un système basé sur Raspberry Pi et Python, conçu pour automatiser l'arrosage des plantes.



Composants et ressources utiles


Je voudrais tout de suite noter que je ne suis pas du tout un expert en électronique. S'ils me demandent de dessiner un schéma électrique ou de raconter en détail le fonctionnement d'un composant électronique, je ne peux rien dessiner ni dire. En fait, j'ai fait ce projet avec seulement des connaissances de base en électricité et juste en expérimentant avec des composants. Je vous demande d'être très prudent lorsque vous travaillez avec l'électricité. Et, si vous ressentez un manque de connaissances dans ce domaine, je suggère au moins un peu de compréhension de cela.

Voici une liste des composants que j'ai utilisés dans mon projet.


Je participe au programme d'affiliation Amazon, les liens ci-dessus sont donc fournis. Si vous passez par eux et achetez quelque chose, je gagnerai un peu.

Après avoir obtenu tous les composants dont j'ai besoin, il est temps de faire des recherches. Voici une liste de ressources qui m'ont aidé à connecter correctement les composants électroniques et à comprendre les principaux points concernant leur fonctionnement:


Voici un schéma des ports GPIO du Raspberry Pi.


Diagramme du port GPIO du Raspberry Pi

Connectez un relais au Raspberry Pi


J'ai commencé par connecter un relais au Raspberry Pi. Voici à quoi ça ressemble.


Connexion du relais au Raspberry Pi Le

fil rouge (femelle-femelle) va de la broche de la carte relais JD_VCC à la broche 5V (broche n ° 2) du Raspberry Pi. Un fil orange (femelle-femelle) mène de la broche de la carte relais VCC à la broche 3,3 V (broche n ° 1) du Raspberry Pi.


Broches JD_VCC et VCC de la carte relais

À l'aide de ces fils, nous alimentons la carte relais. Pour pouvoir contrôler des relais individuels, vous devez connecter la carte relais et le Raspberry Pi avec deux autres fils qui se connectent aux broches GND et IN1 de la carte relais.


Broches GND et IN1 de la carte relais Le

fil noir (femelle-femelle) est le câble de terre qui relie la broche GND de la carte relais et la broche de terre du Raspberry Pi (je l'ai connecté à la broche n ° 34). Un fil blanc (femelle-femelle) mène de la broche IN1 de la carte relais à la broche n ° 12 du Raspberry Pi. C'est ce fil blanc qui nous permet de contrôler par programmation le relais, en activant et désactivant les relais individuels situés sur la carte.


Fils noir et blanc connectés au Raspberry Pi

Si vous décidez de reproduire mon projet, vous pouvez organiser le relais et le Raspberry Pi pour communiquer en utilisant les broches appropriées. Mais gardez à l'esprit que si le schéma de connexion des composants de votre projet est différent du schéma de connexion des composants de mon projet, vous devrez apporter les modifications appropriées à mon code.

Connexion de l'alimentation au relais


Après avoir connecté la carte relais au Raspberry Pi, j'ai connecté l'alimentation à l'un des relais.

Ne branchez pas l'alimentation sur une prise de courant avant d'avoir terminé toutes les opérations de collecte des composants du système. Soyez conscient du risque de choc électrique.


Connexion de l'alimentation à l'un des relais L'

alimentation 12V utilisée par moi est livrée avec un adaptateur auquel il est pratique de connecter les fils de connexion. J'ai connecté le fil rouge (mâle-mâle) au connecteur «+» de l'adaptateur et le câble marron (mâle-mâle) au connecteur «-» de l'adaptateur. Ensuite, j'ai connecté le câble avec le connecteur «Crocodile» (femelle-mâle) au fil marron.


Adaptateur fourni avec l'alimentation électrique

La carte relais comporte quatre relais séparés. Chacun d'eux a trois broches auxquelles les câbles peuvent être connectés. Au centre de chaque relais se trouve un connecteur auquel la sortie positive d'une source d'alimentation externe est connectée. Sur la gauche se trouve le connecteur auquel l'entrée positive de l'appareil auquel l'alimentation doit être connectée est connectée.


Connexion d'un relais séparé

J'ai connecté un câble rouge de l'alimentation (borne positive) au contact central du relais. Ensuite, j'ai connecté le câble orange (mâle-mâle) au connecteur gauche du relais et connecté le câble avec le «crocodile» (femelle-mâle) à ce câble.


Câbles rouges et orange


Alimentation et adaptateur


Relais et Raspberry Pi

Connexion d'une pompe à eau à un relais


Il ne reste plus qu'à brancher les connecteurs «crocodiles» à la pompe à eau. L'ordre de leur connexion détermine le sens du débit d'eau.

J'ai donc eu besoin d'eau pour entrer dans le canal gauche de la pompe et sortir du canal droit. Par conséquent, j'ai connecté le connecteur «crocodile» du fil noir à la borne de pompe, près de laquelle il y a un point rouge, et l'autre «crocodile» à l'autre borne de pompe. Si je connectais les «crocodiles» dans un ordre différent - l'eau irait dans la direction opposée - du canal droit vers la gauche.


Connexion d'une pompe à eau à un relais


Système d'irrigation complet: l'eau pénètre dans la pompe par le canal de gauche, quitte la droite et va à l'usine

Le code


Nous sommes donc arrivés à ce que je suis vraiment bon. Nous sommes arrivés au code. Afin de faire fonctionner le logiciel avec les ports GPIO du Raspberry Pi, j'ai utilisé la bibliothèque gpiozero . Il est facile à utiliser, il cache de nombreux mécanismes de bas niveau au programmeur, que vous devez généralement comprendre pour quelqu'un qui veut travailler avec des broches GPIO. La bibliothèque est bien documentée.

Avant d'écrire du code, vous devez connecter un moniteur, une souris et un clavier à votre Raspberry Pi. Ou vous devez vous connecter au Raspberry Pi via SSH .

Après avoir entré Raspberry Pi, accédez au dossier Desktopet créez-y un dossier run. Créez un dossier dans ce dossier classes. Et dans le dossier, classescréez un fichier Hardware.py. Il doit avoir le code suivant:

from gpiozero import OutputDevice

class Relay(OutputDevice):
    def __init__(self, pin, active_high):
        super(Relay, self).__init__(pin, active_high)

Dans ce fichier, je viens de déclarer une nouvelle classe Relay, qui est la descendante de la classe OutputDevice .

Ensuite, dans le dossier, classesj'ai créé un nouveau fichier TimeKeeper.py:

import datetime

class TimeKeeper:
    def __init__(self, current_time):
        self.current_time = current_time
        self.time_last_watered = None
    
    def set_current_time(self, updated_time):
        self.current_time = updated_time

    def set_time_last_watered(self, updated_time):
        self.time_last_watered = updated_time

    @staticmethod
    def get_current_time():
        now = datetime.datetime.now()
        return now.strftime("%I:%M:%S %p")

Le but de cette classe est de suivre l'heure actuelle et le moment où le dernier arrosage a été effectué.

Ainsi, les fichiers Hardware.pyet se TimeKeeper.pytrouvent dans le dossier classes. Maintenant, en dehors de ce dossier, je crée un fichier water_plant.py:

from classes import Hardware
from classes import TimeKeeper as TK
import schedule
import smtplib
import time
import ssl

# WATERING_TIME must be in "00:00:00 PM" format
WATERING_TIME = '11:59:50 AM'
SECONDS_TO_WATER = 10
RELAY = Hardware.Relay(12, False)
EMAIL_MESSAGES = {
    'last_watered': {
        'subject': 'Raspberry Pi: Plant Watering Time',
        'message': 'Your plant was last watered at'
    },
    'check_water_level': {
        'subject': 'Raspberry Pi: Check Water Level',
        'message': 'Check your water level!',
    }
}

def send_email(time_last_watered, subject, message):
    port = 465
    smtp_server = "smtp.gmail.com"
    FROM = TO = "YOUR_EMAIL@gmail.com"
    password = "YOUR_PASSWORD"

    complete_message = ''
    if time_last_watered == False:
        complete_message = "Subject: {}\n\n{}".format(subject, message)
    else:
        complete_message = "Subject: {}\n\n{} {}".format(subject, message, time_last_watered)
    
    context = ssl.create_default_context()
    with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
        server.login(FROM, password)
        server.sendmail(FROM, TO, complete_message)

def send_last_watered_email(time_last_watered):
    message = EMAIL_MESSAGES['last_watered']['message']
    subject = EMAIL_MESSAGES['last_watered']['subject']
    send_email(time_last_watered, subject, message)

def send_check_water_level_email():
    message = EMAIL_MESSAGES['check_water_level']['message']
    subject = EMAIL_MESSAGES['check_water_level']['subject']
    send_email(False, subject, message)

def water_plant(relay, seconds):
    relay.on()
    print("Plant is being watered!")
    time.sleep(seconds)
    print("Watering is finished!")
    relay.off()

def main():
    time_keeper = TK.TimeKeeper(TK.TimeKeeper.get_current_time())
    if(time_keeper.current_time == WATERING_TIME):
        water_plant(RELAY, SECONDS_TO_WATER)
        time_keeper.set_time_last_watered(TK.TimeKeeper.get_current_time())
        print("\nPlant was last watered at {}".format(time_keeper.time_last_watered))
        # send_last_watered_email(time_keeper.time_last_watered)

# schedule.every().friday.at("12:00").do(send_check_water_level_email)

while True:
    # schedule.run_pending()
    time.sleep(1)
    main()

Ici, vous pouvez modifier les valeurs des variables WATERING_TIMEet SECONDS_TO_WATERcelles qui vous conviennent. La première variable détermine le temps d'arrosage des plantes. Le second définit la durée de l'arrosage.

De plus, j'ai créé ici un mécanisme d'envoi de notifications et de rappels par e-mail. Grâce à ce mécanisme, le propriétaire du système d'irrigation reçoit un e-mail chaque fois que le système est allumé et arrose les plantes. En outre, chaque vendredi, il reçoit une lettre lui rappelant qu'il doit vérifier l'approvisionnement en eau d'irrigation. Dans le code, l'appel des méthodes correspondantes est mis en commentaire, par conséquent, le programme peut fonctionner normalement sans paramètres relatifs à l'e-mail. Si vous souhaitez activer ces rappels, procédez comme suit:

  1. Vous devez entrer dans la ligne FROM = TO = «YOUR_EMAIL@gmail.com»et password = «YOUR_PASSWORD»votre adresse e-mail et mot de passe Gmail.
  2. Décommentez les lignes suivantes:

    •  # send_last_watered_email (time_keeper.time_last_watered)
    • # schedule.every (). friday.at ("12:00"). do (send_check_water_level_email)
    • # schedule.run_pending ()
  3. Vous devez aller ici , connectez-vous à votre compte Gmail et activez le commutateur sur cette page. Sinon, lorsque vous essayez d'envoyer un e-mail à l'aide de Gmail, vous recevrez un message d'erreur. 

De plus, il est important de noter que mon système de rappel ne fonctionne qu'avec les comptes Gmail.

Maintenant que tout est prêt pour le travail, vous devez obtenir la structure suivante de fichiers et de dossiers:

run
├── classes
│ ├── Hardware.py
│ └── TimeKeeper.py
└── water_plant.py

Un dossier runpeut en fait être placé n'importe où. J'ai décidé de le laisser dans le dossier Desktop.

Je n'étais pas attiré par la perspective de me connecter au Raspberry Pi à chaque fois que je devais le démarrer water_plant.py. J'aimerais que ce script s'exécute automatiquement lorsque le Raspberry Pi est allumé. Cela, par exemple, permettrait d'éteindre facilement le système, de le déplacer vers un autre endroit, de l'allumer et de ne se soucier de rien. Pour mettre en œuvre ce scénario attractif, nous avons besoin d'une équipe crontab.

Ouvrez la fenêtre du terminal sur le Raspberry Pi et entrez la commande suivante:

sudo crontab -e

En réponse, le système doit produire quelque chose ressemblant à celui illustré dans la figure suivante.


Configuration des tâches cron

Ajoutez la ligne suivante à ce fichier:

@reboot python3 /home/pi/Desktop/run/water_plant.py

Ensuite, ce fichier doit être enregistré en utilisant la combinaison de touches Ctrl+Xen entrant Yet en appuyant sur Enter.

Dans la ligne ci-dessus, nous donnons au Raspberry Pi les instructions suivantes: "Chaque fois que vous redémarrez, exécutez le fichier water_plant.pysitué dans le dossier runqui se trouve dans le dossier Desktop." Si votre dossier runse trouve d'une manière différente, modifiez cette commande en conséquence.

Sommaire


Consultez le code du projet ici . Si vous le souhaitez, vous pouvez immédiatement cloner votre référentiel avec cette commande:

git clone https://github.com/AlanConstantino/rpi-plant-project.git

C'est tout! Vous savez maintenant comment créer un système d'irrigation automatisé pour les plantes d'intérieur basé sur le Raspberry Pi. Elle sait arroser les plantes toutes les 24 heures et peut envoyer des notifications et des rappels par e-mail à son propriétaire.

Chers lecteurs! Comment feriez-vous pour développer un système d'arrosage automatisé à domicile?


All Articles