capteur-dht11.py
The Adafruit CircuitPython driver runs on stock Linux: it bit-bangs the DHT 1-wire protocol through libgpiod. The script prints temperature and humidity every 2 s, shrugging off invalid frames without crashing.
Hardware
A Radxa Rock 3B (Rockchip RK3566 quad Cortex-A55, 2-8 GB) running Radxa Debian/Armbian, with built-in Wi-Fi 5 and Bluetooth. 1 DHT11/DHT22 sensor + 10 kΩ resistor (3-pin module: already built in).
Wiring
VDD to 3.3 V, DATA to the script pin (GPIO4) with a 10 kΩ pull-up to 3.3 V, GND to GND.
How it works
adafruit_dht drives the protocol through the kernel (use_pulseio=False): start pulse, microsecond timing, decoding. Periodic failures are normal on the DHT11.
Running it
On the Radxa image: apt install gpiod python3-gpiod; the 40-pin header is mapped like the Raspberry Pi (gpioinfo to confirm the chip, often gpiochip1).
Variants
Log to CSV with the cron script, or expose readings over the network with the built-in web server on port 8080.
capteur-dht11.py
#!/usr/bin/env python3
# DHT11/DHT22 via adafruit-circuitpython-dht (pilote en noyau ou bit-bang).
# Installation :
# sudo apt install python3-dev python3-venv libgpiod2
# python3 -m venv ~/.venv && source ~/.venv/bin/activate
# pip install adafruit-circuitpython-dht
import time
import board
import adafruit_dht
# Broche physique 7 (GPIO4 sur connecteur standard 40 broches) :
capteur = adafruit_dht.DHT11(board.D4, use_pulseio=False)
# DHT22 : adafruit_dht.DHT22(board.D4, use_pulseio=False)
print("Ctrl-C pour arreter")
while True:
try:
t = capteur.temperature # degres Celsius
h = capteur.humidity # % HR
print(f"T = {t:0.1f} C | HR = {h:0.1f} %")
except RuntimeError as erreur:
# Le DHT rate parfois une trame : normal, on recommence.
print("trame invalide:", erreur.args[0])
time.sleep(2.0)