Пошаговое руководство по решению
-
Инициализируйте периферию светодиода и включите его с произвольным значением, просто чтобы убедиться, что он работает.
#![allow(unused)] fn main() { let mut led = WS2812RMT::new(peripherals.pins.gpio2, peripherals.rmt.channel0)?; led.set_pixel(RGB8::new(20, 0, 20)).unwrap(); // Удалите эту строку после того, как попробуете один раз } -
Включайте светодиод только при нажатии кнопки. Пока это можно сделать, добавив следующую строку после сообщения о нажатии кнопки:
#![allow(unused)] fn main() { led.set_pixel(arbitrary_color)?; } -
Создайте случайные RGB-значения, вызвав
esp_random().- Эта функция
unsafe. - Она возвращает
u32, поэтому её нужно привести кu8.
#![allow(unused)] fn main() { unsafe { //... 1 => { let r = esp_random() as u8; let g = esp_random() as u8; let b = esp_random() as u8; let color = RGB8::new(r, g, b); led.set_pixel(color)?; }, _ => {}, } - Эта функция
-
Необязательно: если вы собираетесь переиспользовать этот код в другом месте, имеет смысл вынести его в отдельную функцию. Заодно можно чётко определить, какие части кода должны находиться в блоках
unsafe.
#![allow(unused)]
fn main() {
// ...
loop {
// Enable interrupt and wait for new notificaton
button.enable_interrupt()?;
notification.wait(esp_idf_svc::hal::delay::BLOCK);
println!("Button pressed!");
// Generates random rgb values and sets them in the led.
random_light(&mut led);
}
// ...
fn random_light(led: &mut WS2812RMT) {
let mut color = RGB8::new(0, 0, 0);
unsafe {
let r = esp_random() as u8;
let g = esp_random() as u8;
let b = esp_random() as u8;
color = RGB8::new(r, g, b);
}
led.set_pixel(color).unwrap();
}
}