Problemi con pulsanti e arduino Mega 2560

Buonasera a tutti, scusate per la banalità della richiesta ma mi trovo in un punto morto.

Ho collegato 12 pulsanti agli ingressi dell'Arduino MEGA 2560, collegati tra massa e ingresso (i pulsanti sono N.O.).
Gli ingressi sono: 31,33,35,37,39,41,43,45,47,49,51,53.

Ho fatto delle prove per stampare su un display hd44780 lo stati dei pulsanti.

Posto solo gli spezzoni di programma necessari per un pulsante, gli altri sono tutti uguali:

pinMode(31, INPUT_PULLUP);  //questo per tutti i 12 ingressi;

if(digitalRead(31)==0){
 lcd.print("OK");
}

Questo inizialmente (per non complicare troppo) l'ho fatto per quattro pulsanti.

Il problema è che sul display appaiono le stampe di tutti i pulsanti, a caso, sia che li premo sia che lo li premo. Ho provato a scollegarli fisicamente ma fa così comunque.

Fate conto che i quattro pulsanti che ho incluso nel programma sono numerati da 1 a 4, sul display partono a raffica i numeri da 1 a 4 a caso.

Ho provato a cercare su internet, a cambiare il programma, ma non riesco a risolvere il problema.

Voi come fate a interfacciare i pulsanti con ArduinoMEGA2560 ??

Vi ringrazio anticipatamente per le risposte, mi rendo conto che è un problema da principianti, ma non riesco a capire....

Grazie, Marco

Lo spezzone di sketch e' un po' troppo parziale

non si vede se mandi la mumerazione del pulsante
se fai mai un lcd clear
se scrivi sempre nello stesso posto

Ah si si.. scusate

#include liquidcrystal

LiquidCrystal lcd (12, 11, 5, 4, 3, 2);

void setup(){

lcd.begin(20, 4);
pinMode(31, INPUT_PULLUP);
pinMode(33, INPUT_PULLUP);
pinMode(35, INPUT_PULLUP);
pinMode(37, INPUT_PULLUP);
pinMode(39, INPUT_PULLUP);
pinMode(41, INPUT_PULLUP);
pinMode(43, INPUT_PULLUP);
pinMode(45, INPUT_PULLUP);
pinMode(47, INPUT_PULLUP);
pinMode(49, INPUT_PULLUP);
pinMode(51, INPUT_PULLUP);
pinMode(53, INPUT_PULLUP);
}

void loop(){

if(digitalRead(31)==0){
lcd.print("1");
}
if(digitalRead(33)==0){
lcd.print("2");
}
if(digitalRead(35)==0){
lcd.print("3");
}
if(digitalRead(37)==0){
lcd.print("4");
}

}

Ho provato anche mettendo un delay(10) in ogni IF (ma nulla...).
il display si riempie di 1 di 2 di 3 e di 4...

