An Interest In:
Web News this Week
- April 16, 2024
- April 15, 2024
- April 14, 2024
- April 13, 2024
- April 12, 2024
- April 11, 2024
- April 10, 2024
April 16, 2024 03:02 pm GMT
Original Link: https://dev.to/jenswritescode/embassy-xia-shi-yong-wen-shi-du-chuan-gan-qi-4icf
Embassy
Omar Hiari: Embedded Rust & Embassy: I2C Temperature Sensing with BMP180, Blue Pill DHT20 .
1.
Blue Pill , I2C (PB6, PB7), (PB11, PB10)
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:
Tweet
View Full Article
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To