#include <Adafruit_NeoPixel.h>
#define LED_PIN 6
#define LED_COUNT 10 // Solo 10 LED usati
#define MUX1_COM 8
#define MUX2_COM 7
#define MUX_S0 12
#define MUX_S1 11
#define MUX_S2 10
#define MUX_S3 9
Adafruit_NeoPixel leds(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Struttura per ogni switch: mux (1 o 2), canale base (pari)
struct Switch {
uint8_t mux; // 1 = mux1, 2 = mux2
uint8_t channel; // canale del throw sinistro (es. 0, 2, 4...)
};
Switch switches[10] = {
{1, 0}, // sw9 → I0/I1 mux1
{1, 2}, // sw8 → I2/I3
{1, 4}, // sw7 → I4/I5
{1, 6}, // sw6 → I6/I7
{1, 8}, // sw10 → I8/I9
{1, 10}, // sw4 → I10/I11
{1, 12}, // sw3 → I12/I13
{1, 14}, // sw2 → I14/I15
{2, 0}, // sw1 → I0/I1 mux2
{2, 2} // sw5 → I2/I3 mux2
};
void selectMux(uint8_t ch) {
digitalWrite(MUX_S0, ch & 0x01);
digitalWrite(MUX_S1, (ch >> 1) & 0x01);
digitalWrite(MUX_S2, (ch >> 2) & 0x01);
digitalWrite(MUX_S3, (ch >> 3) & 0x01);
}
void setup() {
pinMode(MUX_S0, OUTPUT);
pinMode(MUX_S1, OUTPUT);
pinMode(MUX_S2, OUTPUT);
pinMode(MUX_S3, OUTPUT);
pinMode(MUX1_COM, INPUT_PULLUP);
pinMode(MUX2_COM, INPUT_PULLUP);
leds.begin();
leds.setBrightness(80);
leds.clear();
leds.show();
}
void loop() {
for (uint8_t i = 0; i < 10; i++) {
uint8_t ch = switches[i].channel;
// Leggi il canale sinistro (es. I0, I2, ...)
selectMux(ch);
delayMicroseconds(200);
bool left = (switches[i].mux == 1) ? digitalRead(MUX1_COM) : digitalRead(MUX2_COM);
// Leggi il canale destro (ch+1)
selectMux(ch + 1);
delayMicroseconds(200);
bool right = (switches[i].mux == 1) ? digitalRead(MUX1_COM) : digitalRead(MUX2_COM);
uint32_t color;
if (!left && right) {
color = leds.Color(255, 0, 0); // Rosso: levetta a sinistra
}
else if (left && !right) {
color = leds.Color(0, 0, 255); // Blu: levetta a destra
}
else {
color = 0; // Spento: centro o errore
// Alternativa: color = leds.Color(20, 0, 20); // viola dim per centro
}
leds.setPixelColor(i, color);
}
leds.show();
}