Ho provato anche a mettere un clear ogni TOT secondi (usando il clock che parte all'accensione di arduino), ma continua allo stesso modo.

Come si fa di solito a controllare dei pulsanti con Arduino??

(N.B.: la sintassi dello sketch potrebbe non essere perfetta (es. "Lcd" invece che "lcd" in quanto l'ho riscritto a memoria)

bisognerebbe vedere come hai fatto il circuito, sicuro che usi dei pulsanti NA normalmente aperti?

I pulsanti sono sicuramente normalmente aperti (e funzionanti).

Ho provato a dichiarare gli ingressi solo come INPUT, e a inserire le resistenze di pullup esterne da 1 KOhm.
ogni tanto quando premo un pulsante il display visualizza il numero di un altro pulsante, che al momento non è premuto.
I pulsanti sono collegati correttamente, li ho collegati ad una scheda dove ci sono le resistenze di pullup, ma anche la scheda va bene...
Può essere che le resistenze di pullup siano troppo piccole? Con il tester alcune sono addirittura di 800 Ohm...
Che sia per quello?

Addirittura premendo il tasto corrispondente al numero "9" adesso sul display mi viene stampato il punto e virgola (";").

Vi ringrazio per l'aiuto, Marco

Escludendo che il tuo MEGA sia guasto, è probabile che nel tuo sketch ci sia un errore.

Ad esempio, nel ciclo if inserire un "=" al posto di "==", oppure una singola graffa al posto di due, ecc.

Sono gli errori più semplici che sono "invisibili"!

In qualsiasi caso, per rendere più gestibile ed elegante il programma, fai così:

...
const byte DigInCount = 12;
const byte DigInPin[] = {31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53};
boolean DigInVal[] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};                    
...
  for (byte I = 0; I < DigInCount; I ++) {
    pinMode(DigInPin[I], INPUT_PULLUP);           // set as input with internal 20k pull-up resistor
  }
...
  boolean Status;

  for (byte I = 0; I < DigInCount; I ++) {
    Status = digitalRead(DigInPin[I]); 
    if (Status != DigInVal[I]) {
      delay(20);                                    // 20 ms
    }
    DigInVal[I] = digitalRead(DigInPin[I]);
  }
...
  for (byte I = 0; I < DigInCount; I ++) {
    if(DigInVal[I]==HIGH) lcd.print(DigInPin[I]);
}

Aggiornamento:

Ho ricontrollato la scheda su cui vanno i pulsanti (da cui parte poi il cavo dell'arduino mega), e l'ho pulita da dei residui che sembravano di pasta salda... FUNZIONA

Adesso funziona, ovviamente adesso devo mettere a posto il codice come dice Cyberhs, il quale ringrazio per il codice che ha postato, che adesso adotterò per la gestione dei miei pulsanti.

Quindi ho scoperto che la pasta salda conduce (se ne rimangono dei pezzetti solidi).. Non come il rame, ma un pezzettino grande quanto un pin di un integrato DIL ha una resistenza di circa 1,5 KOhm... Non so se è normale, se è una caratteristica di ogni tipo di pasta, comunque la mia conduce.

Ringrazio tutti voi per l'aiuto (e mi scuso per il tempo perso), e in particolar modo l'utene Cyberhs, per il codice che adesso utilizzerò.

PS: devo cambiare il titolo del topic e mettere [RISOLTO] o va bene se lo lascio così com'è?

ciao, in questi casi, quando non sai se non va la scheda o hai sbagliato il codice ti conviene mettere manualmente i pin di arduino a vcc o a gnd con dei semplici cavetti, così almeno sai dove sta il problema :slight_smile:

LeonidRusnac:
ciao, in questi casi, quando non sai se non va la scheda o hai sbagliato il codice ti conviene mettere manualmente i pin di arduino a vcc o a gnd con dei semplici cavetti, così almeno sai dove sta il problema :slight_smile:

Infatti sono riuscito a risolvere il problema proprio facendo così XD

La pasta salda non è convincente, non conduce

Se tu mi metti gli input in pull-up interno verso +5v e usi un controllo
if(digitalRead(37)==0){
lcd.print("4");
}
con pulsanti aperti tra pin e gnd come faceva a darti valori sballati senza toccare i bottoni ? anche con falsi contatti non poteva darti i numeri anche senza cavi verso la pulsantiera. Allora c'erano dei corti da troppo stagno :smiley:

pablos:
La pasta salda non è convincente, non conduce

Se tu mi metti gli input in pull-up interno verso +5v e usi un controllo
if(digitalRead(37)==0){
lcd.print("4");
}
con pulsanti aperti tra pin e gnd come faceva a darti valori sballati senza toccare i bottoni ? anche con falsi contatti non poteva darti i numeri anche senza cavi verso la pulsantiera. Allora c'erano dei corti da troppo stagno :smiley:

Non lo so... comunque togliendo i residui di pasta (forse era impregnata con acqua per via dell'umidità? :~) ha funzionato.

Forse nel programma ho impostato qualcosa di strano e non me ne sono accorto, quindi riscrivendolo non ho più fatto l'errore e ha funzionato...
Lo stagno comunque era a posto perchè l'unica cosa che non ho toccato in tutto questo problema è il saldatore.

Il fatto dei residui di pasta salda mi aveva dato problemi anche in passato, il problema non è quello strato trasparente/giallo che si forma saldando sulla pasta, che è normale, ma proprio i pezzi di pasta che sono caduti/depositati interi tra le piazzole, perché quando ho fatto una misura di resistenza col tester segnava un valore, ho tolto il pezzettino di pasta e immediatamente la misura del tester è schizzata in alto.