Raspberry Pi, Python und Bewässerung von Zimmerpflanzen

Ich habe keine Beziehung zu Zimmerpflanzen. Tatsache ist, dass ich vergesse, sie zu gießen. Als ich das wusste, begann ich darüber nachzudenken, dass sicherlich schon jemand einen Weg gefunden hatte, die Bewässerung zu automatisieren. Wie sich herausstellte, gibt es viele Möglichkeiten. Wir sprechen nämlich über Lösungen, die auf Arduino oder Raspberry Pi basieren. In diesem Artikel möchte ich darüber sprechen, wie ich ein System basierend auf Raspberry Pi und Python erstellt habe, das zur Automatisierung von Bewässerungsanlagen entwickelt wurde.



Komponenten und nützliche Ressourcen


Ich möchte sofort darauf hinweisen, dass ich überhaupt kein Experte für Elektronik bin. Wenn sie mich bitten, ein elektrisches Diagramm zu zeichnen oder detailliert zu erklären, wie eine elektronische Komponente funktioniert, kann ich nichts Sinnvolles zeichnen oder erzählen. Tatsächlich habe ich dieses Projekt nur mit Grundkenntnissen in Elektrizität durchgeführt und nur mit Komponenten experimentiert. Ich bitte Sie, sehr vorsichtig mit Elektrizität umzugehen. Und wenn Sie einen Mangel an Wissen in diesem Bereich verspüren, empfehle ich zumindest ein wenig Verständnis dafür.

Hier ist eine Liste der Komponenten, die ich in meinem Projekt verwendet habe.


Ich nehme am Amazon-Partnerprogramm teil, daher werden die obigen Links bereitgestellt. Wenn Sie sie durchgehen und etwas kaufen, werde ich ein wenig verdienen.

Nachdem ich alle benötigten Komponenten erhalten habe, ist es Zeit für Nachforschungen. Das Folgende ist eine Liste von Ressourcen, die mir geholfen haben, elektronische Komponenten richtig anzuschließen und die wichtigsten Punkte hinsichtlich ihrer Funktionsweise zu verstehen:


Hier ist ein Diagramm der GPIO-Ports des Raspberry Pi.


Raspberry Pi GPIO Port Diagramm

Schließen Sie ein Relais an den Raspberry Pi an


Ich begann damit, ein Relais an den Raspberry Pi anzuschließen. So sieht es aus.


Anschließen des Relais an den Raspberry Pi Das

rote Kabel (Buchse-Buchse) verläuft vom Pin der JD_VCC-Relaisplatine zum 5-V-Pin (Pin Nr. 2) des Raspberry Pi. Ein orangefarbener Draht (weiblich-weiblich) führt vom Pin der VCC-Relaisplatine zum 3,3-V-Pin (Pin Nr. 1) des Raspberry Pi.


Pins JD_VCC und VCC der Relaisplatine

Mit diesen Kabeln versorgen wir die Relaisplatine mit Strom. Um einzelne Relais steuern zu können, müssen Sie die Relaisplatine und den Raspberry Pi mit zwei weiteren Drähten verbinden, die mit den GND- und IN1-Pins der Relaisplatine verbunden sind.


Die GND-Pins und IN1 der Relaisplatine Die Buchse

( Buchse ) ist das Erdungskabel , das den GND-Pin der Relaisplatine und die Erdungsklemme des Raspberry Pi verbindet (ich habe es mit Pin Nr. 34 verbunden). Ein weißer Draht (weiblich-weiblich) führt von Pin IN1 der Relaisplatine zu Pin Nr. 12 des Raspberry Pi. Mit diesem weißen Kabel können wir das Relais programmgesteuert steuern und die einzelnen Relais auf der Platine ein- und ausschalten.


An den Raspberry Pi angeschlossene Schwarz-Weiß-Drähte

Wenn Sie mein Projekt reproduzieren möchten, können Sie das Relais und den Raspberry Pi so anordnen, dass sie über geeignete Pins kommunizieren. Beachten Sie jedoch, dass Sie die entsprechenden Änderungen an meinem Code vornehmen müssen, wenn sich das Verbindungsdiagramm der Komponenten Ihres Projekts vom Verbindungsdiagramm der Komponenten meines Projekts unterscheidet.

Anschließen der Stromversorgung an das Relais


