Raspberry Pi Pico W als fernsteuerbarer Schalter (mit MQTT)
Wir haben einen Raspberry Pi Pico W und haben die Idee ihn aus der Ferne zu schalten. Beispielsweise die Onboard-LED, die wir ein- und ausschalten wollen. Das geht aber auch mit jedem anderen GPIO, an dem man irgend ein Bauteil oder eine Steuerung hängt.
Was ist MQTT? Message Queue Telemetry Transport, kurz MQTT, ist ein äußerst einfach aufgebautes Kommunikationsprotokoll für den Nachrichtenaustausch zwischen Geräten in Umgebungen mit geringer Bandbreite und instabilen Verbindungen. Typischerweise lassen sich mit MQTT Sensordaten, wie Temperatur oder Füllstände, übertragen. Aber auch klassische Nachrichten oder Kurzmitteilungen.
Die Kommunikation erfolgt über das MQTT-Protokoll mit einem MQTT-Broker, der den Schaltzustand zum Pico sendet. Hierzu ist ein MQTT-Broker im eigenen Netzwerk notwendig. Dafür eignet sich zum Beispiel ein Raspberry Pi.
MQTT-Bibliothek für MicroPython
Die Kommunikation des Raspberry Pi Pico als MQTT-Publisher oder -Subscriber wird von MicroPython nicht direkt unterstützt. Dazu ist für MicroPython eine externe Bibliothek notwendig, die heruntergeladen und auf dem Pico gespeichert werden muss. Als MQTT-Bibliothek verwenden wir „umqtt.simple“.
Damit der folgende Programmcode die Bibliothek findet, muss die heruntergeladene Datei auf Deinem Raspberry Pi Pico mit dem Dateinamen „umqtt_simple.py“ gespeichert sein.
MQTT-Broker
Wenn man nun mit MQTT experimentieren will, braucht man mindestens einen Publisher, einen Broker und einen Subscriber. Man braucht also für eine Teststellung mindestens drei Geräte oder Software-Implementierungen.
Wenn man keinen eigenen MQTT-Broker hat, kann man den Test-Broker mit der Adresse test.mosquitto.org verwenden. Allerdings ist die Verbindung in der Regel unsicher und der Server unter Umständen nicht verfügbar oder überlastet. Der ist zum Testen, aber nicht für den Produktiv-Betrieb geeignet.
Programmcode
Im folgenden Programmcode wird zuerst eine Verbindung mit einem WLAN hergestellt. Hierzu sind die Zugangsdaten korrekt einzutragen.
- wlanSSID: Das ist der Name des WLANs zu dem eine Verbindung hergestellt werden soll.
- wlanPW: Das ist das WLAN-Passwort von dem WLAN.
Desweiteren muss hier die Adresse des MQTT-Brokers hinterlegt werden, der sich in Deinem lokalen Netzwerk befinden sollte.
- mqttBroker: Hier muss die IPv4-Adresse des MQTT-Brokers bzw. -Servers im Netzwerk eingetragen sein.
- mqttClient: Das ist der Name des MQTT-Clients.
- mqttUser: Benutzername für den Client zur Authentifizierung gegenüber dem MQTT-Broker. (optional)
- mqttPW: Passwort zum Benutzernamen für die Authentifizierung. (optional)
- mqttTopic: Bezeichner (Topic) für den Wert, der an den Broker übermittelt wird. Standardmäßig ist der Bezeichner „picobutton“.
Nach dem WLAN-Verbindung hergestellt wurde, wird die Verbindung zum MQTT-Broker hergestellt und ein „Subscribe“ für das Topic „picobutton“ gesendet. Anschließend geht der der Programmcode in einer Endlos-Schleife auf Empfang und gibt über eine zuvor definierte Callback-Funktion die empfangenen Daten aus. Das Setzen der Callback-Funktion „mqttDo“ erfolgt in der Funktion „mqttConnect“.
Die Callback-Funktion schaltet die Onboard-LED um. Von AUS nach EIN oder von EIN nach AUS und gibt die MQTT-Nachricht aus.
# Bibliotheken laden import machine import network import utime as time from umqtt_simple import MQTTClient # WLAN-Konfiguration wlanSSID = 'WLANSSID' wlanPW = 'WLANPASSWORD' network.country('DE') # MQTT-Konfiguration mqttBroker = '192.168.0.10' mqttClient = 'pico' mqttUser = 'mqttuser' mqttPW = '' mqttTopic = b"button" # Status-LED für die WLAN-Verbindung led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0) # Callback-Funktion: Empfang einer MQTT-Nachricht def mqttDo(topic, msg): # Onboard-LED-Toggle led_onboard.toggle() # MQTT-Nachricht ausgeben print("Topic: %s, Wert: %s" % (topic, msg)) print() # Funktion: WLAN-Verbindung herstellen def wlanConnect(): wlan = network.WLAN(network.STA_IF) if not wlan.isconnected(): print('WLAN-Verbindung herstellen:', wlanSSID) wlan.active(True) wlan.connect(wlanSSID, wlanPW) for i in range(10): if wlan.status() < 0 or wlan.status() >= 3: break led_onboard.toggle() print('.') time.sleep(1) if wlan.isconnected(): print('WLAN-Verbindung hergestellt / WLAN-Status:', wlan.status()) print() led_onboard.on() else: print('Keine WLAN-Verbindung / WLAN-Status:', wlan.status()) print() led_onboard.off() # Funktion: Verbindung zum MQTT-Server herstellen def mqttConnect(): if mqttUser != '' and mqttPW != '': print("MQTT-Verbindung herstellen: %s mit %s als %s" % (mqttClient, mqttBroker, mqttUser)) client = MQTTClient(mqttClient, mqttBroker, user=mqttUser, password=mqttPW) else: print("MQTT-Verbindung herstellen: %s mit %s" % (mqttClient, mqttBroker)) client = MQTTClient(mqttClient, mqttBroker) client.set_callback(mqttDo) client.connect() print() print('MQTT-Verbindung hergestellt') print() return client # WLAN-Verbindung herstellen wlanConnect() # MQTT-Verbindungsaufbau try: client = mqttConnect() client.subscribe(topic=mqttTopic) print("Subscribe: %s" % mqttTopic) print() # Warten auf Nachrichten while True: client.check_msg() time.sleep(1) except OSError: print('Fehler: Keine MQTT-Verbindung')
Der Programmcode läuft im Prinzip endlos, sofern kein Fehler produziert wird. Mit STRG + C kann man den Programmcode in Thonny regulär beenden.
FAQ: Wo kann im Programmcode ein Ausgang für ein Gerät (LED, Relais, Motor, ..) geschaltet werden?
In der Funktion „doMQTT“ steckt die Ausführung dessen drin, was geschaltet werden soll.
In diesem Beispiel wird die Onboard-LED umgeschaltet (toggle). Das heißt von EIN nach AUS oder von AUS nach EIN.
Wie kann man den Pico aus der Ferne schalten?
Da der Pico als MQTT-Subscriber agiert, bedarf es eines MQTT-Brokers und eines MQTT-Publishers. Der MQTT-Publisher sendet den Schaltbefehl an den MQTT-Broker und der wiederum an den Pico.
Wir gehen davon aus, dass Du einen MQTT-Broker installiert hast, zum Beispiel Mosquitto. Der läuft erfolgreich, wenn sich der Pico mit dem Programmcode oben erfolgreich eine MQTT-Verbindung herstellen konnte.
Was wir jetzt noch brauchen ist ein MQTT-Publisher, von dem der Schaltbefehl an den MQTT-Broker gesendet wird. Du kannst einen zweiten Pico installieren, der als MQTT-Publisher agiert.
Eine Alternative ist eine Software, die als MQTT-Publischer den Schaltbefehlt sendet. Bei der Installation des MQTT-Brokers kann man auch MQTT-Clients installieren. Das Kommando auf der Kommandozeile für den Publisher-Client sieht wie folgt aus:
mosquitto_pub -t button -m "pressed"
Hinweis: Dieses Kommando funktioniert nur auf dem System, auf dem der MQTT-Broker Mosquitto installiert ist.
Weitere verwandte Themen:
- Raspberry Pi Pico W als MQTT-Publisher
- Raspberry Pi Pico W als MQTT-Subscriber
- Raspberry Pi Pico W als schnurloses Thermometer (mit MQTT)
- Raspberry Pi Pico W als schnurloser Taster (mit MQTT)
- Raspberry Pi Pico W als WLAN-Client
Teilen:
Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython
Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.
- LED: Einschalten, ausschalten, blinken und Helligkeit steuern
- Taster: Entprellen und Zustände anzeigen
- LED mit Taster einschalten und ausschalten
- Ampel- und Lauflicht-Steuerung
- Elektronischer Würfel
- Eigene Steuerungen programmieren
Online-Workshop
Hardware-nahes Programmieren mit dem Raspberry Pi Pico
Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.
Für Ihre Fragen zu unseren Online-Workshops mit dem Raspberry Pi Pico besuchen Sie unseren PicoTalk (Online-Meeting). (Headset empfohlen)
Elektronik-Set Pico Edition
Raspberry Pi Pico: Hardware-nahes Programmieren mit MicroPython
Leichter Einstieg mit All-in-one-Set zum sofort Loslegen, um eigene Steuerungen programmieren.
Elektronik-Set Pico WLAN Edition
Raspberry Pi Pico W: IoT und Smart Home mit WLAN und MQTT
Betreibe Deinen Raspberry Pi Pico W als drahtloser Sensor in Deinem WLAN, versende E-Mails mit Daten und kommuniziere per MQTT im Internet of Things oder Smart Home.
Elektronik-Set Sensor Edition
Erweiterung zu den Elektronik-Sets Pico Edition und Pico WLAN Edition
Elektronik-Set mit den beliebtesten Sensoren zum Messen von Temperatur, Helligkeit, Bewegung, Lautstärke und Entfernung.
Elektronik-Set Eingabe Ausgabe Edition
Erweiterung zu den Elektronik-Sets Pico Edition und Pico WLAN Edition
Damit kannst Du MP3-Dateien abspielen, eine Stoppuhr bauen, einen Servo-Motor mit Drehschalter oder Joystick steuern, Lichteffekte mit einem WS2812-LED-Lichtstreifen erzeugen, Schalten mit einem Relais und Signalisieren mit einem Vibrationsmotor.