MAKER Pi Pico #1 – senden von Sensordaten an ThingSpeak

Wie du Sensordaten mit dem MAKER Pi Pico an den IoT Service ThingSpeak senden kannst, erfährst du in diesem ausführlichem Beitrag.

MAKER Pi Pico mit ESP01S Modul & DHT11 Sensor
MAKER Pi Pico mit ESP01S Modul & DHT11 Sensor

Den MAKER Pi Pico habe ich dir bereits im Beitrag Maker Pi Pico von Cytron vorgestellt und möchte hier lediglich auf die Verbindung zu ThingSpeak eingehen.

Einrichten eines Channels in ThingSpeak

Zunächst müssen wir einen Channel in ThingSpeak einrichten. Dieses ist recht einfach, wenn man sich registriert und angemeldet hat, dann muss man lediglich auf die Schaltfläche „New Channel“ (1) klicken.

Schritt 1 - erstellen eines Channels in ThingSpeak
Schritt 1 – erstellen eines Channels in ThingSpeak

Im zweiten Schritt müssen wir den Namen (2) definieren und optional eine Beschreibung (3) vergeben. Danach definieren wir die Felder, welche wir für unser Projekt benötigen, in diesem Fall möchte ich einen einfachen DHT11 Sensor anschließen und die Sensordaten Temperatur (4) & Luftfeuchtigkeit (5) sammeln.

Wenn diese Daten eingetragen wurden, muss das Formular lediglich mit der Schaltfläche „Save Channel“ (6) erstellt werden.

Schritt 2 - definieren der Eigenschaften des neuen Channels
Schritt 2 – definieren der Eigenschaften des neuen Channels

Hier könnte man noch einige weitere Daten sammeln (Field3 .. Field8) und zbsp. einen BMP280 für das Messen des Luftdrucks sowie einen analogen UV-Sensor anbinden.

fertiger Channel für den MAKER Pi Pico mit DHT11 Sensor in ThingSpeak
fertiger Channel für den MAKER Pi Pico mit DHT11 Sensor in ThingSpeak

Anschließen des DHT11 Sensors an den MAKER Pi Pico

Für dieses Beispiel möchte ich einen DHT11 Sensor verwenden, dieser läßt sich unter CircuitPython recht einfach auslesen und liefert uns die Daten der Temperatur sowie die relative Luftfeuchtigkeit.

Bezug eines DHT11 Sensors

Einen DHT11 Sensor bekommst du in 3 Ausführungen zum einen als simplen Baustein und dann auf einer kleinen Platine mit fertig verbundenem Widerstand.

Varianten des DHT11 Sensors
Varianten des DHT11 Sensors

Auf der Plattform ebay.de findest du diesen Sensor in den oben gezeigten Ausprägungen in den Preisen von 1,90 € bis 2,10 € zzgl. Versandkosten. Einen deutlich besseren Preis bekommst du auf Plattformen wie aliexpress.com oder banggood.com. Jedoch hast du dort das Problem, wenn was mit der Lieferung nicht stimmt, sich mit chinesischen Lieferanten auseinandersetzen zu müssen. (Meist sind diese Lieferanten nicht an einer Lösung interessiert und man muss sein Geld über PayPal zurückziehen.)

DHT11 Sensor mit Grove Schnittstelle

Da der MAKER Pi Pico über ausreichend Grove Schnittstellen verfügt können wir alternativ einen DHT11 Sensor mit passender Grove Schnittstelle anschließen.

DHT11 Sensor mit Grove Schnittstelle
DHT11 Sensor mit Grove Schnittstelle

Der Preis auf ebay.de ist mit rund 12 € inkl. Versandkosten deutlich höher als ein „normaler“ Baustein mit / ohne Platine. Einen weitaus günstigeren Preis findest du Bsp. im offiziellen Shop von SeeedStudio dort zahlst du lediglich 6,5 $ zzgl. Versandkosten. Da aber die Versandkosten nach Deutschland doch recht hoch sind, lohnt sich die Bestellung des einzelnen Sensors nicht wirklich aber in einer größeren Bestellung mit Sensoren / Aktoren für Arduino / Raspberry Pi Projekte fällt das nicht weiter ins Gewicht.

Technische Daten des DHT11 Sensors

  • Messbereich der relativen Luftfeuchtigkeit 20% bis 90%
  • Toleranz des Messbereiches für die relative Luftfeuchtigkeit ±5%
  • Messbereich der Temperatur 0 bis 60°C
  • Toleranz des Messbereiches für die Temperatur ±2°C
  • Betriebsspannung 5V

