Skip to content

Technik Blog

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

Menu
  • Smarthome
  • Gartenautomation
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Deutsch
  • English
Menu

Raspberry Pi Pico W – visualisieren von Sensorwerten in Diagramme – Teil 1

Posted on 14. November 20223. Mai 2023 by Stefan Draeger

In diesem Beitrag möchte ich dir zeigen, wie du Sensordaten am Raspberry Pi Pico W in Diagramme visualisieren kannst.

Raspberry Pi Pico W - visualisieren von Sensorwerten in Diagramme - Teil 1
Raspberry Pi Pico W – visualisieren von Sensorwerten in Diagramme – Teil 1

Im ersten Beitrag soll es darum gehen, wie diese Daten auf einer Webseite veröffentlicht werden, dazu verwende ich die JavaScript-Bibliothek Google Charts, welche gut dokumentiert und kostenfrei unter https://developers.google.com/chart zu finden ist.

  • Rückblick
  • Ziele
  • Besonderheiten bei Google Charts
  • Benötigte Ressourcen für dieses Projekt
  • Aufbau der Schaltung
    • Pinout des DHT11 Sensors
    • Technische Daten des DHT11 Sensors
  • Programmieren des Raspberry Pi Pico W in der Thonny IDE
    • Aufbau einer Webseite für die Anzeige der Messwerte

Rückblick

Wie du einen Raspberry Pi Pico W in ein lokales Wi-Fi Netzwerk einbindest und eine Webseite auslieferst, habe ich dir bereits in nachfolgenden Beiträgen ausführlich gezeigt.

  • Raspberry Pi Pico W – Webserver programmieren
  • Raspberry Pi Pico W – Webseite ins Internet veröffentlichen

Ziele

Das Ziel dieses Beitrages ist es, dass du erfährst, wie die Sensorwerte eines DHT11 Sensors (Temperatur & rel. Luftfeuchtigkeit) auf einem Liniendiagramm angezeigt werden.

Pi Pico Diagramme visualisieren
Pi Pico Diagramme visualisieren

Besonderheiten bei Google Charts

Für die Darstellung der Diagramme verwende ich wie bereits erwähnt die Google Charts. Diese haben jedoch bei der Verwendung eine Besonderheit, denn diese darf man nicht lokal hosten. Das bedeutet, dass wir diese vom Google Server laden müssen.

Somit haben wir als Bedingung, dass unser kleines Projekt einen Zugriff auf das Internet benötigt.

Benötigte Ressourcen für dieses Projekt

Für den Nachbau dieses Projektes benötigst du:

  • einen Raspberry Pi Pico W,
  • ein Micro-USB Datenkabel,
  • einen DHT11 Sensor,
  • ein 400 Pin Breadboard,
  • diverse Breadboardkabel, männlich – männlich, 10 cm

Den DHT11 Sensor gibt es in 2 Varianten, zum einen als einfachen Baustein und zum anderen auf einer Platine.

Varianten des DHT11 Sensors
Varianten des DHT11 Sensors

Die Unterschiede zwischen diesen Varianten liegen darin, dass bei der Variante mit Platine die Schaltung mit dem benötigten Widerstand bereits vorhanden ist. Solltest du also den einfachen Baustein verwenden (welcher nebenbei auch nicht günstiger oder teurer ist) so musst du zusätzlich noch einen 10 kOhm Widerstand in die Schaltung einbauen.

Aufbau der Schaltung

Zunächst bauen wir die Schaltung mit dem DHT11 Sensor auf.

DHT11 SensorRaspberry Pi Pico W
GNDGND, Pin 38
DATAGP15, Pin 20
VCCVBUS

Hier nun die beiden Schaltungen mit den beiden Varianten des DHT11 Sensors.

Schaltung - Raspberry Pi Pico mit DHT11 Sensor
Schaltung – Raspberry Pi Pico mit DHT11 Sensor
Schaltung - Raspberry Pi Pico mit Bauteil DHT11 & Widerstand
Schaltung – Raspberry Pi Pico mit Bauteil DHT11 & Widerstand

In den Grafiken verwende ich das Vorgängermodell, den Raspberry Pi Pico, dieser ist jedoch baugleich dem neuen Pico W und hat das gleiche Pinout.

Raspberry Pi Pico W mit DHT11 Sensor auf 400 Pin Breadboard
Raspberry Pi Pico W mit DHT11 Sensor auf 400 Pin Breadboard

Pinout des DHT11 Sensors

Hier der vollständigkeitshalber das Pinout der Varianten des DHT11 Sensors.

