// CD74HC4067
// 16-Channel Analog Multiplexer
// Demultiplexing not implemented for this simulation.
// https://www.ti.com/lit/ds/symlink/cd74hc4067.pdf

#include <Adafruit_NeoPixel.h>

#define E  21
#define S0 18
#define S1 19
#define S2 22
#define S3 23
#define COM 34
#define NP_PIN 4
#define NUMPIXELS 16

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, NP_PIN, NEO_GRB + NEO_KHZ800);

const uint8_t controlPins[] = { S0, S1, S2, S3 };

float readMux(uint8_t channel)
{
  digitalWrite(E, HIGH);  // Disable chip before changing channel.
  delay(1);
  for(int8_t i = 3; i >= 0; i--)
  {
    int8_t b =  (channel >> i) & 1;
    digitalWrite(controlPins[i], b);
    // Serial.print(b);
  }
  digitalWrite(E, LOW);  // Enable chip after changing channel.
  delay(1);
  // Serial.print(": ");
  return analogRead(COM);
}

void setup()
{
  Serial.begin(115200);
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pixels.begin();
}

void loop()
{
  pixels.clear();
  for(uint8_t i = 0; i < 16; i++)
  {
    float f = readMux(i);
    pixels.setPixelColor(i, pixels.Color(0, f / 4095.0 * 255.0, 0));
    // Serial.print(i);
    // Serial.print(" = ");
    // Serial.println(f);
  }
  pixels.show();
}
CD74HC4067Breakout
CD74HC4067:COM
CD74HC4067:VCC
CD74HC4067:E
CD74HC4067:I0
CD74HC4067:I1
CD74HC4067:I2
CD74HC4067:I3
CD74HC4067:I4
CD74HC4067:I5
CD74HC4067:I6
CD74HC4067:I7
CD74HC4067:I8
CD74HC4067:I9
CD74HC4067:I10
CD74HC4067:I11
CD74HC4067:I12
CD74HC4067:I13
CD74HC4067:I14
CD74HC4067:I15
CD74HC4067:S0
CD74HC4067:S1
CD74HC4067:S2
CD74HC4067:S3
CD74HC4067:GND
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
neopixels:DOUT
neopixels:VDD
neopixels:VSS
neopixels:DIN
pot1:GND
pot1:SIG
pot1:VCC
pot2:GND
pot2:SIG
pot2:VCC
pot3:GND
pot3:SIG
pot3:VCC
pot4:GND
pot4:SIG
pot4:VCC
pot5:GND
pot5:SIG
pot5:VCC
pot6:GND
pot6:SIG
pot6:VCC
pot7:GND
pot7:SIG
pot7:VCC
pot8:GND
pot8:SIG
pot8:VCC
pot9:GND
pot9:SIG
pot9:VCC
pot10:GND
pot10:SIG
pot10:VCC
pot11:GND
pot11:SIG
pot11:VCC
pot12:GND
pot12:SIG
pot12:VCC
pot13:GND
pot13:SIG
pot13:VCC
pot14:GND
pot14:SIG
pot14:VCC
pot15:GND
pot15:SIG
pot15:VCC
pot16:GND
pot16:SIG
pot16:VCC
gnd1:GND
vcc1:VCC
sw1:1
sw1:2
sw1:3