From 48d8ef95d6242e404633e9b6598b8f14986fb60c Mon Sep 17 00:00:00 2001 From: Clara Dautermann Date: Fri, 11 Jul 2025 21:12:55 +0200 Subject: [PATCH] probably got ADC for NO2 sensor working?? --- firmware/src/main.rs | 93 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 17 deletions(-) diff --git a/firmware/src/main.rs b/firmware/src/main.rs index 7f4a996..15d2cfe 100644 --- a/firmware/src/main.rs +++ b/firmware/src/main.rs @@ -1,11 +1,46 @@ -use bme280::i2c::BME280; +use bme280::{i2c::BME280, Error}; use esp_idf_hal::{ + adc::{ + attenuation, + oneshot::{config::AdcChannelConfig, AdcChannelDriver, AdcDriver}, + ADC2, + }, delay::Delay, - i2c::{I2cConfig, I2cDriver}, + i2c::{I2cConfig, I2cDriver, I2cError}, prelude::Peripherals, }; +struct InitResult<'s, I2C> { + bme280: BME280, + no2_adc: AdcChannelDriver<'s, esp_idf_hal::gpio::Gpio4, AdcDriver<'s, ADC2>>, +} + fn main() { + let mut peripherals = init(); + + loop { + let measurement = peripherals + .bme280 + .measure(&mut Delay::new_default()) + .unwrap(); + + println!( + "temperature:{0}°C, pressure:{1}", + measurement.temperature, measurement.pressure + ); + + match peripherals.no2_adc.read() { + Ok(v) => { + println!("NO2 ADC voltage: {v}"); + } + Err(err) => log::error!("Failed to read ADC for NO2 value with error {err}"), + }; + + Delay::default().delay_ms(1000); + } +} + +fn init<'a>() -> InitResult<'a, I2cDriver<'a>> { //set up logger esp_idf_sys::link_patches(); // Important! esp_idf_svc::log::EspLogger::initialize_default(); @@ -47,7 +82,45 @@ fn main() { Ok(_) => {} Err(err) => { log::error!("Error initializing bme280 sensor:"); - match err { + handle_i2c_error(err); + } + } + log::info!("BME280 up!"); + + //initialize adc2 for MICS2714 + let adc2 = match AdcDriver::new(peripherals.adc2) { + Ok(driver) => driver, + Err(err) => { + log::error!("Failed to initialize AdcDriver with error {err}"); + panic!() + } + }; + + log::info!("Initializing ADC2 on GPIO4 for NO2 sensor…"); + + // Define channel config with desired attenuation + let mut channel_config = AdcChannelConfig::new(); + channel_config.attenuation = attenuation::DB_11; + + let adc_channel_driver: AdcChannelDriver<'a, esp_idf_hal::gpio::Gpio4, AdcDriver<'_, ADC2>> = + match AdcChannelDriver::new(adc2, peripherals.pins.gpio4, &channel_config) { + Ok(channel) => channel, + Err(err) => { + log::error!("Failed to initialize AdcChannelDriver with error {err}"); + panic!() + } + }; + + log::info!("ADC2 channel driver@GPIO4 initialized!"); + + InitResult { + bme280: bme280, + no2_adc: adc_channel_driver, + } +} + +fn handle_i2c_error(error: Error) { + match error { bme280::Error::CompensationFailed => log::error!("Failed to compensate a raw measurement"), bme280::Error::Bus(buserr) => log::error!("Bus error: {}", buserr), bme280::Error::InvalidData => log::error!("Failed to pare sensor data!"), @@ -55,18 +128,4 @@ fn main() { bme280::Error::UnsupportedChip => log::error!("Chip ID doesn't match expected value"), bme280::Error::Delay => log::error!("Delay error"), } - } - } - log::info!("BME280 up!"); - - loop { - let measurement = bme280.measure(&mut Delay::new_default()).unwrap(); - - println!( - "1:temperature:{0}°C, pressure:{1}", - measurement.temperature, measurement.pressure - ); - - Delay::default().delay_ms(1000); - } }