Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 16, 2024 03:02 pm GMT

Embassy

Omar Hiari: Embedded Rust & Embassy: I2C Temperature Sensing with BMP180, Blue Pill DHT20 .

1.

Blue Pill , I2C (PB6, PB7), (PB11, PB10)

Blue Pill Pins

DHT20 , I2C , Blue Pill

  • VDD -> VDD
  • SDA -> PB7
  • GND -> GND
  • SCL -> PB6## 2., , .


// initialising peripheralslet p = embassy_stm32::init(Default::default());

, I2c , I2C .

// create an I2C handlelet i2c = i2c::I2c::new(    p.I2C1,             // periphral: an I2C peripheral    p.PB6,              // scl: a GPIO pin    p.PB7,              // sda: a GPIO pin    I2cIrqs,            // irq: handle to an interrut(    NoDma,              // tx_dma: an instance to a DMA channel    NoDma,              // rx_dma: an instance to a DMA channel    time::hz(100_000),  // frequency    Default::default(), // config);

DHT20 , i2c::I2c blocking_read blocking_write.
DHT20 , I2C Master-Slave , i2c , DHT20 , "" I2C .

, Generics, i2c , , DMA , i2c . I2c , Rust , lifetime. , "i2c outlive dht20 ".

pub struct Dht20<'d, T, TXDMA = NoDma, RXDMA = NoDma>where    T: i2c::Instance,{    i2c: i2c::I2c<'d, T, TXDMA, RXDMA>,}impl<'d, T, TXDMA, RXDMA> Dht20<'d, T, TXDMA, RXDMA>where    T: i2c::Instance,{    pub fn new(i2c: i2c::I2c<'d, T, TXDMA, RXDMA>) -> Self {        Self { i2c }    }}

DHT20 ,

impl<'d, T, TXDMA, RXDMA> Dht20<'d, T, TXDMA, RXDMA>where    T: i2c::Instance,{    pub async fn init(&mut self) -> Option<()> {        // wait for >= 100 ms        Timer::after(Duration::from_millis(100)).await;        // send initialisation command        let mut send_buffer: [u8; 3] = [0xE1, 0x08, 0x00];        while let Err(err) = self.i2c.blocking_write(DHT20_ADDR, &mut send_buffer) {            error!("send error: {}", err);        }        Timer::after(Duration::from_millis(100)).await;        Some(())    }}


impl<'d, T, TXDMA, RXDMA> Dht20<'d, T, TXDMA, RXDMA>where    T: i2c::Instance,{    pub async fn read(&mut self) -> Option<(f32, f32)> {        // the "messure" command        let mut send_buffer: [u8; 3] = [0xAC, 0x33, 0x00];        if let Err(err) = self.i2c.blocking_write(DHT20_ADDR, &mut send_buffer) {            error!("An error occoured when sending command: {}", err);            self.reset();            return None;        }        // wait for the messurement to finish        Timer::after(Duration::from_millis(80)).await;        // read the result        let mut read_buffer: [u8; 6] = [0; 6];        if let Err(err) = self.i2c.blocking_read(DHT20_ADDR, &mut read_buffer) {            error!("An error when reading result: {}", err);            return None;        }        Self::valid_resault(&read_buffer).unwrap();        Some((            Self::parse_humidity(&read_buffer),            Self::parse_temperature(&read_buffer),        ))    }}


impl<'d, T, TXDMA, RXDMA> Dht20<'d, T, TXDMA, RXDMA>where    T: i2c::Instance,{    fn valid_resault(buffer: &[u8]) -> Option<()> {        assert!(buffer.len() >= 1);        if buffer[0] & 0x68 == 0x08 {            Some(())        } else {            None        }    }    fn parse_humidity(buffer: &[u8]) -> f32 {        assert!(buffer.len() == 6);        let mut hum = buffer[1] as u32;        hum = (hum << 8) | buffer[2] as u32;        hum = (hum << 8) | buffer[3] as u32;        hum >>= 4;        let hum = hum as f32;        (hum / (1 << 20) as f32) * 100f32    }    fn parse_temperature(buffer: &[u8]) -> f32 {        assert!(buffer.len() == 6);        let mut temp: u32 = (buffer[3] & 0x0f) as u32;        temp = (temp << 8) | (buffer[4] as u32);        temp = (temp << 8) | buffer[5] as u32;        let temp = temp as f32;        (temp / ((1 << 20) as f32)) * 200f32 - 50f32    }}


let mut sensor = Dht20::new(i2c);if None == sensor.init().await {    error!("Initialisation Failed")}loop {    if let Some((hum, temp)) = sensor.read().await {        info!("Humidity: {}, Temperature: {}", hum, temp);    }    Timer::after(Duration::from_millis(500)).await;}

3.

()


Original Link: https://dev.to/jenswritescode/embassy-xia-shi-yong-wen-shi-du-chuan-gan-qi-4icf

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To