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
uwefed:
Debounce.
metti un delay(10); dopo count++; e count--;
Ciao Uwe
Infatti il debounce va messo dopo la lettura.
Mettilo dopo i digitalread.
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.
uwefed:
Debounce.
metti un delay(10); dopo count++; e count--;
Ciao Uwe
Infatti il debounce va messo dopo la lettura.
Mettilo dopo i digitalread.
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.
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;
}
}