Mit dem DHT11-Modul Temperatur und Feuchtigkeit messen

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 195
Registriert: Do 21. Okt 2010, 18:31

Mit dem DHT11-Modul Temperatur und Feuchtigkeit messen

Beitrag von Heinrichs » So 29. Jun 2025, 14:58

Mit dem DHT11-Modul kann man die Temperatur und die Luftfeuchtigkeit der Umgebung messen. Der Messbereich für die Luftfeuchtigkeit ist 20% - 90% (±5% Genauigkeit) und für die Temperatur: 0°C – 50°C (±2°C Genauigkeit).

Dass Modul benutzt eine Eindraht-Schnittstelle (One Wire). Wie diese Schnittstelle funktioniert, habe ich in diesem Beitrag dargestellt. Insbesondere habe ich dort auch darauf hingewiesen, dass zum Betrieb des DHT11-Sensors ein Pullup-Widerstand erforderlich ist; ein solcher Widerstand befindet sich bereits auf der Platinen-Version (KY-015).

Zur Programmierung können wir für unseren TTGO auf ein Micropython-Modul zurückgreifen, welches an dieser Stelle kurz beschrieben wird.

In diesem Beitrag zeigen wir zunächst, wie mit diesem Micropython-Modul Daten erfasst und im Terminal (von Thonny) angezeigt werden können. Anschließend wird dargestellt, wie der TTGO die Messwerte auch auf dem Display anzeigen kann.


1. Anschließen des DHT11 an den TTGO

DHT11TTGO
+ 3V
Out Pin 25
- G


2. Programm für Terminal-Anzeige

Code: Alles auswählen

# DHT11_messung_0.py

from time import sleep
import dht
import machine
d = dht.DHT11(machine.Pin(25))

print('DHT11')
while True:
    d.measure()
    t = d.temperature()
    h = d.humidity()
    print('Temperatur:', t, '°C     ', 'Luftfeuchtigkeit:', h, '%')
    sleep(2)
Beachten Sie: Das Programm kann nicht mit allen Pins des TTGO arbeiten. Benutzt man den Pin 36, 37, 38 oder 39, kommt es zu der Fehlermeldung:

Traceback (most recent call last):
File "<stdin>", line 10, in <module>
File "dht.py", line 1, in measure
OSError: [Errno 116] ETIMEDOUT

Das Time-Out ist hier darauf zurückzuführen, dass diese Pins nur als Eingang dienen können: Da sie kein Signal ausgeben können, wartet das Programm vergeblich auf eine Antwort...

Um einen solchen Fehler (oder andere wie z. B. eine falsche Verkabelung :-() abzufangen, kann man in der Endlos-Schleife die folgende try - except - Struktur benutzen:

Code: Alles auswählen

    try:
        d.measure()
        t = d.temperature()
        h = d.humidity()
        print('Temperatur:', t, '°C     ', 'Luftfeuchtigkeit:', h, '%')
        sleep(2)
    except OSError as e:
        print('Fehler beim Lesen des Sensors!')



3. Programm für die Anzeige auf dem TTGO-Display

Code: Alles auswählen

# DHT11_messung_1a.py

from time import sleep

from machine import Pin, SPI
import st7789
import vga2_16x16 as font1 # normal
import vga2_bold_16x32 as font2 # fett
spi = SPI(1, baudrate=20000000, polarity=1, sck=Pin(18), mosi=Pin(19))
display = st7789.ST7789(spi, 135, 240,  reset=Pin(23, Pin.OUT), cs=Pin(5, Pin.OUT), dc=Pin(16, Pin.OUT), backlight=Pin(4, Pin.OUT), rotation=3)
# Landscape
bg_color = 222
display.init()
display.fill(bg_color)

import dht
d = dht.DHT11(Pin(25))

print('DHT11-Messwerte:')
display.text(font2, 'DHT11', 85, 10, st7789.WHITE, bg_color)
while True:
    d.measure()
    t = d.temperature()
    h = d.humidity()
    print('Temperatur:', t, '°C     ', 'Luftfeuchtigkeit:', h, '%')
    t_bytes = bytes('Temp: ' + str(t) + ' ', 'UTF-8')
    display.text(font1, t_bytes + b'\xF8C   ', 20, 55, st7789.WHITE, bg_color)
    display.text(font1, 'Hum:  ' + str(h) + ' %   ', 20, 80, st7789.WHITE, bg_color)
    sleep(2)
Um das Sonderzeichen ° (Grad) anzuzeigen, müssen wir den erweiterten Zeichensatz (vga2) benutzen. Mehr zum Umgang mit Sonderzeichen beim TTGO-Display finden Sie hier.


4. Programm für die Anzeige auf dem TTGO-Display (wie unter Punkt 3), jedoch auch mit Speicherung der Messdaten

Code: Alles auswählen

# DHT11_messung_2.py

from time import sleep
import os

from machine import Pin, SPI
import st7789
import vga2_16x16 as font1 # normal
import vga2_bold_16x32 as font2 # fett
spi = SPI(1, baudrate=20000000, polarity=1, sck=Pin(18), mosi=Pin(19))
display = st7789.ST7789(spi, 135, 240,  reset=Pin(23, Pin.OUT), cs=Pin(5, Pin.OUT), dc=Pin(16, Pin.OUT), backlight=Pin(4, Pin.OUT), rotation=3)
# Landscape
bg_color = 222
display.init()
display.fill(bg_color)

# file_name = input('Dateiname:')
file_name = 'Messreihe.txt'
def save_data(file_name, time, t, h):
    f = open(file_name, 'a') # Daten an (ggf. bestehende) Datei anhängen
    try:
        f.write(str(time) + ',' + str(t) + ',' + str(h) + "\n")
    finally:
        f.close()

import dht
d = dht.DHT11(Pin(25))

print('DHT11-Messwerte:')
display.text(font2, 'DHT11', 85, 10, st7789.WHITE, bg_color)

delta_t = 60 * 30  # Messintervall in s, hier 0,5 h
nr = 0 # Nummer der Messung
while True:
    d.measure()
    t = d.temperature()
    h = d.humidity()
    time = nr * delta_t # Zeit in s
    save_data(file_name, time, t, h)
    print('Temperatur:', t, '°C     ', 'Luftfeuchtigkeit:', h, '%')
    t_bytes = bytes('Temp: ' + str(t) + ' ', 'UTF-8')
    display.text(font1, t_bytes + b'\xF8C   ', 20, 55, st7789.WHITE, bg_color)
    display.text(font1, 'Hum:  ' + str(h) + ' %   ', 20, 80, st7789.WHITE, bg_color)
    sleep(delta_t)
    nr += 1


.

Antworten