#![no_std]
#![no_main]
use esp_backtrace as _;
use esp_hal::{
analog::adc::{Adc, AdcConfig, Attenuation},
clock::CpuClock,
delay::Delay,
gpio::{Level, Output},
main,
};
#[main]
fn main() -> ! {
esp_println::logger::init_logger_from_env();
// Common Setup Code
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
let peripherals = esp_hal::init(config);
let delay = Delay::new();
// End Common Setup Code
let analog_pin = peripherals.GPIO0;
let mut adc_config = AdcConfig::new();
let mut pin = adc_config.enable_pin(analog_pin, Attenuation::_11dB);
let mut adc = Adc::new(peripherals.ADC1, adc_config);
let mut output_pins = [
Output::new(peripherals.GPIO10, Level::Low),
Output::new(peripherals.GPIO9, Level::Low),
Output::new(peripherals.GPIO8, Level::Low),
Output::new(peripherals.GPIO7, Level::Low),
Output::new(peripherals.GPIO6, Level::Low),
Output::new(peripherals.GPIO5, Level::Low),
Output::new(peripherals.GPIO4, Level::Low),
Output::new(peripherals.GPIO3, Level::Low),
Output::new(peripherals.GPIO2, Level::Low),
Output::new(peripherals.GPIO1, Level::Low),
];
let min = 0_u32;
let max = 4_095_u32;
loop {
let reading = u32::from(nb::block!(adc.read_oneshot(&mut pin)).unwrap());
let leds_lit_up = usize::try_from(map_linear(
reading,
min,
max,
0_u32,
u32::try_from(output_pins.len()).unwrap(),
))
.unwrap();
for led in &mut output_pins[..leds_lit_up] {
led.set_high();
}
for led in &mut output_pins[leds_lit_up..] {
led.set_low();
}
delay.delay_millis(100);
}
}
fn map_linear(x: u32, min_in: u32, max_in: u32, min_out: u32, max_out: u32) -> u32 {
((x - min_in) * (max_out - min_out) / (max_in - min_in)) + min_out
}