Ciao,
sto testando un debounce hardware su due pulsanti (momentary switch) che accendono o spengono una fila di 4 led.
Lo sketch dovrebbe essere banale: se premo il tasto 1 i led si accendono in sequenza (da tutti spenti a tutti 4 accesi); se premo il taso 2 i led si spengono in sequenza.
Acceso il quarto led, la sequenza riparte dall’inizio: tutti spenti. (stesso se ho spento anche il primo led: da tutti spenti si riparte poi da tutti e 4 accesi per poi spegnerli in successione)
Il problema che non riesco a risolvere è questo: se premo i pulsanti in modo ripetitivo, tutto funziona. Se tengo premuto il pulsante, il ciclo sembra arrestarsi all’ultima istruzione e poi riparte saltando la prima. Per capirsi, accesi tutti e 4 i led, mi aspetterei che tenendo premuto il pulsante li spegnesse e ripartisse poi ad accendere il primo…invece non li spegne e riparte direttamente con il primo acceso.
Allego lo sketch. E’ molto banale ma non riesco a capire perchè tenendo premuto i tasti non funziona come dovrebbe.
Massimo
// variabili per la lettura dello stato pulsanti
int val1;
int val2;
// assegnazione variabili dei led
int led01 = 31;
int led02 = 33;
int led03 = 35;
int led04 = 37;
int pgm = 0; // all'avvio parto da pgm = 0 (tutti e 4 i led spenti)
void setup();
void loop();
void setup()
{
pinMode(2, INPUT);
pinMode(4, INPUT);
pinMode(led01, OUTPUT);
pinMode(led02, OUTPUT);
pinMode(led03, OUTPUT);
pinMode(led04, OUTPUT);
}
void loop()
{
// se ho spento tutti i led il successivo step riparte da tutti e 4 i led accesi
if (pgm < 0)
{
pgm = 4;
}
// se ho acceso tutti i led il successivo step riparte da tutti e 4 i led spenti
if (pgm > 4)
{
pgm = 0;
}
val1 = digitalRead(2);
val2 = digitalRead(4);
if (val1 == HIGH)
{
pgm = pgm + 1;
delay(400);
}
if (val2 == HIGH)
{
pgm = pgm - 1;
delay(400);
}
if (pgm == 0)
{
digitalWrite(led01, LOW);
digitalWrite(led02, LOW);
digitalWrite(led03, LOW);
digitalWrite(led04, LOW);
}
if (pgm == 1)
{
digitalWrite(led01, HIGH);
digitalWrite(led02, LOW);
digitalWrite(led03, LOW);
digitalWrite(led04, LOW);
}
if (pgm == 2)
{
digitalWrite(led01, HIGH);
digitalWrite(led02, HIGH);
digitalWrite(led03, LOW);
digitalWrite(led04, LOW);
}
if (pgm == 3)
{
digitalWrite(led01, HIGH);
digitalWrite(led02, HIGH);
digitalWrite(led03, HIGH);
digitalWrite(led04, LOW);
}
if (pgm == 4)
{
digitalWrite(led01, HIGH);
digitalWrite(led02, HIGH);
digitalWrite(led03, HIGH);
digitalWrite(led04, HIGH);
}
}