Browse Source

Extended the ws2812 example with some HSV code

master
Weird Constructor 1 year ago
parent
commit
03db963938
  1. 102
      ws2812_led_cube/src/main.rs

102
ws2812_led_cube/src/main.rs

@ -27,6 +27,8 @@ use ws2812_pio::Ws2812;
#[used]
pub static BOOT2: [u8; 256] = rp2040_boot2::BOOT_LOADER_W25Q080;
const LEN : usize = 302;
struct MovingAvg {
buf: [u16; 30],
ptr: u16,
@ -51,6 +53,42 @@ impl MovingAvg {
}
}
pub fn hsv2rgb(hue: f32, sat: f32, val: f32) -> (f32, f32, f32) {
let c = val * sat;
let v = (hue / 60.0) % 2.0 - 1.0;
let v = if v < 0.0 { -v } else { v };
let x = c * (1.0 - v);
let m = val - c;
let (r_, g_, b_) =
if hue >= 0.0 && hue < 60.0 {
(c, x, 0.0)
} else if hue >= 60.0 && hue < 120.0 {
(x, c, 0.0)
} else if hue >= 120.0 && hue < 180.0 {
(0.0, c, x)
} else if hue >= 180.0 && hue < 240.0 {
(0.0, x, c)
} else if hue >= 240.0 && hue < 300.0 {
(x, 0.0, c)
} else { // if hue >= 300.0 && hue < 360.0 {
(c, 0.0, x)
};
// println!("in: h={}, s={}, v={}, r:{}, g:{}, b: {}", hue, sat, val,
// (r_ + m) * 255.0,
// (g_ + m) * 255.0,
// (b_ + m) * 255.0);
(r_ + m, g_ + m, b_ + m)
}
pub fn hsv2rgb_u8(h: f32, s: f32, v: f32) -> (u8, u8, u8) {
let r = hsv2rgb(h, s, v);
(
(r.0 * 255.0) as u8,
(r.1 * 255.0) as u8,
(r.2 * 255.0) as u8
)
}
#[entry]
fn main() -> ! {
info!("Program start");
@ -97,45 +135,49 @@ fn main() -> ! {
let mut n: u8 = 0;
let mut leds : [RGB8; 7] = [
(0, 0, 0).into(),
(0, 0, 0).into(),
(255, 0, 255).into(),
(0, 255, 255).into(),
(255, 255, 0).into(),
( 0, 255, 0).into(),
(255, 0, 0).into(),
];
let mut leds_off : [RGB8; LEN] = [(0,0,0).into(); LEN];
let mut leds : [RGB8; LEN] = [(0,0,0).into(); LEN];
let mut avg = MovingAvg::new();
for i in 0..LEN {
leds[i] = (255, 128, 64).into();
}
// leds[149] = (255, 255, 255).into();
// leds[70] = (255, 0, 255).into();
// leds[100] = (255, 0, 0).into();
let colors : [RGB8; 3] = [
hsv2rgb_u8(0.0, 1.0, 1.0).into(),
(0, 255, 0).into(),
(0, 0, 255).into(),
];
let mut timer_cnt : usize = 0;
let mut state_on = false;
let amperes = 8.0;
let all_on_amp = (LEN as f32 * 3.0 * 60.0) / 1000.0;
let mut r : u16 = avg.next(adc.read(&mut adc_pin_0).unwrap());
loop {
timer_cnt = timer_cnt.wrapping_add(1);
n = n.wrapping_add(1);
let vbrightness = ((amperes / all_on_amp) * 255.0) as u8;
info!("brightness={} / 255", vbrightness);
ws.write(brightness(leds_off.iter().copied(), vbrightness)).unwrap();
if n == 255 {
rot(&mut leds[2..]);
}
// for i in 0..LEN {
// leds[i] = colors[1];
// }
// info!("LEDS={}", leds.len());
if n % 8 == 0 {
r = avg.next(adc.read(&mut adc_pin_0).unwrap());
info!("adc={}", r);
}
let mut cnt = 0;
if state_on && timer_cnt > (10000 / 16) {
state_on = false;
let mut j = 0;
} else if r <= 1000 {
state_on = true;
timer_cnt = 0;
loop {
cnt += 1;
if cnt > 400 {
cnt = 0;
}
let b = if n > 128 { 128 - (n - 128) } else { n };
let vbrightness = if !state_on { 0 } else { 64 + (b / 3) };
let clr = hsv2rgb_u8((cnt as f32 / 400.0) * 360.0, 0.0, 1.0);
// info!("[{}] clr : {}", cnt, clr);
for i in 0..LEN {
leds[i] = clr.into();
}
ws.write(brightness(leds.iter().copied(), vbrightness)).unwrap();
delay.start(16.milliseconds());

Loading…
Cancel
Save