Eine Klasse für das DHT20-Modul
Verfasst: Sa 19. Jul 2025, 22:36
Wenn man das DHT20-Modul im Rahmen eines größeren Projektes benutzen möchte, kann es sinnvoll sein, das Messprogramm in eine entsprechende Klasse DHT20 auszulagern. Ein entsprechender Quellcode ist:
Der Code entspricht im Wesentlichen dem in meinem Beitrag Das DHT20-Modul ausführlich dargestellten Programm DHT20_0.py. Dieses Programm übertragen wir nun unter dem Namen dht20.py in den Speicher des TTGO.
Das folgende Programm greift auf diese Klasse DHT20 zurück und gibt die Messwerte für Temperatur und Luftfeuchtigkeit auf dem TTGO-Display an.
.
Code: Alles auswählen
# dht20.py
# Klasse für DHT20 mit Testprogramm
# Temperatur und Luftfeuchtigkeit messen
# 18.07.25
from time import sleep, sleep_ms
from machine import Pin, I2C
from sys import exit
class DHT20:
def __init__(self, addr, i2c):
self.addr = addr
self.i2c = i2c
sleep_ms(100)
if not self.is_ready():
# print('Falscher Status! Initialisieren...')
self.initialize()
sleep_ms(100)
if not self.is_ready():
print('Falscher Status! Abbruch...')
exit()
else:
print('Initialisieren erfolgreich!')
def is_ready(self) -> bool: # vgl. Abschnitt 7.4.1 vom Datasheet
self.i2c.writeto(self.addr, b'\x71')
return self.i2c.readfrom(self.addr, 1)[0] & 0x18 == 0x18
def initialize(self):
buffer = b'\x00\x00'
self.i2c.writeto_mem(self.addr, 0x1B, buffer)
self.i2c.writeto_mem(self.addr, 0x1C, buffer)
self.i2c.writeto_mem(self.addr, 0x1E, buffer)
def trigger_measurements(self):
self.i2c.writeto_mem(self.addr, 0xAC, b'\x33\x00')
def read_measurements(self):
buffer = self.i2c.readfrom(self.addr, 7)
return buffer
def get_t_h(self):
sleep_ms(10)
self.trigger_measurements() # AC-Command, vgl. Abschnitt 7.4.2 vom Datasheet
sleep_ms(80)
buffer = self.read_measurements()
if buffer[0] >= 128: # Status-Bit 7 ist gleich 1 => Lesen der Messwerte noch nicht abgeschlossen
print('Lesen der Messwerte noch nicht abgeschlossen => warten...')
sleep_ms(80)
buffer = self.read_measurements() # neuer Versuch...
if buffer[0] >= 128:
print('Keine Messwerte lesbar => Abbruch')
exit()
raw_t = (buffer[3] & 0x0F) << 16 | buffer[4] << 8 | buffer[5] # vgl. DHT20_0.py
raw_h = buffer[1] << 12 | buffer[2] << 4 | buffer[3] >> 4
t = raw_t / 2**20 * 200 - 50 # vgl. Formeln in Abschnitt 8 vom Datasheet
h = raw_h / 2**20 * 100
return t, h
Das folgende Programm greift auf diese Klasse DHT20 zurück und gibt die Messwerte für Temperatur und Luftfeuchtigkeit auf dem TTGO-Display an.
Code: Alles auswählen
# DHT20_1.py (benötigt die Klasse DHT20 aus dem Modul dht20.py)
# 18.06.2025
# Temperatur und Luftfeuchtigkeit messen und auf Display anzeigen
# Kein CRC-Check
from dht20 import DHT20
from time import sleep, sleep_ms
from machine import Pin, I2C, SPI
import vga2_16x16 as font1 # normal
import vga2_bold_16x32 as font2 # fett
import st7789
from sys import exit
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)
display.text(font2, 'DHT20', 85, 10, st7789.WHITE, bg_color)
i2c = I2C(1, scl=Pin(25), sda=Pin(26))
i2c_addr = 0x38 # OHNE red/write-Bit
interval = 10 # Zeit zwischen zwei Messungen in s
dht20 = DHT20(i2c_addr, i2c)
while True:
t, h = dht20.get_t_h()
t = f'{t:.1f}' # t als Zeichenkette mit nur 1 Nachkommastelle
h = f'{h:.1f}' # h als Zeichenkette mit nur 1 Nachkommastelle
print('t =', t, '°C h =', h, '%') # zu Testzwecken
t_bytes = bytes('Temp: ' + t + ' ', 'UTF-8')
display.text(font1, t_bytes + b'\xF8C ', 10, 60, st7789.WHITE, bg_color)
display.text(font1, 'Hum: ' + h + ' % ', 10, 85, st7789.WHITE, bg_color)
sleep(interval)
.