Problemi con multiplexer

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

Se i pulsanti sono in pull-up (tirano su), devi mettere resistenze di pull-down esterne. Se vuoi usare le resistenze di pull-up interne, invece, i pulsanti devono chiudere a massa (down).

Non è un problema di pulsanti. Se richiamo il canale 0001 e misuro col tester il pin SIG del multiplexer ho 0V con pulsante premuto e 3.3 con pulsante non premuto.
Quindi a questo punto il problema è nel codice , ma a me sembra tutto corretto

Quel codice ha dei grossi problemi, concettuali E realizzativi
Inoltre non è completo
Ma dovrebbe andare

Quindi il problema sembra nel cablaggio

Metti il codice completo e lo schema
Schema, non foto o video o descrizioni o link: lo schema

Grazie della risposta.
Il codice è completo. È una prova che sto facendo esclusivamente con ESP32 ed un multiplexer cercando di cambiare lo stato della variabile bool statoLed.
Per il cablaggio dovrò scaricare fritzing per postarlo,se serve lo faccio.
Questa mattina ho usato lo stesso codice ,togliendo l'else che effettivamente non serve, con un arduino uno e funziona alla perfezione, quindi presumo che il problema sia sullESP32.
Mi diresti ,gentilmente, quali sono secondo te i problemi concettuali del software?

lo_sty:
Con un arduino uno funziona alla perfezione, quindi presumo che il problema sia sull'ESP32.

Controlla la corrispondenza dei pin!

lo_sty:
... Questa mattina ho usato lo stesso codice ,togliendo l'else che effettivamente non serve, con un arduino uno e funziona alla perfezione, quindi presumo che il problema sia sullESP32.

Magari non c'entra nulla, ma, vedendo che hai fatto delle prove su Arduino UNO, il dubbio viene ... ::slight_smile:

... tu sai vero che su Arduino UNO se scrivi digitalRead(4) si intende il pin D4, mentre su ESP la stessa cosa intende il GPIO4 che nulla ha a che vedere con D4 (... che è GPIO16 su ESP32) :slight_smile:

Guglielmo

Il codice non è completo, e se tu avessi riguardato il tuo post te ne saresti accorto

Inoltre senza schema poco si può dire

Ti sei reso conto che nei tuoi post hai affermato che il problema non è nei pulsanti, ma nemmeno è nel codice?

E quindi?

Non puoi venire qui a chiedere consiglio su una cosa che non ci hai mostrato e quando ti chiediamo delucidazioni evitare di darle
Che tipo di risposta ti aspetteresti?

Cosa farebbe il tuo meccanico se tu andassi la lamentando un problema e alla domanda 'dov'è l'auto' tu rispondessi : non la ho qui, ma se serve porto una foto...

Perché tu questo hai fatto

Per i problemi del codice:

Inizializzi una variabile inutilizzata
Invece di convertire direttamente gli indirizzi in binario usi una tabella
Ti sei accorto che per scandire 16 indirizzi usi un for di 14 passi?
Nei commenti citi note che non esistono

Metti a posto queste cose e poi se ne parla

Infatti quando ho visto quella tabella ho rinunciato a capire che cosa volesse fare. Ero convinto, però, che stesse facendo in maniera molto complicata qualcosa di molto semplice...
La tabella serve solo per contare da 0 a 15 su 4 pin di uscita???... Basta scegliere adeguatamente i 4 pin e scrivere il valore decimale con PORT!

Datman:
... Basta scegliere adeguatamente i 4 pin e scrivere il valore decimale con PORT!

Guarda che sei su ESP32 ... di che PORTx parli ? ? ? :o

Guglielmo

Ma comunque anche senza spippolare le porte ci sono maniere più furbe per convertire un decimale in 4 fili di output

Guglielmo, non ho trovato informazioni precise e mi è venuto il dubbio, ma credevo che ci fosse... Il problema è che PORT è dell'AVR, non fa parte di Arduino!... Credo che si debba usare REG, ma non ho approfondito.

Datman:
Il problema è che PORT è dell'AVR, non fa parte di Arduino!... Credo che si debba usare REG, ma non ho approfondito.

PORTx è definito nella Toolchain da Atmel (oggi Microchip) e infatti nulla ha a che vedere con il framework wiring. Su ESP8266, per accedere direttamente ad un pin si può usare GPO; io, in un I2C bit-banging, ad esempio, per alzare il pin SCL (da me definito su un generico GPIO), scrivo ..

GPO |= (1 << SCL_PIN);     // Set SCL_PIN to HIGH

... ma su ESP32 non ne ho idea ... ::slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.