embassy-am2302
Driver async no_std pour le capteur de température et d'humidité AM2302 (DHT22).
Compatible avec toutes les cartes et tous les exécuteurs async via embedded-hal.
⚠️ La version 0.1.0 est obsolète et ne doit pas être utilisée. Elle dépendait d'
embassy-timeet d'embassy-sync, ce qui causait des conflits de dépendances avec les projets Embassy utilisant une source git. Utilise la version 0.2.0 ou supérieure, La version 0.2.1 reste la identique avec un exemple plus réel pour plus de plaisir.
Fonctionnalités
- Lecture de la température et de l'humidité via le protocole 1-Wire du DHT22
- Entièrement asynchrone via
embedded-hal-async - Aucune dépendance Embassy — compatible avec n'importe quel exécuteur async
- Aucun timer hardware requis — mesure des bits par comptage de boucles
- Vérification de la somme de contrôle (checksum) intégrée
- Support des températures négatives
- Compatible
no_std— aucune allocation dynamique
Matériel supporté
| Capteur | Protocole | Tension |
|---|---|---|
| AM2302 / DHT22 | 1-Wire | 3.3V – 5V |
Fonctionne avec toute carte dont le HAL implémente embedded-hal 1.0 :
RP2350, RP2350, STM32, nRF52, ESP32, et plus encore.
Installation
[]
= "0.2"
Utilisation
La crate expose une seule fonction : am2302_read(). Elle retourne un EnvData
ou une erreur typée. La gestion du signal et de la boucle de lecture
reste dans ton projet, ce qui évite tout conflit de dépendances.
Exemple complet — Embassy RP2350 avec LCD HD44780
Voici un exemple réel d'intégration dans un projet Embassy RP2350 utilisant un LCD HD44780 via I2C pour afficher la température et l'humidité.
signals.rs — déclare le signal dans ton projet :
use CriticalSectionRawMutex;
use Signal;
use EnvData;
pub static ENV_SIGNAL: = new;
tasks.rs — tâche de lecture du capteur :
use Flex; // embassy-rp avec feature rp2350
use ;
use am2302_read;
use crateENV_SIGNAL;
pub async
tasks.rs — tâche d'affichage sur LCD (alternance toutes les 3 secondes) :
use LcdI2c;
use ;
use I2C0;
use ;
use Write;
use String;
use crateENV_SIGNAL;
pub async
main.rs — spawn des tâches :
let pin = new; // broche DATA du AM2302
spawner.spawn.unwrap;
spawner.spawn.unwrap;
Exemple — Embassy STM32
use Flex;
use ;
use am2302_read;
pub async
Gestion fine des erreurs
use Am2302Error;
match am2302_read.await
Pourquoi pas de timer hardware ?
Le DHT22 encode ses bits par la durée relative du signal haut (~28µs pour un 0,
~70µs pour un 1). Cette crate mesure cette durée par comptage d'itérations de boucle
plutôt que par un timer matériel, ce qui apporte deux avantages :
- Zéro dépendance à
embassy-time— aucun conflit possible entre versions - Portabilité maximale — fonctionne sur tout MCU sans configuration de timer
Le seuil de détection (40 itérations) est calibré pour un Cortex-M33 à 150 MHz (Raspberry Pi Pico 2). Sur des MCU significativement plus lents ou plus rapides, ajuste le seuil dans ta tâche en validant avec un oscilloscope.
Protocole de communication
- Signal de start — la broche est mise à l'état bas pendant 20 ms
- Handshake — le capteur répond avec un signal bas puis haut (~80 µs chacun)
- Lecture des 40 bits — chaque bit est précédé d'un signal bas de ~50 µs :
- Signal haut court (~28 µs) → bit 0
- Signal haut long (~70 µs) → bit 1
- Validation — la somme des 4 premiers octets doit correspondre au 5ème (checksum)
Structure des données
Gestion des erreurs
Migration depuis 0.1.0
| 0.1.0 | 0.2.0 |
|---|---|
am2302_task(pin) |
am2302_read(&mut pin, &mut delay) |
am2302_run(pin, delay) |
am2302_read(&mut pin, &mut delay) dans ta propre boucle |
embassy_am2302::signals::ENV_SIGNAL |
Déclare ton propre Signal dans ton projet |
Dépend d'embassy-time et embassy-sync |
Aucune dépendance Embassy |
Licence
Ce projet est distribué sous licence GPL-2.0-or-later.
Voir le fichier LICENSE pour les détails.