Browse Source

:sparkles: can now read temperature sensor via I2C

Felix Bytow 2 days ago
parent
commit
932a5a5d44
1 changed files with 37 additions and 1 deletions
  1. 37 1
      src/main.rs

+ 37 - 1
src/main.rs

@@ -7,8 +7,11 @@ pub mod buzzer;
 use crate::button::Button;
 use crate::buzzer::Buzzer;
 use embassy_executor::Spawner;
-use embassy_futures::select::{select3, Either3};
+use embassy_futures::select::{Either3, select3};
 use embassy_rp::gpio::Pull;
+use embassy_rp::i2c::{Async, Config, I2c, InterruptHandler};
+use embassy_rp::peripherals::I2C1;
+use embassy_rp::{bind_interrupts, i2c};
 use {defmt_rtt as _, panic_probe as _};
 
 struct SideButtons<'a> {
@@ -17,6 +20,27 @@ struct SideButtons<'a> {
     pub down: Button<'a>,
 }
 
+bind_interrupts!(struct Irqs {
+    I2C1_IRQ => InterruptHandler<I2C1>;
+});
+
+async fn get_temperature<'a>(i2c: &mut I2c<'a, I2C1, Async>) -> Result<(u8, u8), i2c::Error> {
+    let address = 0x68u16;
+    let begin_transaction = [0x0Eu8, 0x20u8];
+    let get_temp_high = [0x11u8];
+    let get_temp_low = [0x12u8];
+
+    let mut buffer: [u8; 1] = [0];
+    i2c.write_async(address, begin_transaction).await?;
+    i2c.write_async(address, get_temp_high).await?;
+    i2c.read_async(address, buffer.as_mut_slice()).await?;
+    let temp_high = buffer[0];
+    i2c.write_async(address, get_temp_low).await?;
+    i2c.read_async(address, buffer.as_mut_slice()).await?;
+    let temp_low = (buffer[0] >> 6) * 25; // truncate to 2 digits
+    Ok((temp_high, temp_low))
+}
+
 #[embassy_executor::main]
 async fn main(_spawner: Spawner) -> ! {
     let peripherals = embassy_rp::init(Default::default());
@@ -27,6 +51,18 @@ async fn main(_spawner: Spawner) -> ! {
         up: Button::new(peripherals.PIN_17, Pull::Up),
         down: Button::new(peripherals.PIN_15, Pull::Up),
     };
+    let mut i2c = I2c::new_async(
+        peripherals.I2C1,
+        peripherals.PIN_7,
+        peripherals.PIN_6,
+        Irqs,
+        Config::default(),
+    );
+    if let Ok((temp_high, temp_low)) = get_temperature(&mut i2c).await {
+        defmt::info!("Temperature: {}.{}°C", temp_high, temp_low);
+    } else {
+        defmt::warn!("Could not read temperature!");
+    }
 
     loop {
         defmt::info!("Set-Function: {}", side_buttons.set_function.get_level());