embassy-am2302 0.5.1

Driver async no_std pour le capteur AM2302 (DHT22), basé sur Embassy.
Documentation

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

[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 :

Constante Carte Fréquence Seuil Recommandé
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.

#![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.