diff --git a/southbridge/src/main.rs b/southbridge/src/main.rs index abe79a2..13ce640 100644 --- a/southbridge/src/main.rs +++ b/southbridge/src/main.rs @@ -5,7 +5,7 @@ use core::{panic::PanicInfo, sync::atomic::Ordering}; use common::{Command, Response, SensorData, BAUDRATE}; use embassy_executor::Spawner; -use embassy_rp::{adc::{self, Adc}, bind_interrupts, block::ImageDef, gpio::{Level, Output, Pull}, peripherals::{ADC, PIN_28, UART0, UART1, USB}, pwm::{self, Pwm}, uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, BufferedUartTx, Config}, usb::Driver}; +use embassy_rp::{adc::{self, Adc}, bind_interrupts, block::ImageDef, gpio::{Level, Output, Pull}, peripherals::{ADC, ADC_TEMP_SENSOR, PIN_28, UART0, UART1, USB}, pwm::{self, Pwm}, uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, BufferedUartTx, Config}, usb::Driver}; use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Channel, once_lock::OnceLock}; use embassy_time::{with_deadline, with_timeout, Duration, Instant, Timer}; use embedded_io_async::{BufRead, Read, Write}; @@ -58,7 +58,9 @@ async fn main(spawner: Spawner) { let stopped = drive_conf.clone(); let mut drive_pwm = Pwm::new_output_ab(p.PWM_SLICE0, p.PIN_16, p.PIN_17, stopped.clone()); - spawner.spawn(bus_voltage_monitor(p.ADC, p.PIN_28)).unwrap(); + Timer::after_secs(13).await; // pi 0 serial ports act strange during the boot process + + spawner.spawn(bus_voltage_monitor(p.ADC, p.PIN_28, p.ADC_TEMP_SENSOR)).unwrap(); let config = embassy_rp::i2c::Config::default(); let bus = embassy_rp::i2c::I2c::new_async(p.I2C1, p.PIN_19, p.PIN_18, Irqs, config); @@ -193,14 +195,25 @@ fn calc_speed(speed: f32) -> u16 { } #[embassy_executor::task] -async fn bus_voltage_monitor(adc: ADC, bus: PIN_28) { +async fn bus_voltage_monitor(adc: ADC, bus: PIN_28, temp: ADC_TEMP_SENSOR) { let mut adc = Adc::new(adc, Irqs, adc::Config::default()); let mut bus_voltage = adc::Channel::new_pin(bus, Pull::None); + let mut ts = adc::Channel::new_temp_sensor(temp); + + // from embassy examples + fn convert_to_celsius(raw_temp: u16) -> f32 { + let temp = 27.0 - (raw_temp as f32 * 3.3 / 4096.0 - 0.706) / 0.001721; + let sign = if temp < 0.0 { -1.0 } else { 1.0 }; + let rounded_temp_x10: i16 = ((temp * 10.0) + 0.5 * sign) as i16; + (rounded_temp_x10 as f32) / 10.0 + } loop { let level = adc.read(&mut bus_voltage).await.unwrap(); // empirically calculated against $20 microcenter voltmeter (10k & 33k divider circuit) SENSOR_DATA.send(SensorData::BusVoltage(level as f32 / 251.6763848397)).await; + let temp = adc.read(&mut ts).await.unwrap(); + SENSOR_DATA.send(SensorData::AmbientTemperature(convert_to_celsius(temp))).await; Timer::after_millis(3).await; } }