Anschluss per Breadboardkabel

Hast du einen Sensor mit einer „fertigen“ Platine so musst du zunächst prüfen welche du hast. Es gibt hier 2 Versionen wo die Pins verschieden angebracht wurden.

Pinout der DHT11 Sensoren auf Platine
Pinout der DHT11 Sensoren auf Platine

Anschluss per Grove Schnittstelle

Der deutliche einfachere Weg ist über die Grove Schnittstelle, hier benötigt man lediglich ein passendes Kabel (dieses liegt meist dem Sensor bei).

MAKER Pi Pico mit ESP01S und DHT11 Sensor über Grove Schnittstelle
MAKER Pi Pico mit ESP01S und DHT11 Sensor über Grove Schnittstelle

In meinem Fall würde der DHT11 Sensor über den Pin GP27 mit dem Mikrocontroller verbunden werden (das gelbe Kabel). Das weiße Kabel ist mit dem GP26 verbunden aber nicht vom Sensor belegt.

Alternativer Sensor DHT22

Statt einem DHT11 kann man auch einen DHT22 verwenden, im Code ist dieses lediglich eine kleine Stelle, welche man ändern muss.

DHT22 Sensor

Der DHT22 ist deutlich genauer und hat auch einen größeren Messbereich als der DHT11.

DHT22DHT11
Messbereich relative Luftfeuchtigkeit 0% bis 100% 20% bis 90%
Toleranz relative Luftfeuchtigkeit ±2% ±5%
Messbereich der Temperatur -40°C bis 80°C 0°C bis 60°C
Toleranz des Messbereiches für die Temperatur ±0.5°C ±2°C
Betriebsspannung 3,3V – 5V 5V
Vergleich DHT22 & DHT11 Sensor

Programmieren des DHT Sensors

Kommen wir nun dazu den DHT11 bzw. DHT22 Sensor zu programmieren bzw. das Programm auf dem MAKER Pi Pico zu programmieren.

auslesen des DHT11 Sensors mit CircuitPython

import time
import board
import adafruit_dht

dhtDevice = adafruit_dht.DHT11(board.GP27)
# Wenn ein DHT22 Sensor angeschlossen ist
# muss diese Zeile auskommentiert werden.
# dhtDevice = adafruit_dht.DHT22(board.GP27)

while True:
    try:
        temp = dhtDevice.temperature
        humi = dhtDevice.humidity
        print("Temperatur: {:.1f}C  rel. Luftfeuchtigkeit: {}% ".format(temp, humi))

    except RuntimeError as error:
        print(error.args[0])
        time.sleep(2.0)
        continue
    except Exception as error:
        dhtDevice.exit()
        raise error

    time.sleep(2.0)

Ausgabe auf der Konsole

Auf der Konsole wird die Temperatur sowie die relative Luftfeuchtigkeit formatiert ausgegeben. Des Weiteren kannst du auch Fehlermeldungen von der verwendeten Bibliothek sehen. Das liegt vielmehr am Sensor selber, dieser ist etwas schwierig zum Auslesen und auch liefert dieser Sensor nur neue Daten in einem fest definierten Intervall.


code.py Ausgabe:
DHT sensor not found, check wiring
Temperatur: 24.0 °C  rel. Luftfeuchtigkeit: 55% 
Checksum did not validate. Try again.
Temperatur: 24.0 °C  rel. Luftfeuchtigkeit: 55% 
Checksum did not validate. Try again.
Checksum did not validate. Try again.
Temperatur: 24.0 °C  rel. Luftfeuchtigkeit: 55% 
Temperatur: 24.0 °C  rel. Luftfeuchtigkeit: 55% 
Temperatur: 24.0 °C  rel. Luftfeuchtigkeit: 55% 
Checksum did not validate. Try again.
Checksum did not validate. Try again.

Video

MAKER Pi Pico - read DHT11 Sensordata

Verbindung zu ThingSpeak aufbauen

Auf dem GitHub Repository von Cytron findest du ein Beispiel wie du eine Verbindung zum Service ThingSpeak aufbauen kannst. Dieses Beispiel möchte ich nun nutzen und etwas auf diesen gezeigten Anwendungsfall modifiziert präsentieren.

API Key für das Schreiben von Daten

