Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

MicroPython mit ESP32: Sensordaten an ThinkSpeak senden

Posted on 3. September 20243. September 2024 by Stefan Draeger

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.

MicroPython mit ESP32: Sensordaten an ThinkSpeak senden
Dieses Video auf YouTube ansehen.

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
    • Testen der kleinen Schaltung
  • Einrichten eines Channels in ThinkSpeak
    • Hinzufügen von Widgets zum Channel
      • Gauge für die rel. Luftfeuchtigkeit
  • 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
ESP32 D1 R32 und Rich Shield von Open Smart
ESP32 D1 R32 und Rich Shield von Open Smart

Solltest du das Rich Shield nicht besitzen, so kannst du dir die kleine Schaltung mit nachfolgenden Bauteilen nachbauen:

Bauteile für den Aufbau einer alternativen Schaltung
Bauteile für den Aufbau einer alternativen Schaltung
  • 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.

LDR / Fotowiderstand
LDR / Fotowiderstand

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.

alternative Schaltung mit LDR, Taster & DHT11 Sensor am ESP32 D1 R32
alternative Schaltung mit LDR, Taster & DHT11 Sensor am ESP32 D1 R32

Testen der kleinen Schaltung

Bevor wir mit der Programmierung beginnen, testen wir die kleine Schaltung und geben die Sensorwerte auf der seriellen Schnittstelle aus.

Schaltung - ESP32 D1 R32 mit LDR, Taster und DHT11 Sensor
Schaltung – ESP32 D1 R32 mit LDR, Taster und DHT11 Sensor

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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)
        

Schreibe einen Kommentar Antworten abbrechen

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

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}