Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Пошаговое руководство по решению

  1. Инициализируйте периферию светодиода и включите его с произвольным значением, просто чтобы убедиться, что он работает.

    #![allow(unused)]
    fn main() {
     let mut led = WS2812RMT::new(peripherals.pins.gpio2, peripherals.rmt.channel0)?;
    
     led.set_pixel(RGB8::new(20, 0, 20)).unwrap(); // Удалите эту строку после того, как попробуете один раз
    }
  2. Включайте светодиод только при нажатии кнопки. Пока это можно сделать, добавив следующую строку после сообщения о нажатии кнопки:

    #![allow(unused)]
    fn main() {
    led.set_pixel(arbitrary_color)?;
    }
  3. Создайте случайные 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)?;
    
        },
    _ => {},
    }
  4. Необязательно: если вы собираетесь переиспользовать этот код в другом месте, имеет смысл вынести его в отдельную функцию. Заодно можно чётко определить, какие части кода должны находиться в блоках 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();
}

}