Zum Schreiben von Daten benötigen wir den sogenannten „API WRITE KEY“, diesen findest du im Dashboard unter dem Reiter „API Keys“ (1) gleich als Erstes im Tab (2).

Programm zum Absenden von DHT11 Daten

Die Daten sende ich hier in einem Intervall von 20 Sekunden, dieses liegt vielmehr daran das die kostenfreie Nutzung von ThingSpeak diese Einschränkung besitzt.

import time
import board
import adafruit_dht
import busio
import adafruit_requests as requests
import adafruit_espatcontrol.adafruit_espatcontrol_socket as socket
from adafruit_espatcontrol import adafruit_espatcontrol

# Zugangsdaten zum lokalen WiFi Netzwerk
# und der API WRITE KEY von ThingSpeak
secrets = {
    "ssid" : "FRITZBox7590GI24",                                    
    "password" : "abc",
    "thingspeak_write_api_key" : "2E97PxxxxxxP0NO"
}

# Adresse der API
API_URL = "http://api.thingspeak.com"

# UART Kommunikation mit dem ESP01S
RX = board.GP17
TX = board.GP16
uart = busio.UART(TX, RX, receiver_buffer_size=2048) 

esp = adafruit_espatcontrol.ESP_ATcontrol(uart, 115200, debug=False)
requests.set_socket(socket, esp)

print("Resetting ESP module")
esp.soft_reset()

# Aufbau der WiFi Verbindung
while not esp.is_connected:
    print("Connecting...")
    esp.connect(secrets)

# Instanz eines DHT11 Sensors erstellen
dhtDevice = adafruit_dht.DHT11(board.GP27)

# Endlosschleife...
while True:
    # Versuche
    try:
        # lesen der Temperatur
        temp = dhtDevice.temperature
        # lesen der relativen Luftfeuchtigkeit
        humi = dhtDevice.humidity
        # Ausgeben der Werte auf der seriellen Schnittstelle
        print("Temperatur: {:.1f}C  rel. Luftfeuchtigkeit: {}% ".format(temp, humi))

    # Wenn der Sensor nicht gefunden wurde 
    # oder ein Fehler beim Lesen aufgetreten ist
    # wird ein Fehler geworfen.
    except RuntimeError as error:
        # Ausgeben der Fehlermeldung auf der seriellen Schnittstelle
        print(error.args[0])
        # eine Pause von 2 Sekunden einlegen
        time.sleep(2.0)
        # noch mal von vorne beginnen
        continue
    # Wenn eine Exception aufgetreten ist
    # dann soll die Kommunikation mit dem
    # DHT Sensor und das Programm beendet werden 
    except Exception as error:
        dhtDevice.exit()
        raise error
    
    # Wenn kein Fehler aufgetreten ist und die WiFi Verbindung hergestellt wurde
    # dann sollen die Daten nach ThingSpeak gesendet werden.

    # zunächst prüfen wir ob auch wirklich Daten gelesen wurden,
    # ggf. kann hier temp oder humi None sein
    if(temp is not None and humi is not None) :
        print("\nUpdating Thingspeak...")
        # zusammenstellen der URL aus der API URL dem API WRITE KEY sowie als Parameter die Sensordaten
        get_url = API_URL + "/update?api_key=" + secrets["thingspeak_write_api_key"] + "&field1=" + str(temp)+ "&field2=" + str(humi)
        # absenden der URL
        # als Rückgabewert erhalten wir in Request Objekt mit den Eigenschaften 
        # wie zbsp. HTTP Status Code und auch einen Response vom Server
        r = requests.get(get_url)
        # Ausgeben der Anzahl der bisher geschriebenen Daten
        # Da wir neben der Zeit auch die Einschränkung haben maximal 500 Daten pro Tag senden zu können
        # kann dieser Counter recht wichtig werden.
        print("Data Count:", r.text)
        print("OK")
        time.sleep(20) 

Video

In dem Video siehst du zum einen die Konsole von Putty auf welcher die Fehlermeldungen und die Ausgaben der Sensordaten zu sehen sind.

Des Weiteren natürlich auch das zuvor erstellte Dashboard in ThingSpeak.

MAKER Pi Pico - Daten eines DHT11 Sensors an ThingSpeak senden

Wie bereits erwähnt kann nur alle 20 Sekunden neue Sensorwerte geschrieben werden, daher habe ich das Video in 3facher Geschwindigkeit gespeichert.

2 Kommentare

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert