Increase energy efficiency by reducing polling frequency

main
trivernis 10 months ago
parent 53f4ba9a6b
commit 4dd52710c9
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

52
Cargo.lock generated

@ -4,9 +4,9 @@ version = 3
[[package]]
name = "arrayvec"
version = "0.7.2"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
[[package]]
name = "atmo-sense"
@ -227,9 +227,9 @@ dependencies = [
[[package]]
name = "embedded-graphics"
version = "0.7.1"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "750082c65094fbcc4baf9ba31583ce9a8bb7f52cadfb96f6164b1bc7f922f32b"
checksum = "cd2a8e0250a7e1212828166b01eed0219e488ebb2599f44624a29c9bd249f397"
dependencies = [
"az",
"byteorder",
@ -240,9 +240,9 @@ dependencies = [
[[package]]
name = "embedded-graphics-core"
version = "0.3.3"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8b1239db5f3eeb7e33e35bd10bd014e7b2537b17e071f726a09351431337cfa"
checksum = "ba9ecd261f991856250d2207f6d8376946cd9f412a2165d3b75bc87a0bc7a044"
dependencies = [
"az",
"byteorder",
@ -269,18 +269,18 @@ dependencies = [
[[package]]
name = "float-cmp"
version = "0.8.0"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4"
checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
dependencies = [
"num-traits",
]
[[package]]
name = "fugit"
version = "0.3.6"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ab17bb279def6720d058cb6c052249938e7f99260ab534879281a95367a87e5"
checksum = "17186ad64927d5ac8f02c1e77ccefa08ccd9eaa314d5a4772278aa204a22f7e7"
dependencies = [
"gcd",
]
@ -346,9 +346,9 @@ checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286"
[[package]]
name = "lock_api"
version = "0.4.9"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
dependencies = [
"autocfg",
"scopeguard",
@ -356,9 +356,9 @@ dependencies = [
[[package]]
name = "micromath"
version = "1.1.1"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc4010833aea396656c2f91ee704d51a6f1329ec2ab56ffd00bfd56f7481ea94"
checksum = "39617bc909d64b068dcffd0e3e31679195b5576d0c83fadc52690268cc2b2b55"
[[package]]
name = "nb"
@ -466,9 +466,9 @@ checksum = "de96540e0ebde571dc55c73d60ef407c653844e6f9a1e2fdbd40c07b9252d812"
[[package]]
name = "paste"
version = "1.0.12"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79"
checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35"
[[package]]
name = "pio"
@ -507,18 +507,18 @@ dependencies = [
[[package]]
name = "proc-macro2"
version = "1.0.56"
version = "1.0.64"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.27"
version = "1.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500"
checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105"
dependencies = [
"proc-macro2",
]
@ -558,9 +558,9 @@ dependencies = [
[[package]]
name = "rp2040-hal"
version = "0.8.1"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9888dd4a476bb7b25000f6497fed50ade399c38bbfebaa18d14f4fc651a62855"
checksum = "1369bb84862d7f69391a96606b2f29a00bfce7f29a749e23d5f01fc3f607ada0"
dependencies = [
"cortex-m",
"critical-section",
@ -700,9 +700,9 @@ dependencies = [
[[package]]
name = "ssd1306"
version = "0.7.1"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f066d5458b0a27d938dd2b71a8b397d88c5776cb316b8a39f19ef49b6d290709"
checksum = "e1eaea5daefc39bfa675e4e75e484af7e54628ffe4fc5300e52bde5905f6b677"
dependencies = [
"display-interface",
"display-interface-i2c",
@ -741,9 +741,9 @@ dependencies = [
[[package]]
name = "unicode-ident"
version = "1.0.8"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73"
[[package]]
name = "usb-device"

@ -12,15 +12,15 @@ cortex-m-rt = "0.7.3"
embedded-hal = { version = "0.2.7", features = ["unproven"] }
rp2040-boot2 = "0.3.0"
panic-halt = "0.2.0"
rp2040-hal = { version = "0.8.1", features = ["rt", "rom-func-cache", "critical-section-impl"] }
fugit = "0.3.6"
rp2040-hal = { version = "0.8.2", features = ["rt", "rom-func-cache", "critical-section-impl"] }
fugit = "0.3.7"
nb = "1.1.0"
cortex-m-rtic = "1.1.4"
rtic-monotonic = "1.0.0"
systick-monotonic = "1.0.1"
embedded-time = "0.12.1"
ssd1306 = "0.7.1"
embedded-graphics = "0.7.1"
ssd1306 = "0.8.0"
embedded-graphics = "0.8.0"
smart-leds = "0.3.0"
ws2812-pio = "0.6.0"
waveshare-rp2040-zero = "0.6.0"

@ -33,7 +33,7 @@ use hal::{
},
pac::I2C1,
prelude::*,
timer::{Alarm, Alarm0, Alarm1},
timer::{Alarm, Alarm0, Alarm1, Alarm2},
Adc,
};
@ -44,8 +44,8 @@ const HEAP_SIZE: usize = 1024;
const XTAL_FREQ_HZ: u32 = 12_000_000u32;
const MVG_AVG_COUNT: u16 = 20;
const DISPLAY_UPDATE_INT_TICKS: u32 = 500_000;
const SENSOR_READ_INT_TICKS: u32 = 50_000;
const DISPLAY_UPDATE_INT_TICKS: u32 = 2_000_000;
const SENSOR_READ_INT_TICKS: u32 = 1_000_000;
const AIR_QUALITY_THRESHOLD: u16 = 480;
const AIR_QUALITY_THRESHOLD_LOWER: u16 = 400;
@ -72,8 +72,8 @@ mod app {
struct Shared {
alarm0: Alarm0,
alarm1: Alarm1,
alarm2: Alarm2,
sensor_value: u16,
led: LED,
}
#[local]
@ -83,6 +83,8 @@ mod app {
adc_pin: Pin<hal::gpio::bank0::Gpio29, hal::gpio::FloatingInput>,
watchdog: hal::Watchdog,
use_lower_limit: bool,
led: LED,
led_color: smart_leds::RGB<u8>,
}
#[init()]
@ -121,6 +123,10 @@ mod app {
let _ = alarm1.schedule(MicrosDurationU32::from_ticks(SENSOR_READ_INT_TICKS));
alarm1.enable_interrupt();
let mut alarm2 = timer.alarm_2().unwrap();
let _ = alarm2.schedule(MicrosDurationU32::from_ticks(DISPLAY_UPDATE_INT_TICKS));
alarm2.enable_interrupt();
let (mut pio, sm0, _, _, _) = c.device.PIO0.split(&mut resets);
let mut led = ws2812_pio::Ws2812::new(
pins.gpio16.into_mode(),
@ -130,8 +136,6 @@ mod app {
unsafe { core::mem::transmute(timer.count_down()) },
);
led.write([RGB8::new(255, 255, 0)].iter().copied()).unwrap();
let scl = pins.gpio15.into_mode();
let sda = pins.gpio14.into_mode();
let i2c = i2c::I2C::i2c1(
@ -152,8 +156,8 @@ mod app {
Shared {
alarm0,
alarm1,
alarm2,
sensor_value: adc.read(&mut adc_pin).unwrap(),
led,
},
Local {
display,
@ -161,6 +165,8 @@ mod app {
adc_pin,
watchdog,
use_lower_limit: false,
led,
led_color: RGB8::new(255, 255, 255),
},
init::Monotonics(),
)
@ -197,7 +203,7 @@ mod app {
let text = c.shared.sensor_value.lock(|val| format!("{val}"));
let display = c.local.display;
display.clear();
display.clear(BinaryColor::Off).unwrap();
Text::with_alignment(
&text,
display.bounding_box().center(),
@ -214,14 +220,24 @@ mod app {
});
}
#[task(binds = TIMER_IRQ_1, priority = 2, shared = [alarm1, sensor_value, led], local = [adc, adc_pin, watchdog, use_lower_limit])]
#[task(binds = TIMER_IRQ_1, priority = 2, shared = [alarm1, sensor_value], local = [adc, adc_pin, watchdog])]
fn read_sensor(mut c: read_sensor::Context) {
let mut sensor_value: u16 = c.local.adc.read(c.local.adc_pin).unwrap();
sensor_value = c.shared.sensor_value.lock(|v| {
let sensor_value: u16 = c.local.adc.read(c.local.adc_pin).unwrap();
c.shared.sensor_value.lock(|v| {
*v = (*v * (MVG_AVG_COUNT - 1) + sensor_value) / MVG_AVG_COUNT;
*v
});
c.local.watchdog.feed();
c.shared.alarm1.lock(|a| {
a.clear_interrupt();
let _ = a.schedule(MicrosDurationU32::from_ticks(DISPLAY_UPDATE_INT_TICKS));
});
}
#[task(binds=TIMER_IRQ_2, priority = 1, shared = [alarm2, sensor_value], local = [led, led_color, use_lower_limit])]
fn update_led(mut c: update_led::Context) {
let sensor_value = c.shared.sensor_value.lock(|v| *v);
if sensor_value >= AIR_QUALITY_THRESHOLD {
*c.local.use_lower_limit = true;
} else if sensor_value < AIR_QUALITY_THRESHOLD_LOWER && *c.local.use_lower_limit {
@ -237,12 +253,12 @@ mod app {
AIR_QUALITY_THRESHOLD.. => RGB8::new(0, 255, 0),
};
c.shared.led.lock(|l| {
l.write([color].iter().cloned()).unwrap();
});
if *c.local.led_color != color {
c.local.led.write([color].iter().cloned()).unwrap();
*c.local.led_color = color;
}
c.local.watchdog.feed();
c.shared.alarm1.lock(|a| {
c.shared.alarm2.lock(|a| {
a.clear_interrupt();
let _ = a.schedule(MicrosDurationU32::from_ticks(DISPLAY_UPDATE_INT_TICKS));
});

Loading…
Cancel
Save