Wie du die Sensordaten vom Open Smart Rich Shield mit dem ESP32 & MicroPython an ThinkSpeak sendest, erfährst du im nachfolgenden Beitrag. Das Rich Shield verfügt über diverse Sensoren & Aktoren, darunter ist ein DHT11 Sensor und zwei Taster. Einen der Taster werden wir mit der Funktion belegen, um die Sensordaten abzusenden. Natürlich kannst du das auch zeitgesteuert machen und somit diese kleine Schaltung autark betreiben.
Solltest du das Rich Shield von Open Smart nicht besitzen, so zeige ich dir alternativ eine kleine Schaltung mit einem DHT11 Sensor und einem Taster, welche du sehr einfach nachbauen kannst.
Inhaltsverzeichnis
- Wie funktioniert die Kommunikation mit ThinkSpeak?
- Benötigte Ressourcen für dieses kleine Projekt
- Aufbau der alternativen Schaltung
- Einrichten eines Channels in ThinkSpeak
- Programmieren der Schnittstelle zu ThinkSpeak in MicroPython
- Fertiges Programm zum Absenden von Messdaten an ThinkSpeak
Wie funktioniert die Kommunikation mit ThinkSpeak?
Auf dem Mikrocontroller bauen wir eine WiFi-Verbindung zum lokalen Netzwerk auf und senden via Tastendruck einen HTTP-Request (GET) an ThinkSpeak. Der Request enthält neben dem ApiKey noch die beiden Parameter für die Temperatur und die rel. Luftfeuchtigkeit. Diese Daten werden dann automatisch in ThinkSpeak visualisiert und als Antwort (Response) erhalten wir, ob dieses geklappt hat.
In der kostenfreien Version von ThinkSpeak kannst du pro Jahr 3 Millionen Requests an diesen Service absenden (das sind rund 8200 pro Tag). Jedoch kannst du nur alle 15 Sekunden eine Nachricht absenden und maximal 4 Dashboards (als Channel bezeichnet) einrichten. Diese Limitierungen reichen, wie ich finde, locker für kleine IoT Projekte wie diese aus!
Benötigte Ressourcen für dieses kleine Projekt
Wenn du das kleine Projekt nachbauen möchtest, dann benötigst du:
- einen ESP32 D1 R32*,
- ein Micro-USB Datenkabel*,
- ein Rich Shield von Open Smart
Solltest du das Rich Shield nicht besitzen, so kannst du dir die kleine Schaltung mit nachfolgenden Bauteilen nachbauen:
- einen DHT11 Sensor*,
- einen Fotowiderstand*,
- ein 10 kOhm Widerstand*,
- zwei Taster*, sowie
- acht Breadboardkabel*, 10 cm, männlich-männlich,
- ein 400 Pin Breadboard*
Den LDR / Fotowiderstand gibt es auch als fertigen Baustein* auf einer kleinen Platine. Diese Platine hat den Vorteil, dass die Schaltung mit dem 10 kOhm Widerstand darauf bereits erledigt ist und du somit diesen über die drei Pins mit dem Mikrocontroller verbinden kannst.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Aufbau der alternativen Schaltung
Zunächst möchte ich dir die kleine Schaltung zeigen, wenn du das Rich Shield von Open Smart nicht hast.
Testen der kleinen Schaltung
Bevor wir mit der Programmierung beginnen, testen wir die kleine Schaltung und geben die Sensorwerte auf der seriellen Schnittstelle aus.
Der nachfolgende Code bewirkt, dass auf der seriellen Schnittstelle die Sensordaten vom DHT11 und vom Fotowiderstand ausgegeben wird. Beim DHT11 Sensor lege ich zusätzlich eine Pause von 2 Sekunden ein. Das liegt daran, dass dieser Sensor nur alle 1,5 Sekunden einen neuen Sensorwert liefert und das Modul eine Exception wirft, wenn man zu oft auf den Taster drücken würde.
import dht from time import sleep from machine import Pin, ADC dhtSensor = dht.DHT11(Pin(19, Pin.IN)) k1 = Pin(12, Pin.IN, Pin.PULL_UP) k2 = Pin(13, Pin.IN, Pin.PULL_UP) adc_pin = Pin(35, mode=Pin.IN) adc = ADC(adc_pin) adc.atten(ADC.ATTN_11DB) while True: if not k1.value(): dhtSensor.measure() print("Temperatur: ", dhtSensor.temperature(), "°C") print("rel. Luftfeuchtigkeit: ", dhtSensor.humidity(), "%") sleep(2) if not k2.value(): print("Fotowiderstand: ", adc.read()) sleep(0.3)
Einrichten eines Channels in ThinkSpeak
Ein neuer Channel kann in wenigen Schritten erstellt werden. Du benötigst lediglich einen kostenfreien Account, mit diesem kannst du vier von diesen erstellen, was für dieses Beispiel locker reicht.
In der Übersicht klickst du zunächst auf “New Channel”.
Vergibst danach den Namen sowie die benötigten Felder. Das Feld 1 wird für die Temperatur und das Feld 2 für die rel. Luftfeuchtigkeit verwendet.
Um diese Einstellung zu speichern, scrollst du nach unten und wählst dort die Schaltfläche “Save Channel”.
Im Reiter “API Keys” findest du die beiden Schlüssel um mit ThinkSpeak zu kommunizieren. An Position 1 findest du den Schlüssel für das Schreiben der Daten und an Position 2 zum Lesen der Daten.
Auf der rechten Seite findest du jeweils Beispiel für ein HTTP-GET-Request jeweils zum Schreiben und Lesen.
Hinzufügen von Widgets zum Channel
Neben einfachen Liniendiagrammen kannst du auch vier verschiedene Widgets deinem Channel hinzufügen. Über das Gauge Widget kannst du ähnlich wie eine analoge Temperaturanzeige am Wasserkessel deinen Sensorwert visualisieren.
Gauge für die rel. Luftfeuchtigkeit
Nachfolgend möchte ich dir das Gauge Widget für die rel. Luftfeuchtigkeit zeigen.
Zunächst klicken wir auf dieses Widget und wählen anschließend die Schaltfläche “Next”.
Im neuen Dialog vergeben wir einen Namen, welcher ebenso als Titel des Widgets verwendet wird. Wichtig ist hier das, dass korrekt Feld ausgewählt wird.
Zusätzlich können wir einen farbigen Ring konfigurieren. Dieser symbolisiert im Fall der Luftfeuchtigkeit, wie gesund der Wert ist.
Vorschlag für Farbbereiche des Rings:
- Blau (trocken) – 0 % bis 30 % RH:
- Beschreibung: Dieser Bereich zeigt an, dass die Luft sehr trocken ist.
- Begründung: Eine relative Luftfeuchtigkeit unter 30 % kann als unangenehm trocken empfunden werden und ist oft nicht optimal für die meisten Menschen und viele Pflanzen. Dies kann auch statische Elektrizität und Trockenheit der Haut oder Atemprobleme verursachen.
- Grün (komfortabel) – 30 % bis 60 % RH:
- Beschreibung: Dieser Bereich zeigt an, dass die Luftfeuchtigkeit im optimalen Bereich liegt.
- Begründung: Eine Luftfeuchtigkeit zwischen 30 % und 60 % wird allgemein als angenehm für Menschen angesehen und reduziert das Risiko für Schimmelbildung oder andere Feuchtigkeitsprobleme. In diesem Bereich sind sowohl die Atemwege als auch die Schleimhäute in einem gesunden Zustand.
- Gelb (feucht) – 60 % bis 70 % RH:
- Beschreibung: Dieser Bereich zeigt an, dass die Luftfeuchtigkeit erhöht ist.
- Begründung: Eine relative Luftfeuchtigkeit über 60 % kann bereits als leicht feucht empfunden werden. Es besteht eine potenzielle Gefahr für die Bildung von Schimmel und Hausstaubmilben.
- Rot (sehr feucht) – 70 % bis 100 % RH:
- Beschreibung: Dieser Bereich zeigt an, dass die Luft sehr feucht ist.
- Begründung: Luftfeuchtigkeiten über 70 % sind oft zu hoch für ein angenehmes Raumklima. In diesem Bereich steigt das Risiko für Feuchtigkeitsschäden und die Bildung von Schimmel erheblich.
Wenn das Widget gespeichert ist, aber noch keine Daten empfangen wurden, dann wird ein Hinweis angezeigt.
Sobald Daten empfangen wurden, werden diese im entsprechenden Liniendiagramm sowie auch im Gauge Widget angezeigt.
Programmieren der Schnittstelle zu ThinkSpeak in MicroPython
Für das Absenden der Daten benötigen wir zunächst eine Verbindung zum lokalen WiFi-Netzwerk. Wiederum benötigen für diese die SSID sowie das Passwort, in meinem Fall habe ich diese in der Datei secrects.py gespeichert, somit kann ich dir den Quellcode hier und im Video anzeigen ohne meine Daten zu veröffentlichen.
mport network from secrets import * connection = network.WLAN(network.STA_IF) connection.active(True) connection.connect(wifi_ssid, wifi_password) print(connection.ifconfig())
Der DHT11 Sensor ist am GPIO19 angeschlossen und der Taster K1 am GPIO12. der Taster wird zusätzlich über den internen 10 kOhm Widerstand geleitet.
import machine import dht dhtSensor = dht.DHT11(machine.Pin(19, machine.Pin.IN)) k1 = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP) adc_pin = machine.Pin(35, mode=machine.Pin.IN) adc = machine.ADC(adc_pin) adc.atten(machine.ADC.ATTN_11DB)
Die Adresse sowie die Parameter für den HTTP-GET-Request lege ich in separate Felder an so das ich dort lediglich nur den Messwert anhängen muss. Der ApiKey liegt wie auch die WiFi-Verbindungsdaten in der Datei secrets.py.
addresse = "https://api.thingspeak.com/update?api_key="+apiKey parameterTemperatur = "&field1=" parameterLuftfeuchtigkeit = "&field2=" parameterLdr = "&field3="
In der Endlosschleife prüfe ich zunächst ob die Taste K1 betätigt wurde und wenn dieses so ist, dann werden die Daten vom DHT11 Sensor ermittelt und an ThinkSpeak gesendet.
Zusätzlich wird die Antwort ausgewertet, wir erhalten ein komplexes Response-Objekt aus welchem ich lediglich den Status_Code entnehme. Dieser Status_Code repräsentiert den HTTP-Status, bei einem Wert von 200 ist alles OK und darüber soll der Text “Fehler!” ausgegeben werden.
while True: if not k1.value(): dhtSensor.measure() response = urequests.get(addresse+parameterTemperatur+ str(dhtSensor.temperature())+ parameterLuftfeuchtigkeit+ str(dhtSensor.humidity())+ parameterLdr+ str(adc.read()) ) print ("OK" if response.status_code == 200 else "Fehler!") response.close() time.sleep(0.25)
Auf der Seite https://en.wikipedia.org/wiki/List_of_HTTP_status_codes findest du eine Ausführliche Liste von HTTP-StatusCodes und deren Bedeutung.
Fertiges Programm zum Absenden von Messdaten an ThinkSpeak
Nachfolgend nun das kleine MicroPython Programm zum absenden von Messdaten an ThinkSpeak:
import network from secrets import * import time import machine import urequests import dht dhtSensor = dht.DHT11(machine.Pin(19, machine.Pin.IN)) k1 = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP) adc_pin = machine.Pin(35, mode=machine.Pin.IN) adc = machine.ADC(adc_pin) adc.atten(machine.ADC.ATTN_11DB) connection = network.WLAN(network.STA_IF) connection.active(True) connection.connect(wifi_ssid, wifi_password) print(connection.ifconfig()) addresse = "https://api.thingspeak.com/update?api_key="+apiKey parameterTemperatur = "&field1=" parameterLuftfeuchtigkeit = "&field2=" parameterLdr = "&field3=" while True: if not k1.value(): dhtSensor.measure() response = urequests.get(addresse+parameterTemperatur+ str(dhtSensor.temperature())+ parameterLuftfeuchtigkeit+ str(dhtSensor.humidity())+ parameterLdr+ str(adc.read()) ) print ("OK" if response.status_code == 200 else "Fehler!") response.close() time.sleep(0.25)