probably got ADC for NO2 sensor working??
This commit is contained in:
parent
ff2a2e2440
commit
48d8ef95d6
1 changed files with 76 additions and 17 deletions
|
|
@ -1,11 +1,46 @@
|
||||||
use bme280::i2c::BME280;
|
use bme280::{i2c::BME280, Error};
|
||||||
use esp_idf_hal::{
|
use esp_idf_hal::{
|
||||||
|
adc::{
|
||||||
|
attenuation,
|
||||||
|
oneshot::{config::AdcChannelConfig, AdcChannelDriver, AdcDriver},
|
||||||
|
ADC2,
|
||||||
|
},
|
||||||
delay::Delay,
|
delay::Delay,
|
||||||
i2c::{I2cConfig, I2cDriver},
|
i2c::{I2cConfig, I2cDriver, I2cError},
|
||||||
prelude::Peripherals,
|
prelude::Peripherals,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct InitResult<'s, I2C> {
|
||||||
|
bme280: BME280<I2C>,
|
||||||
|
no2_adc: AdcChannelDriver<'s, esp_idf_hal::gpio::Gpio4, AdcDriver<'s, ADC2>>,
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
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
|
//set up logger
|
||||||
esp_idf_sys::link_patches(); // Important!
|
esp_idf_sys::link_patches(); // Important!
|
||||||
esp_idf_svc::log::EspLogger::initialize_default();
|
esp_idf_svc::log::EspLogger::initialize_default();
|
||||||
|
|
@ -47,7 +82,45 @@ fn main() {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::error!("Error initializing bme280 sensor:");
|
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<I2cError>) {
|
||||||
|
match error {
|
||||||
bme280::Error::CompensationFailed => log::error!("Failed to compensate a raw measurement"),
|
bme280::Error::CompensationFailed => log::error!("Failed to compensate a raw measurement"),
|
||||||
bme280::Error::Bus(buserr) => log::error!("Bus error: {}", buserr),
|
bme280::Error::Bus(buserr) => log::error!("Bus error: {}", buserr),
|
||||||
bme280::Error::InvalidData => log::error!("Failed to pare sensor data!"),
|
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::UnsupportedChip => log::error!("Chip ID doesn't match expected value"),
|
||||||
bme280::Error::Delay => log::error!("Delay error"),
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue