mirror of
				https://github.com/esp-rs/esp-hal.git
				synced 2025-11-03 22:32:57 +00:00 
			
		
		
		
	* PeripheralClockControl timer * Add PeripheralClockControl to timg, wdt, sha, usb-serial-jtag and uart * ESP32 updated examples * ESP32C2 updated examples * ESP32C3 updated examples * ESP32S2 updated examples * ESP32S3 updated examples * ESP32C6 updated examples * cargo fmt
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
//! //! 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-C3-DevKitM-1 and
 | 
						|
//! ESP32-C3-DevKitC-02 boards.
 | 
						|
//!
 | 
						|
//! 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 esp32c3_hal::{
 | 
						|
    clock::ClockControl,
 | 
						|
    peripherals,
 | 
						|
    prelude::*,
 | 
						|
    pulse_control::ClockSource,
 | 
						|
    timer::TimerGroup,
 | 
						|
    Delay,
 | 
						|
    PulseControl,
 | 
						|
    Rtc,
 | 
						|
    IO,
 | 
						|
};
 | 
						|
#[allow(unused_imports)]
 | 
						|
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.SYSTEM.split();
 | 
						|
    let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
 | 
						|
 | 
						|
    let mut rtc = Rtc::new(peripherals.RTC_CNTL);
 | 
						|
    let timer_group0 = TimerGroup::new(
 | 
						|
        peripherals.TIMG0,
 | 
						|
        &clocks,
 | 
						|
        &mut system.peripheral_clock_control,
 | 
						|
    );
 | 
						|
    let mut wdt0 = timer_group0.wdt;
 | 
						|
    let io = IO::new(peripherals.GPIO, peripherals.IO_MUX);
 | 
						|
 | 
						|
    // Disable watchdogs
 | 
						|
    rtc.swd.disable();
 | 
						|
    rtc.rwdt.disable();
 | 
						|
    wdt0.disable();
 | 
						|
 | 
						|
    // Configure RMT peripheral globally
 | 
						|
    let pulse = PulseControl::new(
 | 
						|
        peripherals.RMT,
 | 
						|
        &mut system.peripheral_clock_control,
 | 
						|
        ClockSource::APB,
 | 
						|
        0,
 | 
						|
        0,
 | 
						|
        0,
 | 
						|
    )
 | 
						|
    .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 = <smartLedAdapter!(1)>::new(pulse.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);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |