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::{
|
||||
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<I2C>,
|
||||
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<I2cError>) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue