# embassy-am2302 (v0.5.1) 🦅
Driver async no_std pour le capteur de température et d'humidité AM2302 (DHT22).
Conçu spécifiquement pour l'écosystème Embassy (embassy-time, embassy-sync) et optimisé pour les performances du RP2350 (Pico 2).
## ⚠️ VERSIONS DÉPRÉCIÉES
**Les versions 0.1.x, 0.2.x, 0.3.x et 0.4.x sont DÉPRÉCIÉES et ne doivent plus être utilisées.**
Ces versions anciennes souffrent de :
- Conflits de structures EnvData inter-tâches
- Problèmes de typages critiques
- Incompatibilités avec le système de signaux
- Comportements instables en async
**Utilisez obligatoirement la v0.5.1 ou supérieure.**
## 🔴 ATTENTION CRITIQUE
> La v0.5.1 corrige les conflits de structures EnvData lors de l'utilisation des signaux inter-tâches. C'est l'**unique version stable recommandée** pour tout projet asynchrone.
## Fonctionnalités
- **Async Natif** : Entièrement non-bloquant via embassy-time.
- **Calibration RP2350** : Testé et validé sur Pico 2 avec des seuils adaptés à la vitesse du processeur.
- **Découplage Inter-tâches** : Module signals intégré pour une communication thread-safe entre vos tâches.
- **Zéro Allocation** : Idéal pour les systèmes bare-metal et les kernels comme JC-OS.
## Installation
```toml
[dependencies]
embassy-am2302 = "0.5.1"
embassy-time = { version = "0.4.0" }
embassy-sync = { version = "0.6.0" }
embedded-hal = { version = "1.0" }
```
## Constantes de seuil (Calibration)
Le DHT22 mesure la durée des impulsions. La vitesse du processeur influence le comptage. Voici les valeurs validées :
| `PICO2_BIT_THRESHOLD` | Raspberry Pi Pico 2 | 150 MHz | 120 (Validé) |
| `PICO_BIT_THRESHOLD` | Raspberry Pi Pico | 125 MHz | 40 |
**Note** : Si vous utilisez des câbles longs, privilégiez un seuil plus élevé.
## Exemple Complet : Intégration JC-OS (LCD + Capteur)
Voici comment orchestrer le capteur et un écran LCD HD44780 en utilisant le multitâche Embassy.
```rust
#![no_std]
#![no_main]
use embassy_executor::Spawner;
use embassy_rp::gpio::{Flex, Pull};
use embassy_rp::i2c::{Config as I2cConfig, I2c};
use embassy_time::{Delay, Duration, Timer};
use hd44780_i2c_nostd::LcdI2c;
use core::fmt::Write;
use heapless::String;
// Utilisation du driver et du signal global
use embassy_am2302::{am2302_read, EnvData};
use embassy_am2302::signals::ENV_SIGNAL;
#[embassy_executor::task]
async fn sensor_task(mut pin: Flex<'static>) {
loop {
// Seuil 120 optimisé pour la vitesse de la Pico 2
match am2302_read(&mut pin, 120).await {
Ok(data) => ENV_SIGNAL.signal(data),
Err(_) => ENV_SIGNAL.signal(EnvData { temp: 999.0, hum: 0.0 }),
}
Timer::after(Duration::from_millis(2500)).await;
}
}
#[embassy_executor::task]
async fn display_task(mut lcd: LcdI2c<I2c<'static, embassy_rp::peripherals::I2C0, embassy_rp::i2c::Async>>) {
let mut delay = Delay;
lcd.init(&mut delay).await.ok();
lcd.set_backlight(true).ok();
loop {
let data = ENV_SIGNAL.wait().await; // Attend la mesure de sensor_task
let _ = lcd.clear(&mut delay).await;
let mut s: String<16> = String::new();
if data.temp > 500.0 {
write!(lcd, "SENSOR ERROR").ok();
} else {
write!(s, "T: {:.1} C", data.temp).ok();
lcd.set_cursor(0, 0, &mut delay).await.ok();
lcd.write_str(s.as_str(), &mut delay).await.ok();
}
}
}
```
## Schéma de Câblage (Pico 2)
Pour éviter les erreurs 999.0 (Sensor Error), respectez scrupuleusement ce montage :
- **VCC** : Reliez au VBUS (5V) pour plus de stabilité.
- **DATA** : Pin GP22 (Pin 29 physique).
- **GND** : Masse commune.
- **PULL-UP** : Ajoutez une résistance physique de 4.7kΩ entre DATA et 3.3V.
## Pourquoi cette architecture ?
L'utilisation du ENV_SIGNAL intégré permet un découplage total :
- Votre tâche de lecture gère le timing critique du capteur.
- Votre tâche d'affichage (ou de log) réagit instantanément dès qu'une donnée est disponible.
- Aucune variable globale risquée (`static mut`), tout passe par un Signal sécurisé par section critique.
## Copyright
Copyright (C) 2026 Jorge Andre Castro
Signé : The Rust Eagle 🦅
## Licence
Ce projet est distribué sous licence GPL-2.0-or-later.
Voir le fichier LICENSE pour les détails.