Pulsante da noia

Buongiorno.
Sto cercando di verificare se in pulsante è premuto o no.

Dal seriale pero non rimane 0.

Rimane
0,1,1,0,0,0,1,1,0, ecc.

Se tengo premuto invece 1,1,1,1,1,1
Quindi quando premo fa il suo dovere.

Quando alzo invece ha questo sballo.

Succede con tutti gli altri pin.

Il codice e semplicemente
DigitalRead(pin)

Se 1 == ok

Altrimenti niente.
Ma dando 1 e 0
Non so proprio come comportarmi. Consigli?

Quell'alternanza di 010101 sono i rimbalzi al rilascio dei contatti del pulsante. Per ovviare a questo problema devi utilizzare la tecnica del debounce, che può essere sia software che hardware :slight_smile:

Grazie per l'informazione.
Hai gentilmente qualche esempio?

Oltre a quello che ha giustamente suggerito @doppiozero dovresti, per sicurezza, aggiungere anche una resistenza di pulldown per assicurarti che con il pulsante non premuto il valore letto sia sicuramente zero.
Se vuoi risparmiare la resistenza di pulldown devi attivare la resistenza di pullup integrata nei pin di Arduino e invertire la logica del programma, ovvero avrai sempre 1 con pulsante non premuto e zero con pulsante premuto, ovviamnete il pulsante che ora è collegato a +5V dovrai invece scollegarlo a GND

Per il debounce qui hai una possibile versione software, solitamente si consiglia di implementare la soluzione hardware se possibile in modo da non complicare innutilmente il codice.
Ti allego un pdf con le tre soluzione hardware possibili, con il tuo attuale codice dovresti implementare la terza, se vuoi risparmiare una resistenza implemneta la prima cambiando codice e collegamenti come indicato in precedenza

debouncing_hw.pdf (22.8 KB)

Grazie mille ad entrambi per i consigli e la soluzione, proverò entrambi i metodi.
Grazie ancora gentilissimi.

Thejuster:
Dal seriale pero non rimane 0.
Rimane
0,1,1,0,0,0,1,1,0, ecc.
Se tengo premuto invece 1,1,1,1,1,1

Io sospetto che, più che il debounce (che comunque va considerato sempre), tu abbia l'input senza una resistenza di pullup o pulldown, per cui l'ingresso fluttua a caso. Inoltre confronta sempre con i simboli LOW e HIGH, non con 1.

Se il pulsante lo hai collegato da un lato al pin Arduino e dall'altro a VCC, devi avere una resistenza di pull-down (ossia il pin, oltre che al pulsante, lo mandi ad una resistenza che colleghi poi a GND).

Immagine tratta da questa ottima guida di pighixxx, che ti consiglio di consultare perché oltre agli schemi per pullup, pulldown e pullup interna, trovi decine di tanti schemi utili!

dopo fatto diversi test, purtroppo nemmeno con una resistenza sono riuscito ad ottenere valori stabili.

Anche con resistenza, continuava a farmi l’effetto bounce.

ho risolto in questo modo

Un array di 10 elementi, tanto basta per leggere i valori seguenti

al loop

int puls = digitalRead(PB1);

int valori[10];

conteggio++;

if(conteggo <= 10)
{
  valori[conteggio] = puls;
}else
{
  conteggio = 0;
}

//Tentando di leggere in Negativo
if(valori[0] == 0 && valori[1] == 0 && valori[2] == 0 ecc. ecc.)
{
   Serial.prinln("Premuto");
}else
{

}

Il funzionamento è assicurato.

in pratica facendo anche un ciclo per il print tramite il sizeof(valori)

ottengo tipo

0-0-0-1-1-1-0-0
0-1-1-0-0-0-1-0

Quando viene premuto e tutti i valori sono 0
allora va bene.

per il resto possono oscillare come vogliono hehe.

Fatto sta, che ho dovuto rimandare tutto il progetto.
Stranamente testando l’encoder e comandando il modulo relè,
Il modulo si è inspiegabilmente (forse credo) bruciato.

Un led di segnalazione è più luminoso dell’altro.
Deduco che forse qualche corto ha rotto le protezioni del relè.
Anche se è una semplice 24v.

All’accensione dell’indicatore del relè non si sente il click che attiva la bobina.
Sarà sicuramente andato a farsi benedire.

Ora non mi resta che attendere il nuovo modulo relè per continuare.
Grazie cmq a tutti per l’aiuto.

Saluti

La sola resistenza non ti leva il bounce ma ti va vedere un valore stabile quando il pulsante è a riposo, per risolvere il problema del bounce serve la rete RC che ti elimina i rimbalzi.
Poi la tua soluzione software potrebbe anche funzionare, ma può succedere che deterioramento dei contati o situazioni non prevedibili aumentino il numero di rimbalzi creando situazioni poco piacevoli e predicibili, il consiglio resta sempre il solito, se possibile resistenza e condensatore e passa la paura. In casi critici esistono specifici integrati che nascono per risolvere il problema del debounce

dico la mia
quando ti sei stancato di bruciare tutto ed aspettare nuovi moduli,prova ad utilizzare i simulatori che si trovano gratis in giro per internet

Puso:
dico la mia
quando ti sei stancato di bruciare tutto ed aspettare nuovi moduli,prova ad utilizzare i simulatori che si trovano gratis in giro per internet

