Compare commits

...

4 Commits

5 changed files with 1679 additions and 154 deletions

3
.gitignore vendored
View File

@@ -1,5 +1,8 @@
# Cargo
target/
# Firmware blobs
cyw43-firmware/
# VSCode
.vscode

1754
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,7 @@ edition = "2021"
[dependencies]
# Embassy
embassy-rp = { version = "0.3.1", features = [
embassy-rp = { version = "0.4.0", features = [
"rp235xa",
"binary-info",
"critical-section-impl",
@@ -24,12 +24,19 @@ embassy-executor = { version = "0.7.0", features = [
embassy-time = "0.4.0"
embassy-embedded-hal = "0.3.0"
embassy-futures = "0.1.1"
embassy-sync = "0.6.2"
embassy-sync = "0.6.2" # TODO: Update when embassy-embedded-hal on crates.io is tracking 0.7.0
trouble-host = { version = "0.1.0", default-features = false, features = [
"peripheral",
"gatt",
"derive",
] }
# System
cortex-m-rt = "0.7.5"
cortex-m = "0.7.7"
critical-section = "1.2.0"
cyw43 = { version = "0.3.0", features = ["bluetooth"] }
cyw43-pio = "0.4.0"
rtt-target = "0.6.1"
# embedded-graphics
@@ -37,16 +44,23 @@ embedded-graphics = "0.8.1"
embedded-graphics-framebuf = "0.5.0"
# Peripherals
scd4x = { version = "0.4.0", features = ["scd41"] }
scd4x = { version = "0.4.1", features = ["scd41"] }
ssd1351 = "0.5.0"
display-interface-spi = "0.5.0"
# Extra
static_cell = "2.1.0"
heapless = "0.8.0"
circular-buffer = { version = "1.0.0", default-features = false }
circular-buffer = { version = "1.1.0", default-features = false }
fixed = "1.29.0"
[build-dependencies]
reqwest = { version = "0.12.20", features = ["blocking"] }
[features]
# Skips downloading the Wi-Fi & Bluetooth chipset firmware, assumes that it is in `./cyw43-firmware`
skip-cyw43-firmware = []
[profile.dev]
opt-level = "s"

View File

@@ -6,6 +6,9 @@ fn main() {
let out = PathBuf::from(std::env::var_os("OUT_DIR").unwrap());
println!("cargo:rustc-link-search={}", out.display());
#[cfg(not(feature = "skip-cyw43-firmware"))]
download_cyw43_firmware();
// ARM build
let memory_x = include_bytes!("memory.x");
@@ -22,3 +25,41 @@ fn main() {
println!("cargo:rerun-if-changed=build.rs");
}
/// Downloads to firmware for the Wi-Fi / Bluetooth chipset on the RPi Pico 2 W
#[cfg(not(feature = "skip-cyw43-firmware"))]
fn download_cyw43_firmware() {
let download_folder = "cyw43-firmware";
let url_base = "https://raw.githubusercontent.com/embassy-rs/embassy/refs/tags/cyw43-v0.3.0/cyw43-firmware";
let file_names = [
"43439A0.bin",
"43439A0_btfw.bin",
"43439A0_clm.bin",
"LICENSE-permissive-binary-license-1.0.txt",
"README.md",
];
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed={}", download_folder);
std::fs::create_dir_all(download_folder).expect("failed to create firmware directory");
// download each file into the directory "cyw43-firmware"
for file in file_names {
let url = format!("{}/{}", url_base, file);
// only fetch if it doesn't exist
if std::path::Path::new(download_folder).join(file).exists() {
continue;
}
match reqwest::blocking::get(&url) {
Ok(response) => {
let content = response.bytes().expect("failed to read file content");
let file_path = PathBuf::from(download_folder).join(file);
std::fs::write(file_path, &content).expect("failed to write file");
}
Err(err) => panic!(
"failed to download the cyw43 firmware from {}: {}, required for BLE support",
url, err
),
}
}
}

View File

@@ -8,11 +8,15 @@ use scd4x::Scd4x;
use crate::{I2c0BusMutex, SENSOR_DATA_SIGNAL};
const BACKGROUND_CO2_PPM: u16 = 427;
/// Read CO2/temp./humidity data from the sensor
#[embassy_executor::task]
pub async fn sensor_read_task(i2c_bus: &'static I2c0BusMutex) {
debug_rprintln!("Sensor read task started");
// Initialise SCD41
Timer::after_millis(30).await; // SCD41 power-up delay
let i2c_dev = I2cDevice::new(i2c_bus);
@@ -20,6 +24,11 @@ pub async fn sensor_read_task(i2c_bus: &'static I2c0BusMutex) {
scd41.wake_up();
scd41.reinit().unwrap();
// https://climate.nasa.gov/vital-signs/carbon-dioxide/?intent=121
scd41
.set_automatic_self_calibration_target(BACKGROUND_CO2_PPM)
.unwrap();
match scd41.serial_number() {
Ok(serial) => debug_rprintln!("[SCD41] Serial number: {}", serial),
Err(error) => debug_rprintln!(
@@ -28,6 +37,8 @@ pub async fn sensor_read_task(i2c_bus: &'static I2c0BusMutex) {
),
}
// Measurement loop
scd41.start_periodic_measurement().unwrap();
loop {
@@ -53,4 +64,6 @@ pub async fn sensor_read_task(i2c_bus: &'static I2c0BusMutex) {
}
}
}
scd41.stop_periodic_measurement().unwrap();
}