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

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

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.

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.

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.

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

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

Kommentar hinterlassen

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