DHT11 Sensor Pinout
DHT11 Sensor Pinout
Pinout des DHT11 Sensors
Pinout des DHT11 Sensors

Die Varianten auf einer Platine unterscheiden sich darin, dass DATA & VCC vertauscht sind, jedoch ist der Pin DATA auf der Platine mit einem „S“ wie Signal gekennzeichnet.

Technische Daten des DHT11 Sensors

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

Programmieren des Raspberry Pi Pico W in der Thonny IDE

Zum Programmieren des Pi Pico W nutze ich hier die Thonny IDE welche du kostenfrei unter https://thonny.org/ für Linux, macOS und Microsoft Windows herunterladen kannst.

IDE Thonny - erster Start
IDE Thonny – erster Start

Wie du die Thonny IDE unter Linux für den Pi Pico W einrichtest, habe ich dir im gleichnamigen Beitrag Thonny IDE auf Linux einrichten für den Raspberry Pi Pico W ausführlich an Linux Mint erläutert.

Den nachfolgenden kleinen Code habe ich aus der offiziellen englischen Dokumentation von Micropython.

import dht
import machine
d = dht.DHT11(machine.Pin(15))

d.measure()
print("Temperatur:", d.temperature(), "°C", sep=" ")
print("rel. Luftfeuchtigkeit:",d.humidity(), "%", sep=" ")

Wenn wir diesen Code ausführen, dann wird aus der Konsole nachfolgende Meldung ausgegeben.

MicroPython v1.19.1-88-g74e33e714 on 2022-06-30; Raspberry Pi Pico W with RP2040

Type "help()" for more information.
>>> %Run -c $EDITOR_CONTENT
Temperatur: 18 °C
rel. Luftfeuchtigkeit: 70 %
>>> 

Diese beiden Messwerte wollen wir nun auf einer Webseite in Diagramme anzeigen.

Aufbau einer Webseite für die Anzeige der Messwerte

Im ersten Schritt haben wir die beiden Messwerte des DHT11 Sensors ausgelesen und in der Konsole angezeigt. Jetzt möchte ich dir zeigen, wie eine kleine Webseite aufgebaut wird, um diese Daten in Diagramme angezeigt werden.

Wie du eine Webseite am Raspberry Pi Pico W erstellst und auslieferst, habe ich dir bereits im Beitrag Raspberry Pi Pico W – Webseite ins Internet veröffentlichen ausführlich gezeigt.

Webseite mit Messdaten vom DHT11 Sensor
Webseite mit Messdaten vom DHT11 Sensor
Raspberry Pi Pico W – Webseite mit DiagrammHerunterladen

Im Nachfolgenden erstelle ich jeweils für den Sensor sowie für die Seite eigene Dateien, welche in den Hauptcode importiert werden, das hat den Vorteil, dass wir so unseren Code recht übersichtlich halten.

Der DHT11 Sensor liefert alle 1,5 Sekunden einen neuen Wert, daher lese ich auch nur in diesen Abständen die Messdaten aus. Hier kannst du auch locker auf ein Intervall von 5 Minuten (300000 Millisekunden) wechseln.

# importieren der zusätzlichen Module
from dht_sensor import DHT11
from website import *

# importieren der Module für den Aufbau
# der Netzwerkverbindung und die Möglichkeit
# eine Webseite auszuliefern
import network
import socket

# Modul welches Funktionen zur Zeiten bereithält
# zbsp. wieviele Millisekunden seit dem Start
# vergangen sind
import time

# Modul für das steuern der GPIOs am Mikrocontroller
from machine import Pin

# erzeugen einer Instanz des DHT11 Sensors
sensor = DHT11()

# Zugangsdaten zum WiFi Netzwerk
ssid = '****'
password = '****'

# Aufbauen einer WiFi Verbindung
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

print('Verbindung wird aufgebaut...')
max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('.', end='')
    time.sleep(1)

print('')

if wlan.status() != 3:
    raise RuntimeError('Aufbau der Verbindung fehlgeschlagen!')
else:
    print('Erfolgreich mit dem WiFi Netzwerk ', ssid, ' verbunden!' )
    status = wlan.ifconfig()
    print('aktuelle IP-Adresse ist: ' + status[0])

addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

# print('', addr)

# Variablen für das speichern der letzten Ausführung
# zum lesen der Messdaten vom Sensor
last_action = 0

# Wert in Millisekunden
delay = 1500

# ein Zähler welcher hochgezählt wird
data_index = 0

# Variable für das halten der Webseite
html_data = ""

