Die 8 $ Raspberry Pi Pico W ist ein wunderbares kleines Brett. Während der weltweiten Chip-Versorgungsknappheit hat es ein ziemlich großes Loch in der Form eines Raspberry Pi gestopft Raspberry Pi-Inventar und den Herstellern eine kostengünstige, benutzerfreundliche IoT-Plattform (Internet der Dinge) zur Verfügung gestellt. Sicherlich ist es nicht der erste mit dem Internet verbundene Mikrocontroller (über diese Ehre können wir in den Kommentaren sprechen), aber für viele Raspberry Pi Fans war es ihr erster Schritt in die wunderbare Welt der Mikrocontroller.
Während auf dem Raspberry Pi ein vollständiges Linux-Betriebssystem läuft, ist der Raspberry Pi Pico W auf Firmware angewiesen, um eine Ebene bereitzustellen, auf der wir unseren Code schreiben können. MicroPython ist eine der offiziell unterstützten Sprachen und hat viele Verbesserungen erfahren, um dem Raspberry Pi Pico gerecht zu werden. Eine Verbesserung war die Einbindung von Urequests (Mikroanfragen), die es unserem Pico W ermöglichen, HTTP-Anfragen zu senden und zu empfangen.
In dieser Anleitung verwenden wir Urequests zusammen mit ntfy.sh, ein kostenloser Dienst und eine App für Android- und Apple-Geräte, die Nachrichten von IoT-Geräten abfangen und auf Ihrem Gerät anzeigen können. Wir werden es verwenden, um Alarme an unser Android-Handy zu senden, Alarme, die von einem PIR-Sensor (Passiv-Infrarot) ausgelöst werden, der Bewegungen in einem Raum erkennt.
Ntfy.sh ist ein bemerkenswert effektiver und einfacher Dienst. Anstatt ein bestimmtes Python-/MicroPython-Modul zu installieren, funktioniert es mit Anfragen zum Senden von Nachrichten vom Raspberry Pi Pico W unter Verwendung eines bestimmten Themas (sehr ähnlich der Funktionsweise von MQTT). Unser Android/iOS-Gerät hat dieses Thema abonniert und erhält die Benachrichtigungen vom Pico W.
Wir beschränken uns auf das Senden von Texten auf dem Raspberry Pi Pico W, aber dieses Projekt kann auch mit Raspberry Pi SBCs und der offiziellen Raspberry Pi-Kamera verwendet werden Bilder verschicken (oder jede andere Form der Bindung), wenn ein Ereignis eintritt. Sagen Sie, ob ein Vogel an Ihrem Futterhäuschen frisst oder sich jemand in Ihrem Garten aufhält. Ein Beispiel für die Verwendung von Bildern mit ntfy.sh finden Sie in unserem wie man Wörterbücher benutzt Lernprogramm.
Aufbau der Rennstrecke
Die Schaltung für dieses Projekt ist absichtlich unglaublich einfach. Es gibt nur drei Verbindungen zwischen dem PIR-Sensor und dem Raspberry Pi Pico.
Drahtfarbe | Raspberry Pi Pico | PIR |
Rot | 5V (VBUS) | VCC |
Gelb | GPIO 16 | AUS |
Schwarz | GND | GND |
Schließen Sie die Kabel zwischen dem Pico und dem PIR-Sensor an, bevor Sie fortfahren.
Codierung des Projekts
1. Installieren Sie ntfy.sh für Ihr Android-/iOS-Gerät.
2. Öffnen Sie die App und klicken Sie auf +, um ein neues Abonnement zu erstellen.
3. Erstellen Sie ein neues Thema und klicken Sie auf Abonnieren. Wir haben uns für den th-Test entschieden. Erstellen Sie ein für Sie persönliches Thema. Beachten Sie außerdem, dass Themen möglicherweise nicht passwortgeschützt sind. Senden Sie daher keine vertraulichen Daten.
4. Lassen Sie die App geöffnet auf Ihrem Gerät.
Jetzt gehen wir zur Codierung des Raspberry Pi Pico W über.
5. 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.
6. Ö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.
7. Erstellen Sie eine neue leere Datei.
8. Importieren Sie das Netzwerkmodul, importieren Sie dann urequests und benennen Sie es in „requests“ um. Das Netzwerkmodul ermöglicht unserem Pico W die Verbindung mit dem Internet. Urequests ist eine MicroPython-Version des Python-Anforderungsmoduls, das wir zum Senden einer Nachricht vom Pico W verwenden werden. Urequests ist jetzt auf der neuesten UF2-Firmware-Version vorinstalliert.
import network
import urequests as requests
9. Importieren Sie die Schlaffunktion von der Uhrzeit und den Pin von der Maschine. Die Schlaffunktion wird verwendet, um dem Projektcode eine Pause hinzuzufügen. Das Maschinenmodul enthält Funktionen und Klassen, die es unserem Code ermöglichen, GPIO-Pins zu steuern und zu lesen.
from time import sleep
from machine import Pin
10. Erstellen Sie ein Objekt, pir, und verwenden Sie es, um eine Verbindung zum PIR-Ausgangspin an GPIO 16 herzustellen. Der Pin muss als Eingang eingestellt werden, und wir sollten den GPIO-Pin auf High (3 V) ziehen, damit das Signal den Pin auf Low zieht, wenn der PIR ausgelöst wird.
pir = Pin(16, Pin.IN, Pin.PULL_UP)
11. Erstellen Sie ein Objekt, wlan, um die Wi-Fi-Verbindung darzustellen, schalten Sie dann das Wi-Fi ein und stellen Sie eine Verbindung zu Ihrem Wi-Fi-Zugangspunkt her.
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("YOUR SSID","YOUR PASSWORD")
12. Fügen Sie nach dem Herstellen der WLAN-Verbindung eine Verzögerung von drei Sekunden hinzu. Dies ist nicht unbedingt erforderlich, der Verbindungsprozess ist ein „Blocker“, was bedeutet, dass er abgeschlossen sein muss, bevor er zu dieser Leitung wechseln kann. Aber wir hatten mehr Erfolg beim Verbinden, wenn es eine Pause gab, als ohne.
sleep(3)
13. Drucken Sie den WLAN-Verbindungsstatus aus. „Wahr“ bedeutet, dass wir miteinander verbunden sind, „Falsch“ bedeutet, dass wir keine Verbindung haben.
print(wlan.isconnected())
14. Erstellen Sie eine while-True-Schleife und drucken Sie damit den aktuellen Status des PIR-GPIO-Pins aus. Wir setzen den Pin in unserem Code auf High (hochgezogen), daher sollte der Wert 1 sein.
while True:
print(pir.value())
15. Erstellen Sie eine bedingte Anweisung, die prüft, ob der PIR-Sensor ausgelöst wurde.Durch das Auslösen des Sensors wird der mit dem Sensorausgangspin verbundene GPIO-Pin gezwungen, auf Low (0) zu ziehen, und unser Code sucht nach dieser Änderung.
if pir.value() == 0:
16. Verwenden Sie Anfragen, um eine Nachricht an ntfy zu senden. Beachten Sie, dass wir in unserem Fall den Themennamen angeben müssen https://ntfy.sh/th-test, als Teil des Arguments der Funktion. Das nächste Argument, Daten, ist die Nachricht, die der Benutzer sehen wird.
requests.post("https://ntfy.sh/th-test",
data="Movement detected by sensor",
17. Geben Sie in der Anfrage „Kopfzeilen“ an, die einen Titel für die Benachrichtigung enthalten. Eine Priorität (5 ist die höchste Priorität) und Tags, die zum Hinzufügen eines rotierenden Licht-Emojis verwendet werden.
headers=
"Title": "ALERT: MOVEMENT DETECTED",
"Priority": "5",
"Tags": "rotating_light",
)
18. Gibt eine Nachricht an die Python-Shell aus. Dies dient ausschließlich Debug-Zwecken.
print("Movement detected, notification sent")
19. Fügen Sie eine andere Bedingung hinzu das verwendet einfach pass, um den Code in einer Schleife laufen zu lassen.
else:
pass
20. Fügen Sie dem Code eine Verzögerung hinzu, innerhalb der while-True-Schleife, aber außerhalb der bedingten Tests. Diese Verzögerung kann 10 Sekunden oder Stunden betragen. Es hängt alles davon ab, wie oft Sie benachrichtigt werden möchten.
sleep(10)
21. Speichern Sie den Code als alarm.py auf dem Raspberry Pi Pico und klicken Sie zum Starten auf „Ausführen“. Wenn Sie möchten, dass dieser Code beim Einschalten der Pico W automatisch ausgeführt wird, speichern Sie die Datei unter dem Namen main.py. MicroPython ist so konfiguriert, dass es „main.py“ ausführt, wenn das Board eingeschaltet wird.
22. Legen Sie Ihre Hand vor den Sensor, um den Alarm auszulösen.
23. Ihr Android-/iOS-Gerät erhält eine Benachrichtigung.
Vollständige Codeliste
import network
import urequests as requests
from time import sleep
from machine import Pin
pir = Pin(16, Pin.IN, Pin.PULL_UP)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("YOUR SSID","YOUR PASSWORD")
sleep(3)
print(wlan.isconnected())
while True:
print(pir.value())
if pir.value() == 0:
requests.post("https://ntfy.sh/th-test",
data="Movement detected by sensor",
headers=
"Title": "ALERT: MOVEMENT DETECTED",
"Priority": "5",
"Tags": "rotating_light",
)
print("Movement detected, notification sent")
else:
pass
sleep(10)