rs-dht-pio/example/rp_pico_dht22.rs
2024-03-14 10:25:12 +01:00

95 lines
2.6 KiB
Rust

#![no_std]
#![no_main]
use core::panic::PanicInfo;
use embassy_executor::Spawner;
use embassy_futures::join::join;
use embassy_rp::{
bind_interrupts,
gpio::{Level, Output},
peripherals::{PIN_15, PIO0},
pio::{InterruptHandler, Pio},
};
use embassy_time::Timer;
use dht_pio::{Dht, Dht22, DhtError};
use embassy_serial;
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
loop {
unsafe {
PANIC_LED.as_mut().unwrap().set_high();
}
}
}
static mut PANIC_LED: Option<Output<'static, PIN_15>> = None;
bind_interrupts!(struct Irqs {
PIO0_IRQ_0 => InterruptHandler<PIO0>;
});
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
let p = embassy_rp::init(Default::default());
unsafe {
PANIC_LED = Some(Output::new(p.PIN_15, Level::Low));
}
// debug: serial port
let (mut serial, usb_future) =
embassy_serial::Serial::new(p.USB, embassy_serial::SerialConfig::new());
// pio access
let pio = p.PIO0;
let Pio {
mut common,
// dht22 state machine
sm1,
..
} = Pio::new(pio, Irqs);
// create DHT22
let mut dht = Dht22::new(&mut common, sm1, p.PIN_0);
let dht_reading = async {
loop {
match dht.read().await {
Ok(reading) => {
serial.send_msg("temp:\n").await.unwrap();
serial
.send_number(reading.temperature as u32, 10)
.await
.unwrap();
serial.send_msg("\n").await.unwrap();
serial.send_msg("humid:\n").await.unwrap();
serial
.send_number(reading.humidity as u32, 10)
.await
.unwrap();
serial.send_msg("\n").await.unwrap();
}
Err(err) => match err {
DhtError::Timeout => serial.send_msg("dht timeout error\n").await.unwrap(),
DhtError::CrcMismatch(data, crc) => {
serial.send_msg("dht checksum error\n").await.unwrap();
serial.send_number(data, 10).await.unwrap();
serial.send_msg("\n").await.unwrap();
serial.send_number(crc, 10).await.unwrap();
serial.send_msg("\n").await.unwrap();
}
DhtError::ReadError => serial.send_msg("dht read error\n").await.unwrap(),
},
}
Timer::after_secs(3).await;
}
};
join(usb_future, dht_reading).await;
}