Pages: [1]   Go Down
Author Topic: Problema di bouncing con pushbutton  (Read 562 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve a tutti!

Mi presento sono David un neocadetto dell accademia di Arduino. Mi presento quì perche sono nuovo del mondo dei forum e non ho ben capito dove avrei dovuto farlo spero che non sia fastidioso quello che faccio.

Detto ciò inizio subito a scocciarvi con il primo dei miei problemi. Sto imparando Arduino dal libro di massimo banzi (in inglese pubblicato dalla rivista Make se non erro). Il mio problema è eliminare il bouncing del push botton ma non ho ben capito in cosa consiste il problema e di conseguenza non riesco a sviluppare una strategia efficace con cui risolverlo. Ho progettato il programma che dovrebbe risolverlo ma funziona solo molto raramente e nella normalita si comporta che quando il pulsante è premuto il led si accende. In fondo posterò la mia soluzione al problema.

Quello che vi chiedo quindi è se sapete spiegarmi qual'è nella fattispecie il problema relativo al bouncing in modo che io possa cercare di risolverlo da solo...(si...lo sò...la soluzione è sul libro ma non l ho capita a pieno proprio perchè non ho capito qual'è il problema che genera il bouncing).

spero di non avervi tediato troppo e spero che il problema sia esposto in maniera chiara. Ecco il mio codice:


Code:
const int ledPin=13;
const int button=7;

int valore=0;
int valoreDopo=0;
int clik=0;
int stato=0;

void setup()
{
  pinMode(ledPin,OUTPUT);
  pinMode(button,INPUT);
}

void loop()
{
  valore=digitalRead(button);
  delay (5);
  valoreDopo=digitalRead(button);
 
  if(valore!=valoreDopo)
  {
    clik=1;
}
  else
  {
    clik=0;
  }
 
 
  if(clik==1)
  {stato=1-stato;
  }
 
  if(clik==1 && stato==1)
  {
    digitalWrite(ledPin, HIGH);
   
  }
  if(clik==1 && stato==0)
  {
    digitalWrite(ledPin,LOW);
   
  }
  clik=0;
}

se vi interessa posso spiegarvi la logica anche con cui l ho costruito... in modo che capite anche qual'è il mio livello di preparazione in C per i prossimi posts...smiley-grin

grazie mille in anticipo.

saluti

David


Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 116
Posts: 6021
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...
Quello che vi chiedo quindi è se sapete spiegarmi qual'è nella fattispecie il problema relativo al bouncing in modo che io possa cercare di risolverlo da solo...(si...lo sò...la soluzione è sul libro ma non l ho capita a pieno proprio perchè non ho capito qual'è il problema che genera il bouncing).
...

Molto semplicemente il problema è che un interruttore REALE (... e non teorico sulla carta) ha un comportamento imperfetto ...

... quando lo apri o chiudi in realtà non apre o chiude subito perfettamente, ma per imperfezioni meccaniche ed altro, ha una serie di "rimbalzi" (sequenze molto rapide di apertura/chiusura), rimbazi che, se pur molto veloci, vengono comunque intercettati da Arduino come una serie di passaggi LOW/HIGH/LOW ... del pin a cui è collegato smiley-wink

Se non vuoi quindi usare librerie già pronte, ma vuoi capire TU il problema, devi considerare questa cosa e considerare valida una "condizione" solo se essa è stabile dopo un certo lasso di tempo ...

... e, per ora, non dico altro ... per lasciarti il gusto di trovare la soluzione smiley-wink

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie mille guglielmo per la tua disponibilità.

Le cose che mi hai detto sono molto simili a quello che avevo letto sul libro di massimo banzi.

La mia idea per evitare ciò era quella di fare due prelievi della variabile in grado di rilevare la pressione del bottone ad istanti diversi (variabile e variabileDopo) e vedere se sono uguali. Nel caso lo fossero allora il click vi è stato davvero.

Se possibile controlla il mio codice e dimmi se il problema è altrove. Perchè non sono sicuro che quello che ho scritto sia corretto.

grazie comunque della disponibilità!

fammi sapere!

David
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 116
Posts: 6021
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dandogli un'occhiata veloce mi vengono le seguenti domande ...

1. Sicuro che bastano 5 mSec perché la situazone si stabilizzi ? Hai fatto un po' di prove ?

2. perché tutte le variabili "int" ??? Per sprecare spazio ? smiley-lol ... ti bastano tutte "byte" smiley-wink

3. Una volta che hai visto che effettivamente c'è stata una vera pressione del pulsante, perché tutta quella logica complessa quando, per commutare OFF/ON/OFF/ON/ecc. ti basta fare "stato = !stato;" per ottenere ogni volta l'inversione dello stato e poi accendere o spegnere il led di conseguenza con "digitalWrite(ledPin, stato);" ?

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie ancora!

Allora credo innanzi tutto di aver beccato l errore nella logica (anche se il pulsante non viene premuto il programma vede un click).

Per darti una risposta:

1)no non ne sono affatto sicuro ma non ho fatto prove perchè il circuito in se non funzionava con questo programma.
2)grazie del consiglio! ancora non so cosa faccio bene!
3)idem come sopra vedrò cosa posso fare entro stasera produrrò un nuovo release e con calma te lo sottoporrò se non funziona!


Grazie mille ancora una volta per la disponibilità!


david
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie dell help il problema è risolto!

Alla prossima !

grazie ancora

David
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 116
Posts: 6021
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bene! Cortesemente, coreggi il titolo della discussione ed aggiungi un [RISOLTO] davanti smiley-wink

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

0
Offline Offline
Faraday Member
**
Karma: 49
Posts: 6019
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

turbodede, quando risolvi un problema, specialmente se sei stato aiutato, e' giusto dire come.
credo il tuo errore era qui
Code:
if(valore!=valoreDopo)
  {
    clik=1;
}

ad 1 devi settarlo quando sono uguali, non quando sono diversi,

fermo restando che i 5ms sono davvero pochi come ha detto Guglielmo
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Pages: [1]   Go Up
Jump to: