Eine Klasse für das DHT20-Modul

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

Eine Klasse für das DHT20-Modul

Beitrag von Heinrichs » 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:

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
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_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)


.
Dateianhänge
DHT20_Anhang_1.zip
dht20.py, DHT20_1.py, Datasheet zum DHT20
(639.83 KiB) 83-mal heruntergeladen

Antworten