Added temperature sensor

This commit is contained in:
2024-03-28 00:03:58 +01:00
parent 73c2710e77
commit 1c518b6b95
3 changed files with 75 additions and 9 deletions

View File

@@ -3,7 +3,9 @@
#![feature(type_alias_impl_trait)]
use core::{cell::RefCell, str::from_utf8};
use core::fmt::Debug;
use bme280::{i2c::AsyncBME280, Measurements};
use const_format::formatcp;
use cyw43::PowerManagementMode;
use cyw43_pio::PioSpi;
@@ -17,12 +19,13 @@ use embassy_rp::{
clocks::RoscRng,
flash::{Flash, WRITE_SIZE},
gpio::{Flex, Input, Level, Output, Pin, Pull},
peripherals::{DMA_CH1, PIN_23, PIN_25, PIO0},
i2c,
peripherals::{DMA_CH1, I2C0, PIN_23, PIN_25, PIO0},
pio::{self, Pio},
Peripheral,
};
use embassy_sync::blocking_mutex::Mutex;
use embassy_time::{Duration, Ticker, Timer};
use embassy_time::{Delay, Duration, Ticker, Timer};
use heapless::Vec;
use nourl::Url;
use rand::{
@@ -43,6 +46,7 @@ use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs {
PIO0_IRQ_0 => pio::InterruptHandler<PIO0>;
I2C0_IRQ => i2c::InterruptHandler<I2C0>;
});
const ID: &str = env!("ID");
@@ -63,14 +67,23 @@ struct SetMessage {
struct StateMessage {
state: State,
manual: bool,
temperature: f32,
humidity: f32,
pressure: f32,
}
impl StateMessage {
pub fn new((state, manual): (State, bool)) -> Self {
Self { state, manual }
pub fn new<E: Debug>((state, manual): (State, bool), measurements: Measurements<E>) -> Self {
Self {
state,
manual,
temperature: measurements.temperature,
humidity: measurements.humidity,
pressure: measurements.pressure,
}
}
pub fn vec(&self) -> Vec<u8, 64> {
pub fn vec(&self) -> Vec<u8, 128> {
serde_json_core::to_vec(self)
.expect("The buffer should be large enough to contain all the data")
}
@@ -287,6 +300,11 @@ async fn main(spawner: Spawner) {
let mut controller = Controller::new(p.PIN_28, p.PIN_27, p.PIN_26, p.PIN_22);
let i2c = i2c::I2c::new_async(p.I2C0, p.PIN_1, p.PIN_0, Irqs, i2c::Config::default());
let mut bme280 = AsyncBME280::new_primary(i2c);
let mut delay = Delay {};
bme280.init(&mut delay).await.unwrap();
let pwr = Output::new(p.PIN_23, Level::Low);
let cs = Output::new(p.PIN_25, Level::High);
@@ -413,8 +431,7 @@ async fn main(spawner: Spawner) {
.await
{
Either3::First(_) => {
client.send_ping().await.unwrap();
None
Some(StateMessage::new(controller.get_state(), bme280.measure(&mut delay).await.unwrap()))
}
Either3::Second(message) => match message {
Ok((TOPIC_UPDATE, url)) => {
@@ -457,7 +474,7 @@ async fn main(spawner: Spawner) {
controller.set_state(message.get_state());
Some(StateMessage::new(controller.get_state()))
Some(StateMessage::new(controller.get_state(), bme280.measure(&mut delay).await.unwrap()))
}
Ok(_) => None,
Err(err) => {
@@ -468,7 +485,7 @@ async fn main(spawner: Spawner) {
cortex_m::peripheral::SCB::sys_reset();
}
},
Either3::Third(state) => Some(StateMessage::new(state)),
Either3::Third(state) => Some(StateMessage::new(state, bme280.measure(&mut delay).await.unwrap())),
};
if let Some(message) = message {