#![no_std]
#![no_main]

use esp_backtrace as _;
use esp_hal::{
    prelude::*,
    delay::Delay,
    gpio::{Level, Output, Pin},
    analog::adc::{Adc, AdcConfig, Attenuation}
};
use esp_println::{
    print,
    println
};

#[entry]
fn main() -> ! {
    let peripherals = esp_hal::init(esp_hal::Config::default());
    let s3 = Output::new(peripherals.GPIO19.degrade(), Level::Low);
    let s2 = Output::new(peripherals.GPIO21.degrade(), Level::Low);
    let s1 = Output::new(peripherals.GPIO22.degrade(), Level::Low);
    let s0 = Output::new(peripherals.GPIO23.degrade(), Level::Low);

    let mut mux_pins = [s0, s1, s2, s3];

    let analog_pin = peripherals.GPIO34;
    let mut adc1_config = AdcConfig::new();
    let mut sig_pin = adc1_config.enable_pin(
        analog_pin,
        Attenuation::Attenuation11dB,
    );
    let mut adc1 = Adc::new(peripherals.ADC1, adc1_config);

    let delay = Delay::new();

    let mut values: [u16; 16] = [0; 16];

    loop {
        for channel in 0..16 {
            let mut bin: [char; 4] = ['0'; 4];

            for i in 0..4 {
                if (channel >> i) & 1 == 1 {
                    bin[i] = '1';
                    let _ = mux_pins[i].set_high();
                } else {
                    bin[i] = '0';
                    let _ = mux_pins[i].set_low();
                }
            }

            for i in 0..4 {
                print!("{}", bin[3-i]);
            }

            delay.delay_millis(10);
            values[channel] = nb::block!(adc1.read_oneshot(&mut sig_pin)).unwrap();
            
            println!(": {}", values[channel]);

            delay.delay_millis(125);
        }

        for i in 0..15 {
          print!("{},", values[i]);
        }
        println!("{}", values[15]);
        
        delay.delay_millis(1000);
    }
}
Loading
cd74hc4067