From ff2a2e24405a2ed99bf2d0556aaea00715dc9588 Mon Sep 17 00:00:00 2001 From: Clara Dautermann Date: Tue, 8 Jul 2025 20:55:28 +0200 Subject: [PATCH] measure pressure and temp! --- firmware/Cargo.lock | 84 ++++++++++++++++++++++++++++++++++++++++++++ firmware/Cargo.toml | 3 ++ firmware/src/main.rs | 74 ++++++++++++++++++++++++++++++++++---- 3 files changed, 155 insertions(+), 6 deletions(-) diff --git a/firmware/Cargo.lock b/firmware/Cargo.lock index 01fdb1f..589ff31 100644 --- a/firmware/Cargo.lock +++ b/firmware/Cargo.lock @@ -94,6 +94,16 @@ version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +[[package]] +name = "bme280" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "169ac81b9123f316fde5b0e00175294dcdcdd800c1a6c92a4b58caf42a14cf1f" +dependencies = [ + "embedded-hal 1.0.0", + "maybe-async-cfg", +] + [[package]] name = "bstr" version = "1.12.0" @@ -621,8 +631,11 @@ dependencies = [ name = "firmware" version = "0.1.0" dependencies = [ + "bme280", "embuild", + "esp-idf-hal", "esp-idf-svc", + "esp-idf-sys", "log", ] @@ -890,6 +903,43 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "manyhow" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn 1.0.109", + "syn 2.0.104", +] + +[[package]] +name = "manyhow-macros" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + +[[package]] +name = "maybe-async-cfg" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dbfaa67a76e2623580df07d6bb5e7956c0a4bae4b418314083a9c619bd66627" +dependencies = [ + "manyhow", + "proc-macro2", + "pulldown-cmark", + "quote", + "syn 1.0.109", +] + [[package]] name = "memchr" version = "2.7.5" @@ -1038,6 +1088,17 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -1047,6 +1108,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "pulldown-cmark" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" +dependencies = [ + "bitflags 2.9.1", + "memchr", + "unicase", +] + [[package]] name = "quote" version = "1.0.40" @@ -1214,6 +1286,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1365,6 +1443,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/firmware/Cargo.toml b/firmware/Cargo.toml index 9724ed8..20325cd 100644 --- a/firmware/Cargo.toml +++ b/firmware/Cargo.toml @@ -25,6 +25,9 @@ experimental = ["esp-idf-svc/experimental"] [dependencies] log = "0.4" esp-idf-svc = "0.51" +bme280 = "0.5.1" +esp-idf-hal = "0.45.2" +esp-idf-sys = { version = "0.36.1", features = ["binstart"] } # --- Optional Embassy Integration --- # esp-idf-svc = { version = "0.51", features = ["critical-section", "embassy-time-driver", "embassy-sync"] } diff --git a/firmware/src/main.rs b/firmware/src/main.rs index 9f40bc6..7f4a996 100644 --- a/firmware/src/main.rs +++ b/firmware/src/main.rs @@ -1,10 +1,72 @@ +use bme280::i2c::BME280; +use esp_idf_hal::{ + delay::Delay, + i2c::{I2cConfig, I2cDriver}, + prelude::Peripherals, +}; + fn main() { - // It is necessary to call this function once. Otherwise some patches to the runtime - // implemented by esp-idf-sys might not link properly. See https://github.com/esp-rs/esp-idf-template/issues/71 - esp_idf_svc::sys::link_patches(); - - // Bind the log crate to the ESP Logging facilities + //set up logger + esp_idf_sys::link_patches(); // Important! esp_idf_svc::log::EspLogger::initialize_default(); + log::info!("Meow :3"); - log::info!("Hello, world!"); + // Initialize peripherals + let peripherals = Peripherals::take().unwrap(); + + // Define SCL and SDA pins + let sda = peripherals.pins.gpio21; + let scl = peripherals.pins.gpio22; + + // Create I2C config + let config = I2cConfig::new().baudrate(100000.into()); + + log::info!("Initializing I2C bus…"); + + // Initialize I2C driver + let i2c_bus = match I2cDriver::new( + peripherals.i2c0, // or i2c1/i2c2 based on board + sda, + scl, + &config, + ) { + Ok(i2c_connection) => i2c_connection, + Err(err) => { + log::error!("Initializing I2C connection failed with {err}!"); + panic!() + } + }; + + log::info!("I2C up!"); + log::info!("Initializing bme280…"); + + let mut bme280 = BME280::new_primary(i2c_bus); + + //initialize Sensor + match bme280.init(&mut Delay::new(100000)) { + Ok(_) => {} + Err(err) => { + log::error!("Error initializing bme280 sensor:"); + match err { + 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!"), + bme280::Error::NoCalibrationData => log::error!("No calibration data is available (probably forgot to call or check BME280::init for failure)"), + 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); + } }