embedded_drivers/
lm75.rs

1//! LM75 temperature sensor
2//!
3
4use embedded_hal::blocking::i2c::{Read, Write, WriteRead};
5
6const LM75_I2CADDR: u8 = 0x48;
7
8pub struct LM75<I> {
9    device: I,
10}
11
12impl<I: Write + WriteRead + Read> LM75<I> {
13    /// Create device driver instance.
14    pub fn new(i2c: I) -> Self {
15        LM75 { device: i2c }
16    }
17
18    pub fn measure(&mut self) -> Result<f32, ()> {
19        let raw = self.read_u16(0x00);
20        Ok((raw >> 8) as f32 + (0.5 * ((raw >> 7) & 0b1) as f32))
21    }
22
23    pub fn release(self) -> I {
24        self.device
25    }
26
27    fn read_u16(&mut self, reg: u8) -> u16 {
28        let mut buf = [0u8; 2];
29        let _ = self.device.write_read(LM75_I2CADDR, &[reg], &mut buf[..]);
30        u16::from_be_bytes(buf)
31    }
32}