Sto cercando di leggere 16 pulsanti ,collegati in pullup, con un multiplexer collegato ad un ESP32
L'alimentazione del multiplexer è collegato a +5V mentre i pulsanti ai 3.3V
Quando premo i pulsanti invio una scritta per controllare sulla seriale ed esce fuori che se premo i pulsanti pari , 0 2 4 6 8 ..... , i dati risultano casuali mentre con i dispari va tutto bene e non capisco il perchè
#include<MyTimer.h>
MyTimer button = MyTimer();
const int SPin[4] = {2, 0, 4, 16}; // 4 Pin usati per inviare il codice binario
const int EPin1 = 15;
const int STable[16][4] = {
// Crea un Array con i valori binari da richiamare in base al canale Y scelto
// s3 , s2 . s1 , s0, canale
{0, 0, 0, 0}, // Y0
{0, 0, 0, 1}, // Y1
{0, 0, 1, 0}, // Y2
{0, 0, 1, 1}, // Y3
{0, 1, 0, 0}, // Y4
{0, 1, 0, 1}, // Y5
{0, 1, 1, 0}, // Y6
{0, 1, 1, 1}, // Y7
{1, 0, 0, 0}, // Y8
{1, 0, 0, 1}, // Y9
{1, 0, 1, 0}, // Y10
{1, 0, 1, 1}, // Y11
{1, 1, 0, 0}, // Y12
{1, 1, 0, 1}, // Y13
{1, 1, 1, 0}, // Y14
{1, 1, 1, 1} // Y15
};
bool statoLed[16]={true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true};
void setup() {
Serial.begin(115200);
button.set(500);
pinMode(EPin1, OUTPUT);// Inizializza EPin come OUTPUT
digitalWrite(EPin1, LOW); // presetta EPin LOW, leggere la nota all'inizio del programma per i dettagli
pinMode(SIG1, INPUT_PULLUP); // Inizializza SIG come INPUT_PULLUP
for (int i = 0; i < 4; i++)
{
pinMode(SPin[i], OUTPUT); // Inizializza tutti gli Spin come OUTPUT
digitalWrite(SPin[i], LOW); // Setta tutti gli Spin LOW
}
}
void loop() {
pulsanti();
}
void pulsanti(){
uint8_t a ;
uint8_t b ;
for(a=0;a<14;a++){
YSelect(a);
b = digitalRead(SIG1);
if (b==0){
// if(button.check()){
delay(500);
Serial.println("Check avvenuto");
if (b==0){
statoLed[a]=!statoLed[a];
Serial.print("Pulsante ");
Serial.print(a);
Serial.print(" = ");
Serial.println(statoLed[a]);
}
// button.set(300);
// }else{
// a-=1;
// }
}
}
}
void YSelect(int Y) {
digitalWrite(SPin[0], STable[Y][3]);
digitalWrite(SPin[1], STable[Y][2]);
digitalWrite(SPin[2], STable[Y][1]);
digitalWrite(SPin[3], STable[Y][0]);
Questo l'output del monitor seriale se tengo premuto il pulsante collegato al pin 0 del multiplexer
Check avvenuto
Pulsante 0 = 0
Check avvenuto
Pulsante 0 = 1
Check avvenuto
Pulsante 2 = 1
Check avvenuto
Pulsante 4 = 1
Check avvenuto
Pulsante 8 = 1
Check avvenuto
Pulsante 0 = 0
Check avvenuto
Pulsante 2 = 0
Check avvenuto
Pulsante 4 = 0