# Endlosschleife
while True:
    # Wenn der Zeitpunkt der letzten Ausführung länger zurück liegt,
    # als der jetzige Zeitpunkt - dem gesetzen delay, dann...
    if last_action < (time.ticks_ms()-delay):
        last_action = time.ticks_ms()     
        data_index = data_index + 1
        # lesen der Sensordaten
        sensor.readSensordata(data_index)
        line_data = "[\"{i}\", {t}, {h}],"
        sensor_data = ""
        # loop über die bisher gespeicherten Daten
        for data in sensor.recorded_data:
            # ein Eintrag aus der Liste enthält:
            # - einen Index,
            # - die Temperatur,
            # - die rel. Luftfeuchtigkeit
            index, temp, hum = data
            # formatieren der Daten
            sensor_data = sensor_data + line_data.format(i=index, t=temp, h=hum)
            # verbinden der Webseite Teil1 & Teil2 inkl. Daten
            html_data = html_part1 + sensor_data[:-1] + html_part2
    
    try:
        # Wenn ein Client verbunden wurde dann die Daten ausliefern.
        cl, addr = s.accept()
        print('Mit dem Client ', addr, ' verbunden.', addr)      
        
        cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        cl.send(html_data)
        cl.close()

    except OSError as e:
        cl.close()
        print('Verbindung geschlossen')



Das Lesen und speichern der Messwerte vom DHT11 Sensor erledigen wir in der Klasse „DHT11“.

import dht
import machine

# der DHT11 Sensor ist am GPIO15 angeschlossen
d = dht.DHT11(machine.Pin(15))

# Klasse um die Daten des Sensors
# auszulesen und die gelesenen
# Daten zu halten.
class DHT11:
   
   temperature = 0
   humidity = 0
   
   recorded_data = []
   
   # lesen und speichern der Messdaten
   def readSensordata(self, index):
       d.measure()
       self.temperature = d.temperature()
       self.humidity = d.humidity()
       self.recorded_data.append([index, self.temperature, self.humidity])
       

Die Webseite halten wir in zwei Variablen, damit dieses den Hauptcode nicht unnötig lang macht, lagere ich diese in einer extra PY-Datei aus und importiere diese lediglich.

Im HEADER der Webseite laden wir die JavaScript-Datei von Google, welche die Funktionen enthält, um ein Diagramm zu zeichnen. Des Weiteren enthält dieser Abschnitt noch einen META-TAG, um die Seite alle 30 Sekunden neu zuladen.

# erster Teil der Webseite
html_part1 = '''
    <!DOCTYPE html>
        <html>
            <head>
                 <meta http-equiv="refresh" content="30">
                 <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
                 <script type="text/javascript">
                      google.charts.load("current", {"packages":["corechart"]});
                      google.charts.setOnLoadCallback(drawChart);

                      function drawChart() {
                              var data = google.visualization.arrayToDataTable([
                                  ["Zeit", "Temperatur", "rel. Luftfeuchtigkeit"],
'''

# hier zwischen kommen die aufbereiteten Daten für das Liniendiagram

# zweiter Teil der Webseite
html_part2 = '''
                                    ]);
                            
                            var options = {
                                title: "DHT11 - Sensordaten",
                                curveType: "function",
                                legend: { position: "bottom" }
                            };
        
                            var chart = new google.visualization.LineChart(document.getElementById("sensordata_container"));
                            chart.draw(data, options);
                      }
                </script>
                <title>Raspberry Pi Pico W</title>
            </head>
            <body>
                <h1>Aufzeichnung der Messdaten des DHT11 am Raspberry Pi Pico W</h1>
                <div id="sensordata_container" style="width: 900px; height: 500px"></div>
            </body>
        </html>
'''

html = html_part1 + html_part2

Damit du diesen Code auf deinem Mikrocontroller ausführen kannst, musst du zusätzlich deine Wi-Fi-Daten (ssid & password) eingeben.

Wenn alles korrekt eingeben und auf dem Mikrocontroller gespielt wurde, dann wird dir in der Konsole die IP-Adresse des Gerätes angezeigt, welche du nun im Browser eingeben musst, um zur Webseite zu gelangen.

MicroPython v1.19.1-88-g74e33e714 on 2022-06-30; Raspberry Pi Pico W with RP2040

Type "help()" for more information.
>>> %Run -c $EDITOR_CONTENT
Verbindung wird aufgebaut...

Erfolgreich mit dem WiFi Netzwerk  FRITZBox7590GI_EXT  verbunden!
aktuelle IP-Adresse ist: 192.168.178.70

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}