Ci farò sicuramente un pensiero haha.

Ma in realtà era collegato bene.
per evitare la noia di scollegare tutto nuovamente da capo, avevo fatto un punte dove basta toccare i due cavi
per allargare e stringere il carro manualmente.

Forse per via delle sfiammate al contatto con i due cavi ha inesorabilmente bruciato il modulo.

Sono consapevole del fatto che non faccio guai non imparerò mai.
Bruci oggi, bruci domani, ma poi sei sicuro di quello che fai.

Un buon simulatore non potrà mai sapere cosa accade nella realtà come ad esempio questo problema del debounce.

Se non mi inventavo qualcosa avrei già dovuto rinunciare da un pezzo.

Thejuster:
ho risolto in questo modo
Un array di 10 elementi, tanto basta per leggere i valori seguenti
ottengo tipo
0-0-0-1-1-1-0-0
0-1-1-0-0-0-1-0

Quando viene premuto e tutti i valori sono 0 allora va bene.

Se non ti interessa sapere esattamente dove c'e' 0 e dove 1, allora è più semplice, invece di avere il vettore di 10, totalizzi gli 0 e 1, se dopo 10 somme hai 0 è okay. Eviti di usare il vettore. Ti basta la somma.

Thejuster:
dopo fatto diversi test, purtroppo nemmeno con una resistenza sono riuscito ad ottenere valori stabili.
Anche con resistenza, continuava a farmi l'effetto bounce.
ho risolto in questo modo
Un array di 10 elementi, tanto basta per leggere i valori seguenti al loop

Io continuo a non capire bene, scusami.
Prova a dirmi, quale (o quali) di questi problemi hai ?

  • stabilità dello stato ON (quando tieni premuto non resta sempre a 1 ma oscilla)
  • di rimbalzi/bounce (quindi nella transizione da OFF a ON non hai un passaggio "pulito" tipo "0 0 0 0 1 1 1 1 1" ma "0 0 1 0 1 1 0 1 1 1 1")
  • stabilità dello stato OFF (ossia quando non premi nulla non resta sempre a zero "0 0 0 0" ma ogni tanto hai degli 1 es. "0 0 01 0 0 0 0 1 0"
    A seconda della tua risposta possiamo parlare di possibili cause e quindi rimedi, altrimenti se vuoi gestire un debounce facendo array e totalizzando quanti "1" conti mi pare una cosa abbastanza inutile...

:smiley: :smiley: :smiley:
a parte la battuta a cui non ho saputo resistere concordo che un simulatore non è come la realtà,ma tanti errori li puoi evitare se prima fai allenamento ad un simulatore anche semplice,poi concordo che gli accorgimenti vanno fatti sulla realtà.

..io non ho ancora capito cosa intendi per debounce :confused: :o

comunque sia ti avviso che neppure il pulsante è cosi semplice come sembra(premuto o non premuto)
in mezzo ci sono tutte una serie di condizioni che si possono aggiungere (per quanto tempo e premuto?..per quanto tempo non era premuto?...prima era premuto oppure no?...ect ect)

anche sul serial monitor puoi decidere se leggere davvero le condizioni del pulsante,oppure modificare le letture complicando il tutto,(come credo abbia fatto tu,da neofita ho provato a leggere lo schetc che hai fatto)

per i resto in bocca al lupo
:slight_smile: :slight_smile:

Puso:
…io non ho ancora capito cosa significa debounce :confused: :o

Oddio … lo avrò scritto sul forum 1000 volte … e con questa 1001 …

Contrariamente ad un bottone “ideale” che quando lo premi chiude un contatto e quando lo lasci lo apre, un bottone “reale”, essendo un oggetto meccanico, si comporta diversamente e introduce dei “ribalzi” sui contatti, per cui, il segnale che viene fuori, NON è un segnale bello pulito ON/OFF, ma un qualche cosa che somiglia a questo:

Se leggi il pin digitale, ti ritrovi una raffica di LOW ed HIGH come da diagramma.

Per ovviare a questo si fa il “debouncing” che può essere “software” (sconsigliato) o “hardware” (consigliato).

Per quello software trovi un’infinità di esempi e librerie, per quello hardware, basta una resistenza ed un condensatore secondo uno degli schemi allegati (… in funzione di come leggi il pin).

Chiaro ?

Guglielmo

debouncing_hw.pdf (22.8 KB)

Guglielmo
la piccola bugia del debunce,lo scritta solo perchè è già da un po che non mi sgridi :confused:
ne approfitto per salutarti :slight_smile:

Puso:
... la piccola bugia del debunce,lo scritta solo perchè è già da un po che non mi sgridi :confused:

... tu fammi riscrivere quel "pippone" un'altra volta e ... ti banno a vita :smiley: :smiley: :smiley:

Un salutone anche a te :wink:

Guglielmo

E poi mi sono sempre chiesto, ma questo "pulsante da noia" si preme quando uno non ha niente da fare e passare il tempo? :smiley:

... a proposito di bottoni ... :smiley:

(perche' in Italia non le fanno queste cose ? ... :smiley: :smiley: :D)

Lo fanno in Belgio. In USA non si arrischierebbero. Girano tutti armati, sai che sparatorie ^-^