From 9a420cb99028f56d856f7466b9c1a647633075fe Mon Sep 17 00:00:00 2001 From: Rajas Paranjpe <52586855+ChocolateLoverRaj@users.noreply.github.com> Date: Sun, 18 Aug 2024 22:34:19 -0700 Subject: [PATCH] rp2040 zero rainbow using palette --- boards/waveshare-rp2040-zero/Cargo.toml | 1 + .../waveshare_rp2040_zero_neopixel_rainbow.rs | 46 +++++++++---------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/boards/waveshare-rp2040-zero/Cargo.toml b/boards/waveshare-rp2040-zero/Cargo.toml index 801248a..afd49cc 100644 --- a/boards/waveshare-rp2040-zero/Cargo.toml +++ b/boards/waveshare-rp2040-zero/Cargo.toml @@ -12,6 +12,7 @@ repository = "https://github.com/rp-rs/rp-hal-boards.git" [dependencies] cortex-m-rt = { workspace = true, optional = true } +palette = { version = "0.7.6", default-features = false, features = ["libm"] } rp2040-boot2 = { workspace = true, optional = true } rp2040-hal.workspace = true diff --git a/boards/waveshare-rp2040-zero/examples/waveshare_rp2040_zero_neopixel_rainbow.rs b/boards/waveshare-rp2040-zero/examples/waveshare_rp2040_zero_neopixel_rainbow.rs index ff49f4d..615e261 100644 --- a/boards/waveshare-rp2040-zero/examples/waveshare_rp2040_zero_neopixel_rainbow.rs +++ b/boards/waveshare-rp2040-zero/examples/waveshare_rp2040_zero_neopixel_rainbow.rs @@ -8,6 +8,9 @@ use core::iter::once; use embedded_hal::delay::DelayNs; +use palette::rgb::Rgb; +use palette::{FromColor, Hsl}; +// use palette::Hsl; use panic_halt as _; use smart_leds::{brightness, SmartLedsWrite, RGB8}; use waveshare_rp2040_zero::entry; @@ -71,31 +74,26 @@ fn main() -> ! { ); // Infinite colour wheel loop - let mut n: u8 = 128; + let mut hue: f64 = 0.0; let mut timer = timer; // rebind to force a copy of the timer loop { - ws.write(brightness(once(wheel(n)), 32)).unwrap(); - n = n.wrapping_add(1); - - timer.delay_ms(25); - } -} - -/// Convert a number from `0..=255` to an RGB color triplet. -/// -/// The colours are a transition from red, to green, to blue and back to red. -fn wheel(mut wheel_pos: u8) -> RGB8 { - wheel_pos = 255 - wheel_pos; - if wheel_pos < 85 { - // No green in this sector - red and blue only - (255 - (wheel_pos * 3), 0, wheel_pos * 3).into() - } else if wheel_pos < 170 { - // No red in this sector - green and blue only - wheel_pos -= 85; - (0, wheel_pos * 3, 255 - (wheel_pos * 3)).into() - } else { - // No blue in this sector - red and green only - wheel_pos -= 170; - (wheel_pos * 3, 255 - (wheel_pos * 3), 0).into() + ws.write(brightness( + once({ + let hsl = Hsl::::new(hue as f64, 1.0, 0.5); + let rgb = Rgb::from_color(hsl).into_format(); + RGB8::new(rgb.red, rgb.green, rgb.blue) + }), + { + // 0 is off and 1 is max brightness + let brightness = 0.05 as f64; + (brightness * u8::MAX as f64) as u8 + }, + )) + .unwrap(); + hue += 360.0 / 6.0 / u8::MAX as f64; + if hue >= 360.0 { + hue -= 360.0; + } + timer.delay_ms(1) } }