Conteggio attivazione pulsante

Salve a tutti,
sono alle prese con un sistema che mi conti quante volte viene premuto in pulsante.Il sistema è formato da due pulsanti:Se si preme il primo si incrementa il valore ,se, invece si preme il secondo si decrementa il valore.Il codice è quello seguente:

const short int ButtonPin = 2; //Button is connected to pin 5.
const short int ButtonPindue = 4; //Button is connected to pin 5.
int CurrentStateuno;              //Holds the current state of the button
int LastStateuno = 0;             //Holds the last state of the button
int CurrentStatedue;              //Holds the current state of the button
int LastStatedue = 0;             //Holds the last state of the button
int short count = 0;           //Holds number of button presses.
unsigned long currentTime;
unsigned long loopTime=0;
void setup() 
{
  Serial.begin(9600);          //Begins communication with computer
  pinMode(ButtonPin,INPUT);    //Sets ButtonPin as input.
}
void loop()
{
        //Prints current number of button clicks
   CurrentStateuno = digitalRead(ButtonPin); //reads state of the button.
   if(CurrentStateuno != LastStateuno)
   {
     if(CurrentStateuno == HIGH)  //if button is pressed count is
                               //increased by one
     {
       count++;
      
     }
   }
   LastStateuno = digitalRead(ButtonPin);
      CurrentStatedue = digitalRead(ButtonPindue); //reads state of the button.
   if(CurrentStatedue != LastStatedue)
   {
     if(CurrentStatedue == HIGH)  //if button is pressed count is
                               //increased by one
     {
       count--;
      
     }
   }
   LastStatedue = digitalRead(ButtonPindue);
currentTime = millis();
   if(currentTime >= (loopTime + 1000))
   {
   Serial.println(count); 
   loopTime = currentTime;
   }
}

Il problema che quando incrementa o decrementa lo fa di un paio di valori alla volta e non uno per volta.Dove spaglio?In attesa di una risposta saluto tutti e vi ringrazio per l'aiuto che mi darete

Debounce.
metti un delay(10); dopo count++; e count--;
Ciao Uwe

Uwe ,Intanto grazie per la risposta.

Dopo la modifica che mi hai detto di apportare sembra non sia cambiato nulla.

L'immagine del test è in allegato

uwefed:
Debounce.
metti un delay(10); dopo count++; e count--;
Ciao Uwe

Infatti il debounce va messo dopo la lettura.
Mettilo dopo i digitalread. :smiley:

Poi c'è un problema.
Tu metti laststate = nuova lettura. Così non và.
Devi mettere laststate = currentstate per netrambi i pulsanti.
In quel modo salva l'ultimo stato.

Inoltre puoi spostare entrambe le letture dei due pulsanti all'inizio del loop e mettere un solo debounce.

Semplifica il debounce:

if (digitalRead(ButtonPin)) {
  delay(30);
  if (digitalRead(ButtonPin)) {
    .....codice da eseguire....
  }
}

Funziona anche così, e risparmi diverse variabili (quindi RAM).

PaoloP:

uwefed:
Debounce.
metti un delay(10); dopo count++; e count--;
Ciao Uwe

Infatti il debounce va messo dopo la lettura.
Mettilo dopo i digitalread. :smiley:

Il ritardo per aspettare i rimbalzi del contatto puó essere messo da qualsiasi parte a patto che ci sia un ritardo tra una lettura e l' altra del contatto (pulsante) in modo che gli impulsi dati dai rimbalzi non possono essere rivelati come altre comutazione del pulsante.

Il vantaggio della mia versione é che il ritardo c'é solo quando viene trovato una variazione di stato del pulsante. Nel caso che il pusante resta premuto o non é azionato non c'é ritaro e la velocitá di esecuzione del codice non viene alterata dal debouce.

Poi c'è un problema.
Tu metti laststate = nuova lettura. Così non và.
Devi mettere laststate = currentstate per netrambi i pulsanti.
In quel modo salva l'ultimo stato.

Di questo non mi ero accorto. :blush:

Ciao Uwe

Wa...tutto funziona!Grazie Uwe.
Posto il codice per gli altri che ne hanno bisogno!

const short int ButtonPin = 2; //Button is connected to pin 5.
const short int ButtonPindue = 4; //Button is connected to pin 5.
int CurrentStateuno;              //Holds the current state of the button
int LastStateuno = 0;             //Holds the last state of the button
int CurrentStatedue;              //Holds the current state of the button
int LastStatedue = 0;             //Holds the last state of the button
int short count = 0;           //Holds number of button presses.
unsigned long currentTime;
unsigned long loopTime=0;
void setup() 
{
  Serial.begin(9600);          //Begins communication with computer
  pinMode(ButtonPin,INPUT);    //Sets ButtonPin as input.
}
void loop()
{
        //Prints current number of button clicks
   CurrentStateuno = digitalRead(ButtonPin); //reads state of the button.
   delay(10);
   if(CurrentStateuno != LastStateuno)
   {
     if(CurrentStateuno == HIGH)  //if button is pressed count is
                               //increased by one
     {
       count++;
      
     }
   }
   LastStateuno = CurrentStateuno;
      CurrentStatedue = digitalRead(ButtonPindue); //reads state of the button.
      delay(10);
   if(CurrentStatedue != LastStatedue)
   {
     if(CurrentStatedue == HIGH)  //if button is pressed count is
                               //increased by one
     {
       count--;
      
     }
   }
   LastStatedue = CurrentStatedue;
currentTime = millis();
   if(currentTime >= (loopTime + 1000))
   {
   Serial.println(count); 
   loopTime = currentTime;
   }
}