Contatore impazzito su ogni pin di Arduino UNO

Salve ragazzi, stavolta credo di averla fatta grossa.

Vorrei realizzare un menu con swift/case, un contatore e 4 tasti ma caricandolo su Arduino mi ero accorto che c'era un problema: sul display mi compariva sempre l'ultimo menu.
Ho aggiunto il Serial.begin per vedere a monitor cosa stesse accadendo e mi sono accorto che il contatore saliva da solo senza che venisse sfiorato alcun tasto.

Ho smontato il display e i 4 tasti lasciandone solo uno con la solita resistenza di pull-up da 10k e ho provato a settare ogni pin dal 2 al 13 (lo sketch attuale è sul 4) ma il risultato è uguale: incremento del contatore di circa 100/150 al secondo.

Aggiungo che ho anche il led L sul pin 13 sempre acceso.

const int avantiPin =   4 ;

int cont = 0;
int StatoPulsAvanti = 0;
int lastStatoPulsAvanti = 0; 
void setup() {
  Serial.begin(9600);
  
  pinMode(avantiPin,   INPUT);
  digitalWrite (avantiPin,  LOW);
    }
  
void loop() {
  StatoPulsAvanti = digitalRead(avantiPin);
 
  
  if (StatoPulsAvanti != lastStatoPulsAvanti){
    if (StatoPulsAvanti == HIGH) {
      cont++;
      delay (20); }
  }

Se hai una resistenza di pull-up (perché non usare quella interna?), ovviamente leggerai HIGH quando il pulsante NON è premuto. Questo dovrebbe collegare a massa alla pressione, portandoti quindi a leggere LOW.

Fabio_80:
Salve ragazzi, stavolta credo di averla fatta grossa.

Hai aperto la finestra, si? :smiley:

Ho aggiunto il Serial.begin per vedere a monitor cosa stesse accadendo e mi sono accorto che il contatore saliva da solo senza che venisse sfiorato alcun tasto.
Ho smontato il display e i 4 tasti lasciandone solo uno con la solita resistenza di pull-up da 10k

Primo, sempre postare il circuito. Tu dici di aver messo le resistenze di pull-up, ma allora questo significa che avrai messo il pulsante tra il pin e massa (spero) quindi la logica è inversa, il pulsante premuto è LOW non HIGH.
Ma se non posti lo schema, ci si mette più tempo...

Poi hai postato un codice incompleto, dove aggiorni la "lastStatoPulsAvanti" ??

Insomma, metti uno sketch COMPLETO e uno schema (o una descrizione COMPLETA) dei collegamenti che hai fatto, e con i quali hai provato QUELLO sketch, e possiamo dirti qualcosa.

PS: sperimenta usando Tinkercad Circuits (ex Autodesk 123d circuits) , hai un simulatore Arduino con tanto di debugging!

La resistenza è tra il pulsante e il 5 volt quindi la resistenza è pull-down? Se non è zuppa è pan bagnato :confused:

Hai ragione doc avevo mancato un pezzo ma il risultato non è cambiato

const int avantiPin =   4 ;

int cont = 0;
int StatoPulsAvanti = 0;
int lastStatoPulsAvanti = 0; 
void setup() {
  Serial.begin(9600);
  
  pinMode(avantiPin,   INPUT);
  digitalWrite (avantiPin,  LOW);
    }
  
void loop() {
  StatoPulsAvanti = digitalRead(avantiPin);
   
  if (StatoPulsAvanti != lastStatoPulsAvanti){
    if (StatoPulsAvanti == HIGH) {
      cont++;
      delay (20);}
     }  
 
  lastStatoPulsAvanti = StatoPulsAvanti;  
       
  Serial.println (cont);
    
  }

La resistenza è come la hai collegata.
Se va verso massa è pull-down, se va verso Vcc è pull-up.

Fabio_80:
Pulsante è fra la resistenza e il 5volt quindi la resistenza è pull-down? Se non è zuppa è pan bagnato :confused:

Pull-up e' una resisteenza dal pin al VCC, con il pulsante che chiude il pin a massa (quindi pulsante premuto = ingresso LOW) ... pull-down e' resistenza fra pin e massa, con pulsante che chiude il pin a VCC (quindi pulsante premuto = HIGH) ... in entrambi i casi, mettere condensatore di valore fra 47n e 100n fra pin e massa, per il debounce ...

Se hai messo la resistenza in serie al pulsante che chiude a VCC, ma non hai messo altro = molto male ... non e' pull-up, e' un pin lasciato volante che capta tutti i disturbi presenti ed agisce a caso ...

spostato sul pin di massa ma non ho mai avuto bisogno di premerlo il pulsante visto che il valore cont come spiegato su sale da solo senza sfiorare il tasto

Ammetto che ci capisco poco, ma io farei così:
Collego il pulsante tra il + e il pin, senza altre cose in giro
Setto il pin INPUT_PULLUP
Nego la logica (premuto é LOW)
Uso un debounce software
Incremento la variabile
Aspetto che il pulsante sia rilasciato

Io_me:
Uso un debounce software

… e imparate a farli 'sti benedetti “debounce hardware” … che quelli SW NON sempre li potete usare !

Schemi in allegato …

Guglielmo

debouncing_hw.pdf (22.8 KB)

Il pin 4 posso anche staccarlo il contatore sale sempre, anche modificando il parametro del pin. Ho provato da 2 a 13 è sempre uguale

Fabio_80: ... potresti mettere uno schema esatto di come hai fatto il collegamneto, perché c'è qualche cosa che non quadra ... ::slight_smile:

Guglielmo

non mi faceva inserire allegati

IMG_20171108_152533[1].jpg

... appunto, come dicevo ... il filo cosi fa da antenna e capta disturbi, non c'e' alcun pullup ne pulldown, e neppure un debounce, come fa a funzionare ? ... i pin usati come ingressi non vanno MAI lasciati "volanti" ... persino la pista dello stampato potrebbe essere sufficente a raccogliere segnali, con un'impedenza di ingreso di 100 megaohm ...

Segui gli schemi postati da Guglielmo ...

Fabio_80:
spostato sul pin di massa ma non ho mai avuto bisogno di premerlo il pulsante visto che il valore cont come spiegato su sale da solo senza sfiorare il tasto

Da questo "sintomo" potevi capire facilmente che il pin non è collegato al pulsante ma è flottante e legge quindi 0 e 1 a casaccio (e quindi cont aumenta), come ti aveva già detto @etem al post#5

Allora ... li hai letti con attenzione i post precedenti o li hai solo guardati ? ? ? :o :o :o

Perché sono post e post che ti stanno dicendo come si collega una resistenza di pull-up o di pull-down e tu continui a metterla in serie al bottone, ovvero in modo del tutto inutile !

La restitenza va tra il pin di ingresso e ... Vcc se è una pull-up, GND se è una pull-down ... il bottone va direttamente a GND per la pull-up e a +Vcc per la pull-down.

Nel modo in cui hai fatto tu il pin, quando il bottone NON è premuto, NON è collegato a nulla e quindi legge ciò che vuole (HIGH o LOW a caso).

Guglielmo

P.S.: Nel frattempo mi hanno anticipato :smiley:

provato anche il condensatore senza cambiamenti

schema.PNG

Se ha fatto come suggerito e non ci sono stati cambiamenti mi vengono dei dubbi su due cose:
1)Il pulsante funziona?
2) Arduino legge bene?
Per rispondere alla prima domanda userei un tester per vedere se la corrente misurata cambia. Se sprovvisto di un tester potrei vedere bene un led posto tra l'uscita del pulsante e il pin di ingresso.
Se il controllo mostrasse che il pulsante fa il suo mestiere... Allora dubiterei dell'Arduino

Fabio_80:
provato anche il condensatore senza cambiamenti

Vabbè, scusa, ma o leggi quello che ti si dice (ti hanno postato persino gli schemi per fare pullup o pulldown) o io ci rinuncio...

Fabio_80:
provato anche il condensatore senza cambiamenti

Se usi la resistenza interna di pullup di Arduino allora la resistenza è nel posto sbagliato (e deve essere da 10ohm e non 10k).
Se NON usi la resistenza interna di Arduino allora lo schema è errato, indipendentemente dal condensatore.

Inoltre anche il tuo codice di setup ha degli errori o altrimenti delle cose inutili.
Se usi la pullup interna di Arduino la puoi attivare così:

pinMode(avantiPin,   INPUT);
digitalWrite (avantiPin,  HIGH);

e non con LOW come hai fatto tu. Meglio ancora pinMode(avantiPin,INPUT_PULLUP);

Se invece non vuoi attivare la resistenza interna di pullup, beh, quel digitalWrite su un pin in input NON ha senso.