|
|
@@ -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());
|