Nachdem ich die Relaisplatine an den Raspberry Pi angeschlossen hatte, schloss ich die Stromversorgung an eines der Relais an.

Schließen Sie das Netzteil erst an eine Steckdose an, wenn Sie alle Systemkomponenten-Erfassungsvorgänge abgeschlossen haben. Beachten Sie die Gefahr eines Stromschlags.


Anschließen des Netzteils an eines der Relais Das

von mir verwendete 12-V-Netzteil wird mit einem Adapter geliefert, an den die Anschlusskabel bequem angeschlossen werden können. Ich habe das rote Kabel (Stecker-Stecker) an den Adapter-Stecker „+“ und das braune Kabel (Stecker-Stecker) an den Adapter-Stecker „-“ angeschlossen. Dann habe ich das Kabel mit dem „Crocodile“ -Anschluss (Buchse-Stecker) an den braunen Draht angeschlossen.


Mit dem Netzteil gelieferter Adapter

Die Relaisplatine verfügt über vier separate Relais. Jeder von ihnen hat drei Pins, an die Kabel angeschlossen werden können. In der Mitte jedes Relais befindet sich ein Anschluss, an den der positive Ausgang einer externen Stromquelle angeschlossen ist. Links befindet sich der Anschluss, an den der positive Eingang des Geräts angeschlossen ist, an das die Stromversorgung angeschlossen werden soll.


Anschließen eines separaten Relais

Ich habe ein rotes Kabel von der Stromversorgung (Pluspol) an den zentralen Kontakt des Relais angeschlossen. Dann habe ich das orangefarbene Kabel (Stecker-Stecker) an den linken Stecker des Relais angeschlossen und das Kabel mit dem „Krokodil“ (Stecker-Stecker) an dieses Kabel angeschlossen.


Rote und orange Kabel


Netzteil und Adapter


Relais und Himbeer-Pi

Anschließen einer Wasserpumpe an ein Relais


Jetzt müssen nur noch die Anschlüsse „Krokodile“ an die Wasserpumpe angeschlossen werden. Die Reihenfolge ihrer Verbindung bestimmt die Richtung des Wasserflusses.

Also brauchte ich Wasser, um in den linken Kanal der Pumpe zu gelangen und den rechten Kanal zu verlassen. Daher habe ich den „Krokodil“ -Anschluss des schwarzen Kabels an den Pumpenanschluss angeschlossen, in dessen Nähe sich ein roter Punkt befindet, und das andere „Krokodil“ an den anderen Pumpenanschluss. Wenn ich die „Krokodile“ in einer anderen Reihenfolge verbinden würde - das Wasser würde in die entgegengesetzte Richtung fließen - vom rechten Kanal nach links.


Anschließen einer Wasserpumpe an ein Relais


Komplettes Bewässerungssystem: Wasser tritt durch den linken Kanal in die Pumpe ein, verlässt den rechten und gelangt zur Anlage

Der Code


Also haben wir das erreicht, was ich wirklich gut kann. Wir sind zum Code gekommen. Um die Software mit den GPIO-Ports des Raspberry Pi zum Laufen zu bringen , habe ich die gpiozero- Bibliothek verwendet . Es ist einfach zu bedienen und verbirgt viele einfache Mechanismen vor dem Programmierer, die Sie normalerweise für jemanden verstehen müssen, der mit GPIO-Pins arbeiten möchte. Die Bibliothek ist gut dokumentiert.

Bevor Sie Code schreiben, müssen Sie einen Monitor, eine Maus und eine Tastatur an Ihren Raspberry Pi anschließen. Oder Sie müssen über SSH eine Verbindung zum Raspberry Pi herstellen .

Nachdem Sie Raspberry Pi eingegeben haben, gehen Sie zum Ordner Desktopund erstellen Sie dort einen Ordner run. Erstellen Sie einen Ordner in diesem Ordner classes. classesErstellen Sie im Ordner eine Datei Hardware.py. Es sollte den folgenden Code haben:

from gpiozero import OutputDevice

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

In dieser Datei habe ich gerade eine neue Klasse deklariert Relay, die der Nachkomme der OutputDevice- Klasse ist .

Als nächstes habe classesich im Ordner eine neue Datei erstellt 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")

Der Zweck dieser Klasse ist es, die aktuelle Zeit und den Zeitpunkt zu verfolgen, zu dem das letzte Mal bewässert wurde.

Also die Dateien Hardware.pyund TimeKeeper.pysind im Ordner classes. Außerhalb dieses Ordners erstelle ich jetzt eine Datei 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()

Hier können Sie die Werte von Variablen WATERING_TIMEund SECONDS_TO_WATERdiejenigen ändern, die für Sie geeignet erscheinen. Die erste Variable bestimmt, wann die Pflanzen gegossen werden müssen. Die zweite legt die Bewässerungsdauer fest.

Außerdem habe ich hier einen Mechanismus zum Versenden von Benachrichtigungen und Erinnerungen per E-Mail erstellt. Dank dieses Mechanismus erhält der Besitzer des Bewässerungssystems jedes Mal eine E-Mail, wenn das System eingeschaltet wird und die Pflanzen bewässert werden. Außerdem erhält er jeden Freitag einen Brief, in dem er daran erinnert wird, dass er die Versorgung mit Bewässerungswasser überprüfen muss. Im Code wird der Aufruf der entsprechenden Methoden auskommentiert, so dass das Programm ohne Einstellungen in Bezug auf E-Mail normal arbeiten kann. Wenn Sie diese Erinnerungen aktivieren möchten, gehen Sie wie folgt vor:

  1. Sie müssen in die Zeile FROM = TO = «YOUR_EMAIL@gmail.com»und password = «YOUR_PASSWORD»Ihre Google Mail-E-Mail-Adresse und Ihr Passwort eingeben.
  2. Kommentieren Sie die folgenden Zeilen aus:

    •  # send_last_watered_email (time_keeper.time_last_watered)
    • # Schedule.every (). friday.at ("12:00"). do (send_check_water_level_email)
    • # sched.run_pending ()
  3. Sie müssen hierher gehen , sich bei Ihrem Google Mail-Konto anmelden und den Schalter auf dieser Seite aktivieren. Andernfalls wird beim Versuch, eine E-Mail mit Google Mail zu senden, eine Fehlermeldung angezeigt. 

Außerdem ist zu beachten, dass mein Erinnerungssystem nur mit Google Mail-Konten funktioniert.

Jetzt, da alles für die Arbeit bereit ist, sollten Sie die folgende Struktur von Dateien und Ordnern erhalten:

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

Ein Ordner runkann tatsächlich überall abgelegt werden. Ich beschloss, es im Ordner zu belassen Desktop.

Ich war nicht von der Aussicht angezogen, mich jedes Mal mit dem Raspberry Pi zu verbinden, wenn ich ihn starten musste water_plant.py. Ich möchte, dass dieses Skript automatisch ausgeführt wird, wenn Raspberry Pi aktiviert ist. Dies würde es beispielsweise einfach machen, das System auszuschalten, an einen anderen Ort zu verschieben, einzuschalten und sich um nichts kümmern zu müssen. Um dieses attraktive Szenario umzusetzen, brauchen wir ein Team crontab.

Öffnen Sie das Terminalfenster auf dem Raspberry Pi und geben Sie den folgenden Befehl ein:

sudo crontab -e

Als Reaktion darauf sollte das System etwas ausgeben, das dem in der folgenden Abbildung gezeigten ähnelt.


Cron-Tasks konfigurieren

Fügen Sie dieser Datei die folgende Zeile hinzu:

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

Dann muss diese Datei mit der Tastenkombination Ctrl+Xdurch Eingabe Yund Drücken gespeichert werden Enter.

In der obigen Zeile geben wir dem Raspberry Pi die folgenden Anweisungen: "Führen Sie bei jedem Neustart die Datei aus, die water_plant.pysich in dem Ordner runbefindet , der sich im Ordner befindet Desktop." Wenn sich Ihr Ordner runanders befindet, bearbeiten Sie diesen Befehl entsprechend.

Zusammenfassung


Den Projektcode finden Sie hier . Wenn Sie möchten, können Sie Ihr Repository sofort mit dem folgenden Befehl klonen:

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

Das ist alles! Jetzt wissen Sie, wie Sie ein automatisiertes Bewässerungssystem für Zimmerpflanzen auf der Basis des Raspberry Pi erstellen. Sie weiß, wie man Pflanzen alle 24 Stunden gießt und kann ihrem Besitzer E-Mail-Benachrichtigungen und Erinnerungen senden.

Liebe Leser! Wie würden Sie ein automatisiertes Pflanzenbewässerungssystem für zu Hause entwickeln?


All Articles