Zimmerpflanzen brauchen Aufmerksamkeit und wenn Sie am Schreibtisch sitzen und arbeiten, vergessen Sie manchmal, sich um sie zu kümmern. Unser Patient ist „Gary“, ein Gasteria-Sukkulente von Ikea, der sehr wenig Pflege braucht, und das bedeutet, dass ich vergesse, ihn zu gießen. Wie kann also die Raspberry Pi Pico W Kannst du mir helfen, besser auf Gary aufzupassen?
Bodenfeuchtesensoren messen die Leitfähigkeit des Bodens und senden den Wert als Spannung an den Raspberry Pi Pico W (oder einen anderen Mikrocontroller). Diese Spannung wird von einem analogen GPIO-Pin gelesen und in einen Wert zwischen 0 und 65535 umgewandelt. Je niedriger die Zahl, desto trockener ist der Boden. Dies kann dann als Auslöser zum Versenden einer Nachricht verwendet werden.
In dieser Anleitung lernen wir, wie man eine Reihe von Sensormessungen durchführt, deren Mittelwert ermittelt und daraus ermittelt, ob Gary etwas zu trinken braucht. Gary wird uns dann über einen Telegram-Bot eine Nachricht senden.
Für dieses Projekt benötigen Sie
Aufbau der Rennstrecke
Die Schaltung ist äußerst einfach. Wir haben einen Bodenfeuchtigkeitssensor, der an drei Pins des GPIO angeschlossen ist. Die ersten beiden Pins, 3V3 Power und GND, versorgen den Sensor mit der Energie, die er benötigt.
Der dritte Pin, Signal, ist ein Ausgangspin, der einen Wert an den Raspberry Pi Pico sendet. Der Ausgang ist eine Spannung, die der entsprechende GPIO als Wert zwischen 0 und 65535 liest. Dieser Wert wird dann im Code verwendet, um festzustellen, ob die Pflanze durstig ist.
Der Bodenfeuchtesensor wird wie folgt angeschlossen.
Farbe | Bodenfeuchtesensor | Raspberry Pi Pico |
---|---|---|
Rot | + / VCC | 3V3 (Physischer Pin 36) |
Gelb | S/Signal | GP26 |
Schwarz | – / GND | Beliebiger Erdungs-/GND-Pin |
Einrichten eines Telegram-Bots
Telegram ist ein benutzerfreundlicher Instant-Messaging-Dienst mit erfrischend einfachen Mitteln, mit denen wir von einem Raspberry Pi Pico W aus kommunizieren können. Mit einem Bot können wir einen Kanal erstellen, der unseren Zimmerpflanzen oder sogar der Sicherheit zu Hause gewidmet ist.
Das Erstellen eines Telegram-Bots ist ein einfacher Vorgang, und zum Glück steht uns The BotFather zur Seite, der uns dabei hilft.
1. Melden Sie sich bei Ihrem Telegram-Konto an. Für einen einfacheren Arbeitsablauf haben wir den Windows-Client verwendet.
2. Erstellen Sie einen Chat mit BotFather. BotFather ist ein Bot zum Erstellen und Verwalten von Bots.
3. Erstellen Sie mit dem Befehl /newbot einen neuen Bot und drücken Sie die Eingabetaste. BotFather erstellt einen Assistenten, der Sie durch den Bot-Erstellungsprozess führt.
/newbot
4. Notieren Sie sich den API-Schlüssel, es ist für das Projekt notwendig. Ohne dies können wir nicht über unseren Code mit dem Bot kommunizieren.
5. Erstellen Sie in Telegram einen neuen Chat mit IDBot und fragen Sie nach Ihrer ID. Notieren Sie sich den Ausweis.
/getid
Den Code schreiben
Der gesamte Projektcode ist in MicroPython geschrieben, wobei die allerneueste MicroPython-Version für den Raspberry Pi Pico W verwendet wird. Wir verwenden Thonny, um den Code direkt auf dem Raspberry Pi Pico W zu schreiben und zu testen.
1. Folge diesen Schritten um die neueste Version von MicroPython für den Raspberry Pi Pico W herunterzuladen. Die wichtigsten Schritte sind das Herunterladen und Installieren des UF2-Firmware-Images sowie die Einrichtung von Thonny. Der Rest ist optional.
2. Öffne Thonny Und Klicken Sie auf die Schaltfläche Stopp um die Verbindung zu aktualisieren. Dadurch wird sichergestellt, dass die Python-Shell geöffnet ist und ordnungsgemäß funktioniert.
3. Erstellen Sie eine neue Datei und Fügen Sie den Inhalt dieses Links ein. Speichern Sie die Datei als Statistics.py im Stammverzeichnis des Raspberry Pi Pico W. Bei dieser Datei handelt es sich um ein Modul, das alle statistischen Funktionen enthält, die zur Auswahl des Medianwerts aus einer Datenliste erforderlich sind. Das Projekt wurde erstellt von Roberto Colistete Junior.
4. Erstellen Sie eine neue Datei und da drin Erstellen Sie vier Objekte: SSID, PASSWORT, API und ID.
5. Weisen Sie dem SSID-Objekt den Namen Ihres WLAN-Zugangspunkts/Routers zu.
SSID = “YOUR WI-FI AP NAME HERE”
6. Vergeben Sie als Passwort das WLAN-Passwort.
PASSWORD = “YOUR SECRET PASSWORD”
7. Weisen Sie für die API den Telegram Bot API-Schlüssel zu. Stellen Sie sicher, dass sich der Schlüssel im „ “ befindet.
API = "YOUR TELEGRAM BOT API KEY"
8. Vergeben Sie als ID Ihre Telegram-Benutzer-ID. Stellen Sie sicher, dass die ID innerhalb von „“ steht, da dadurch der Wert als Zeichenfolge festgelegt wird.
ID = “YOUR USER ID HERE”
9. Speichern Sie die Datei unter dem Namen „secrets.py“ auf dem Raspberry Pi Pico W.
SSID = “YOUR WI-FI SSID”
PASSWORD “YOUR WI-FI PASSWORD”
API = “YOUR TELEGRAM BOT API KEY”
ID = “YOUR TELEGRAM USER ID”
10. Erstellen Sie eine neue Datei und importieren Sie eine Reihe von Python-Modulen.
A. Maschine enthält Funktionen und Klassen, die zur Verwendung des GPIO (Pin) und der analogen Eingänge (ADC) erforderlich sind.
B. Zeit wird verwendet, um dem Code eine Verzögerung hinzuzufügen.
C. Netzwerk stellt Wi-Fi-Verbindungen her.
D. Uranfragen (Mikroanfragen) ist eine MicroPython-Version von Anfragen, die zum Senden und Empfangen von Daten über ein Netzwerk verwendet werden.
e. Statistikenein Modul mit Funktionen zur statistischen Analyse von Daten.
F. Geheimnisseein Modul, das alle unsere WLAN-Details und API-Schlüssel enthält.
from machine import Pin, ADC
import time
import network
import urequests
import statistics
import secrets
11. Erstellen Sie ein Objekt, einen Sensor und stellen Sie eine Verbindung zum Bodenfeuchtesensor bei GPIO 26 her. Dieses Objekt stellt den Sensoreingang als analog ein und verwendet einen Wert zwischen 0 und 65535, um die Leitfähigkeit des Bodens darzustellen. Je höher die Zahl, desto besser ist die Leitfähigkeit.
sensor = ADC(Pin(26))
12. Erstellen Sie ein Objekt, WLAN, und stellen Sie damit eine Verbindung zu Ihrem WLAN-Zugangspunkt her. Die Verbindung wird aktiviert, dann verbinden wir uns mit der in Secrets.py gespeicherten SSID und dem PASSWORT mit dem Zugangspunkt. Eine Pause von fünf Sekunden lässt die Verbindung stabil werden, dann drucken wir den aktuellen Status der Verbindung aus. Wenn die Verbindung hergestellt ist, sehen wir TRUE, wenn die Verbindung fehlschlägt, sehen wir FALSE.
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets.SSID, secrets.PASSWORD)
time.sleep(5)
print(wlan.isconnected())
13. Erstellen Sie eine leere Liste mit dem Namen „Lesungen“. Eine Liste wird auch als Array bezeichnet und wir verwenden sie, um mehrere Werte in einem leicht lesbaren Format zu speichern.
readings = []
14. Erstellen Sie den ersten Teil einer try-except-Anweisung und legen Sie den Code so fest, dass eine while-True-Schleife ausgeführt wird. Versuchen Sie es, es sei denn, es handelt sich um eine Fehlerbehandlungsanweisung. Der Code versucht, den darin enthaltenen Inhalt auszuführen. Wenn jedoch eine Ausnahme oder ein Fehler auftritt, wird standardmäßig ein Codeabschnitt aufgerufen, der sich damit befasst.
try:
while True:
15. Erfassen Sie mithilfe einer for-Schleife fünf Messwerte vom Bodenfeuchtigkeitssensor und fügen Sie jeden Messwert in Intervallen von einer Sekunde zur Messwertliste hinzu. Dieser Codeabschnitt liest den mit dem Sensor verbundenen GPIO-Pin, übernimmt dann den Wert und speichert ihn in der Liste. Das Ausdrucken der Messwerte ist hilfreich, um etwaige Probleme zu beheben.
for i in range(5):
reading = sensor.read_u16()
readings.append(reading)
print(readings)
time.sleep(1)
16. Erstellen Sie außerhalb der for-Schleife ein Objekt, median_value und dort den Medianwert (Mittelwert) aus der Sammlung von Messwerten speichern.
median_value = statistics.median(readings)
17. Verwenden Sie eine bedingte Anweisung, um den Medianwert mit einem fest codierten Wert zu vergleichen. In unseren Tests haben wir 400 als den Punkt gewählt, an dem unsere Gasteria-Anlage Wasser benötigen würde. Passen Sie diesen Wert an die Bedürfnisse Ihrer Anlage an.
if median_value < 400:
18. Wenn die Pflanze Wasser benötigt, senden Sie mit Urequests eine Nachricht an Telegram und geben Sie dann eine Nachricht an die Python-Shell aus. Beachten Sie, dass wir Secrets.API verwenden, um unseren API-Schlüssel einzufügen, und Secrets.ID, um unsere Benutzer-ID zu senden. Die eigentliche Nachricht finden Sie hier: sendMessage?text=Gary ist durstig.
urequests.get("https://api.telegram.org/bot"+secrets.API+"/sendMessage?text=Gary is thirsty&chat_id="+secrets.ID)
print("Message Sent")
19. Mithilfe von else stellt die Pflanze fest, dass sie zu diesem Zeitpunkt über ausreichend Wasser verfügt und keines benötigt. Dies löst dann eine einstündige Verzögerung des Codes aus.
else:
print("Gary has enough water")
time.sleep(3600)
20. Erstellen Sie einen Ausnahmehandler zur Behandlung eines Betriebssystemfehlers (keine WLAN-Verbindung), der eine Meldung an die Python-Shell ausgibt. Die print(„@“*68)-Zeilen erzeugen dekorative Ränder über und unter der Nachricht.
except OSError:
print("@"*68)
print("@ Cannot connect to the Wi-Fi, please check your SSID and PASSWORD @")
print("@"*68)
21. Speichern Sie den Code als main.py auf dem Raspberry Pi Pico W. Dadurch wird der Pico W gezwungen, den Code jedes Mal zu laden, wenn er aus- und wieder eingeschaltet wird.
22. Schalten Sie den Pico W aus und wieder ein und warten Sie darauf, dass Ihre Zimmerpflanzen ihr Wasser verlangen!
Vollständige Codeliste
from machine import Pin, ADC
import time
import network
import urequests
import statistics
import secrets
sensor = ADC(Pin(26))
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets.SSID, secrets.PASSWORD)
time.sleep(5)
print(wlan.isconnected())
readings = []
try:
while True:
for i in range(5):
reading = sensor.read_u16()
readings.append(reading)
print(readings)
time.sleep(1)
median_value = statistics.median(readings)
if median_value < 400:
urequests.get("https://api.telegram.org/bot"+secrets.API+"/sendMessage?text=Gary is thirsty&chat_id="+secrets.ID)
print("Message Sent")
else:
print("Gary has enough water")
time.sleep(3600)
except OSError:
print("@"*68)
print("@ Cannot connect to the Wi-Fi, please check your SSID and PASSWORD @")
print("@"*68)