Crate blinksy_esp

Source
Expand description

§ESP32 Blinksy Extensions

ESP32-specific extensions for the Blinksy LED control library using esp-hal.

§Features

§Example

#![no_std]
#![no_main]

use esp_hal as hal;

use blinksy::{
    driver::ClocklessLed,
    drivers::ws2812::Ws2812Led,
    layout::Layout1d,
    layout1d,
    patterns::rainbow::{Rainbow, RainbowParams},
    ControlBuilder,
};
use blinksy_esp::{create_rmt_buffer, time::elapsed, Ws2812Rmt};

#[hal::main]
fn main() -> ! {
    let cpu_clock = hal::clock::CpuClock::max();
    let config = hal::Config::default().with_cpu_clock(cpu_clock);
    let p = hal::init(config);

    // Define the LED layout (1D strip of 300 pixels)
    layout1d!(Layout, 60 * 5);

    // Setup the WS2812 driver using RMT.
    let ws2812_driver = {
        // IMPORTANT: Change `p.GPIO16` to the GPIO pin connected to your WS2812 data line.
        // For example, if using GPIO2, change to `p.GPIO2`.
        // Ensure the chosen pin is not used for other critical functions (e.g., strapping, JTAG).
        let data_pin = p.GPIO16;

        // RMT peripheral frequency, typically 80MHz for WS2812 on ESP32.
        let rmt_clk_freq = hal::time::Rate::from_mhz(80);

        // Initialize RMT peripheral.
        let rmt = hal::rmt::Rmt::new(p.RMT, rmt_clk_freq).unwrap();
        let rmt_channel = rmt.channel0;

        // Create RMT buffer
        const NUM_LEDS: usize = Layout::PIXEL_COUNT;
        const CHANNELS_PER_LED: usize = <Ws2812Led as ClocklessLed>::LED_CHANNELS.channel_count(); // Usually 3 (RGB)
        let rmt_buffer = create_rmt_buffer!(NUM_LEDS, CHANNELS_PER_LED);

        Ws2812Rmt::new(rmt_channel, data_pin, rmt_buffer)
    };

    // Build the Blinky controller
    let mut control = ControlBuilder::new_1d()
        .with_layout::<Layout>()
        .with_pattern::<Rainbow>(RainbowParams {
            ..Default::default()
        })
        .with_driver(ws2812_driver)
        .build();

    control.set_brightness(0.2); // Set initial brightness (0.0 to 1.0)

    loop {
        let elapsed_in_ms = elapsed().as_millis();
        control.tick(elapsed_in_ms).unwrap();

        // Optional: Add a delay to control the update rate and reduce CPU usage.
        // Without an explicit delay, the loop will run as fast as possible.
    }
}

§Getting started

For more help to get started, see “Getting Started” section in gledopto README.

Modules§

rmt
RMT-based LED Driver
time
Time Utilities

Macros§

create_rmt_buffer
Macro to allocate a buffer sized for a specific number of LEDs to be addressed.

Type Aliases§

Ws2812Rmt
WS2812 LED driver using the ESP32 RMT peripheral.