#![no_std]
#![no_main]
use esp_backtrace as _;
use esp_hal::{clock::CpuClock, delay::Delay, gpio::Io, main};
use esp_hal::{analog::adc::{Adc, AdcConfig, Attenuation, AdcCalScheme}, peripherals::Peripherals};
use esp_hal::rmt::Rmt;
use esp_hal_smartled::SmartLedsAdapter;
use smart_leds::{SmartLedsWrite, RGB8};
esp_bootloader_esp_idf::esp_app_desc!();
const N_LEDS: usize = 16;
// Simple “hot metal” gradient from dim red to white
fn hot_color(level: u8) -> RGB8 {
// level: 0..=255. We'll build from red -> orange -> yellow -> white
// split into three zones to keep it light-weight for no_std
let l = level as u16;
if l < 85 {
// 0..84: dark red -> red
let r = (l * 3) as u8; // 0..=255
RGB8 { r, g: 0, b: 0 }
} else if l < 170 {
// 85..169: red -> orange/yellow (increase G)
let t = l - 85; // 0..84
RGB8 { r: 255, g: (t * 3) as u8, b: 0 }
} else {
// 170..255: yellow -> white (increase B slightly)
let t = l - 170; // 0..85
RGB8 { r: 255, g: 255, b: (t * 3 / 2) as u8 } // max ~127 blue
}
}
#[main]
fn main() -> ! {
// Max CPU clock & init HAL
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
let peripherals = esp_hal::init(config);
let mut delay = Delay::new();
esp_println::logger::init_logger_from_env();
// --- GPIO / IO ---
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
// --- ADC: Potentiometer on GPIO2 (ADC1_CH2 on ESP32-C3) ---
// If you use a different pin, change below and in Wokwi wiring.
let mut adc_cfg = AdcConfig::new();
// 11dB gives wide input range; for Wokwi it’s fine; IRL keep pot <3.3V.
let mut pot_pin = adc_cfg.enable_pin(io.pins.gpio2.into_analog(), Attenuation::Attenuation11dB);
let mut adc = Adc::<_, { AdcCalScheme::Internal }>::new(peripherals.ADC1, adc_cfg).unwrap();
// --- RMT for NeoPixel on GPIO8 (DIN) ---
// WS2812 timings are handled by SmartLedsAdapter over RMT.
let rmt = Rmt::new(peripherals.RMT, 80.MHz()).unwrap();
let ch = rmt.channel0.configure(io.pins.gpio8);
let mut leds = SmartLedsAdapter::new(ch);
let mut data = [RGB8::default(); N_LEDS];
loop {
// Read potentiometer (12-bit typical): 0..=4095
let raw: u16 = nb::block!(adc.read(&mut pot_pin)).unwrap_or(0);
// Map to 0..=255
let level: u8 = ((raw as u32 * 255) / 4095) as u8;
// Build color and apply to all pixels
let color = hot_color(level);
for p in data.iter_mut() {
*p = color;
}
// Write out
let _ = leds.write(data.into_iter());
// Small delay to debounce / ease CPU
delay.delay_millis(8);
}
}