//! //! RGB LED Demo //! //! This example drives an SK68XX RGB LED that is connected to the GPIO8 pin. //! A RGB LED is connected to that pin on the ESP32-C6-DevKitC-1 and board. //! //! The demo will leverage the [`smart_leds`](https://crates.io/crates/smart-leds) //! crate functionality to circle through the HSV hue color space (with //! saturation and value both at 255). Additionally, we apply a gamma correction //! and limit the brightness to 10 (out of 255). #![no_std] #![no_main] use esp32c6_hal::{ clock::ClockControl, peripherals, prelude::*, rmt::Rmt, timer::TimerGroup, Delay, Rtc, IO, }; use esp_backtrace as _; use esp_hal_smartled::{smartLedAdapter, SmartLedsAdapter}; use smart_leds::{ brightness, gamma, hsv::{hsv2rgb, Hsv}, SmartLedsWrite, }; #[entry] fn main() -> ! { let peripherals = peripherals::Peripherals::take(); let mut system = peripherals.PCR.split(); let clocks = ClockControl::boot_defaults(system.clock_control).freeze(); // Disable the watchdog timers. For the ESP32-C6, this includes the Super WDT, // and the TIMG WDTs. let mut rtc = Rtc::new(peripherals.LP_CLKRST); let mut timer_group0 = TimerGroup::new( peripherals.TIMG0, &clocks, &mut system.peripheral_clock_control, ); let mut timer_group1 = TimerGroup::new( peripherals.TIMG1, &clocks, &mut system.peripheral_clock_control, ); // Disable watchdog timers rtc.swd.disable(); rtc.rwdt.disable(); timer_group0.wdt.disable(); timer_group1.wdt.disable(); let io = IO::new(peripherals.GPIO, peripherals.IO_MUX); // Configure RMT peripheral globally let rmt = Rmt::new( peripherals.RMT, 80u32.MHz(), &mut system.peripheral_clock_control, &clocks, ) .unwrap(); // We use one of the RMT channels to instantiate a `SmartLedsAdapter` which can // be used directly with all `smart_led` implementations let mut led = ::new(rmt.channel0, io.pins.gpio8); // Initialize the Delay peripheral, and use it to toggle the LED state in a // loop. let mut delay = Delay::new(&clocks); let mut color = Hsv { hue: 0, sat: 255, val: 255, }; let mut data; loop { // Iterate over the rainbow! for hue in 0..=255 { color.hue = hue; // Convert from the HSV color space (where we can easily transition from one // color to the other) to the RGB color space that we can then send to the LED data = [hsv2rgb(color)]; // When sending to the LED, we do a gamma correction first (see smart_leds // documentation for details) and then limit the brightness to 10 out of 255 so // that the output it's not too bright. led.write(brightness(gamma(data.iter().cloned()), 10)) .unwrap(); delay.delay_ms(20u8); } } }