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