From a93730a61d7a4de42c14677e36bec11658de7aa1 Mon Sep 17 00:00:00 2001 From: Adam Macdonald <72780006+twokilohertz@users.noreply.github.com> Date: Sat, 22 Feb 2025 01:05:38 +0000 Subject: [PATCH] Reading from the sensor --- .cargo/config.toml | 11 +----- .gitignore | 3 ++ Cargo.lock | 52 +++++++++++++++++++++++---- Cargo.toml | 10 ++++-- src/main.rs | 90 ++++++++++++++++++++++++++++++++++++---------- 5 files changed, 128 insertions(+), 38 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index d5c962f..b5945e5 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -15,8 +15,6 @@ rustflags = [ "link-arg=--nmagic", "-C", "link-arg=-Tlink.x", - # "-C", - # "link-arg=-Tdefmt.x", "-C", "target-cpu=cortex-m33", ] @@ -24,13 +22,6 @@ rustflags = [ runner = "picotool load -u -v -x -t elf" [target.riscv32imac-unknown-none-elf] -rustflags = [ - "-C", - "link-arg=--nmagic", - "-C", - "link-arg=-Trp235x_riscv.x", - # "-C", - # "link-arg=-Tdefmt.x", -] +rustflags = ["-C", "link-arg=--nmagic", "-C", "link-arg=-Trp235x_riscv.x"] runner = "picotool load -u -v -x -t elf" diff --git a/.gitignore b/.gitignore index 36a351c..0464a28 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ # Cargo target/ + +# VSCode +.vscode diff --git a/Cargo.lock b/Cargo.lock index a6b49fe..6cc14bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -211,6 +211,12 @@ dependencies = [ "either", ] +[[package]] +name = "log" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" + [[package]] name = "nb" version = "0.1.3" @@ -246,12 +252,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "panic-halt" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a513e167849a384b7f9b746e517604398518590a9142f4846a32e3c2a4de7b11" - [[package]] name = "paste" version = "1.0.15" @@ -262,10 +262,12 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" name = "pico-enviro-sensor" version = "0.1.0" dependencies = [ + "critical-section", "embedded-hal 1.0.0", "fugit", - "panic-halt", "rp235x-hal", + "rtt-target", + "scd4x", ] [[package]] @@ -414,6 +416,17 @@ dependencies = [ "vcell", ] +[[package]] +name = "rtt-target" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4235cd78091930e907d2a510adb0db1369e82668eafa338f109742fa0c83059d" +dependencies = [ + "critical-section", + "portable-atomic", + "ufmt-write", +] + [[package]] name = "rustc_version" version = "0.2.3" @@ -423,6 +436,16 @@ dependencies = [ "semver", ] +[[package]] +name = "scd4x" +version = "0.4.0" +source = "git+https://github.com/twokilohertz/scd4x-rs.git?branch=conversion-fixes#07730523c51d6909530c000de271832125760385" +dependencies = [ + "embedded-hal 1.0.0", + "log", + "sensirion-i2c", +] + [[package]] name = "semver" version = "0.9.0" @@ -438,6 +461,15 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +[[package]] +name = "sensirion-i2c" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "640a03c95c176226cf159ae2727f7fe3245546022639d61459af46d2878aec06" +dependencies = [ + "embedded-hal 1.0.0", +] + [[package]] name = "sha2-const-stable" version = "0.1.0" @@ -472,6 +504,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ufmt-write" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" + [[package]] name = "unicode-ident" version = "1.0.17" diff --git a/Cargo.toml b/Cargo.toml index a84cab0..b697393 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,13 +8,17 @@ version = "0.1.0" edition = "2021" [dependencies] -embedded-hal = "1.0.0" -fugit = "0.3.7" -panic-halt = "1.0.0" rp235x-hal = { version = "0.2.0", features = [ "critical-section-impl", "binary-info", ] } +critical-section = "1.2.0" +embedded-hal = "1.0.0" +fugit = "0.3.7" +scd4x = { git = "https://github.com/twokilohertz/scd4x-rs.git", branch = "conversion-fixes", features = [ + "scd41", +] } +rtt-target = "0.6.1" # Super-optimised release build, maximum performance, minimal debuggability # Build with cargo build --profile dist diff --git a/src/main.rs b/src/main.rs index cd5cd11..a824c7c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,17 +3,13 @@ use embedded_hal::delay::DelayNs; use fugit::RateExtU32; -use panic_halt as _; // Needed so its built & linked correctly - -// Alias for our HAL crate -use rp235x_hal as hal; +use rtt_target::{rprintln, rtt_init_print}; // RP235x HAL -use hal::uart::DataBits; -use hal::uart::StopBits; -use hal::uart::UartConfig; -use hal::uart::UartPeripheral; -use hal::Clock; +use rp235x_hal as hal; + +// Sensor +use scd4x::Scd4x; mod constants; @@ -23,6 +19,9 @@ pub static IMAGE_DEF: hal::block::ImageDef = hal::block::ImageDef::secure_exe(); #[hal::entry] fn main() -> ! { + rtt_init_print!(); + rprintln!("Logging over RTT initialised"); + let mut peripherals = hal::pac::Peripherals::take().unwrap(); let mut watchdog = hal::Watchdog::new(peripherals.WATCHDOG); @@ -49,18 +48,73 @@ fn main() -> ! { &mut peripherals.RESETS, ); - let uart0_pins = (pins.gpio0.into_function(), pins.gpio1.into_function()); + rprintln!("Core RP2350 hardware initialisation successful"); - let uart = UartPeripheral::new(peripherals.UART0, uart0_pins, &mut peripherals.RESETS) - .enable( - UartConfig::new(9600_u32.Hz(), DataBits::Eight, None, StopBits::One), - clocks.peripheral_clock.freq(), - ) - .unwrap(); + // Initialise SCD41 sensor + let i2c0 = hal::I2C::i2c0( + peripherals.I2C0, + pins.gpio4.reconfigure(), // Pin 6 on Pico 2 (SDA) + pins.gpio5.reconfigure(), // Pin 7 on Pico 2 (SCL) + 400.kHz(), + &mut peripherals.RESETS, + &clocks.peripheral_clock, + ); + + timer.delay_ms(30); // Power-up delay + let mut scd41 = Scd4x::new(i2c0, timer); + scd41.wake_up(); + + match scd41.reinit() { + Ok(_) => rprintln!("Initialised SCD41"), + Err(error) => rprintln!("Failed to initialise SCD41: {:?}", error), + } + timer.delay_ms(30); // Soft reset delay + + match scd41.serial_number() { + Ok(serial) => rprintln!("SCD41 serial number: {}", serial), + Err(error) => rprintln!("SCD41 did not respond to get_serial_number: {:?}", error), + } + + match scd41.self_test_is_ok() { + Ok(ok) => { + if ok { + rprintln!("SCD41 reported successful self-test") + } else { + rprintln!("SCD41 reported unsuccessful self-test!") + } + } + Err(_) => rprintln!("SCD41 failed to perform self-test"), + } + + match scd41.start_periodic_measurement() { + Ok(_) => rprintln!("Configured sensor to measure every 5 seconds"), + Err(error) => rprintln!("SCD41 start_periodic_measurement() failed: {:?}", error), + } loop { - uart.write_full_blocking(b"hello, world!\r\n"); - timer.delay_ms(500); + timer.delay_ms(5010); + match scd41.measurement() { + Ok(data) => rprintln!( + "CO2: {}, temperature: {}, humidity: {}", + data.co2, + data.temperature, + data.humidity + ), + Err(error) => rprintln!("SCD41 get_measurement() failed: {:?}", error), + } + } + + // loop { + // hal::arch::wfi(); + // } +} + +#[inline(never)] +#[panic_handler] +fn panic(info: &core::panic::PanicInfo) -> ! { + rprintln!("Panicked! {}", info); + loop { + hal::arch::nop() } }