Hi!
I bought my first arduino uno today and have been slowly learning throughout the day. Made a working digit counter but noticed it was skipping sometimes, then I learned about debouncing and implemented this into my sketch but it seems to make it worse. Now sometimes when i push the button it doesnt respond.
Sketch without debounce:
int lastState = LOW;
int count = 0;
int A = 3;
int B = 4;
int C = 5;
int D = 6;
int E = 8;
int F = 9;
int G = 10;
int Button = 2;
int buttonState = LOW;
void setup() {
// put your setup code here, to run once:
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(Button, INPUT);
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
//void loop() {
// // put your main code here, to run repeatedly:
//}
void loop() {
buttonState=digitalRead(Button);
if (buttonState == HIGH) {
if (buttonState != lastState) {
count++;
if (count == 10) {
count = 0;
}
if (count != 1 && count != 2 && count != 3 && count != 7) {
digitalWrite(A, HIGH);
} else {
digitalWrite(A, LOW);
}
if (count != 1 && count != 4) {
digitalWrite(B, HIGH);
} else {
digitalWrite(B, LOW);
}
if (count != 5 && count != 6) {
digitalWrite(C, HIGH);
} else {
digitalWrite(C, LOW);
}
if (count != 1 && count != 0 && count != 7) {
digitalWrite(D, HIGH);
} else {
digitalWrite(D, LOW);
}
if (count == 2 || count == 6 || count == 8 || count == 0) {
digitalWrite(E, HIGH);
} else {
digitalWrite(E, LOW);
}
if (count != 1 && count != 4 && count != 7) {
digitalWrite(F, HIGH);
} else {
digitalWrite(F, LOW);
}
if (count != 2) {
digitalWrite(G, HIGH);
} else {
digitalWrite(G, LOW);
}
delay(20);
lastState = digitalRead(Button);
} else {
delay(20);
lastState = digitalRead(Button);
}
}
}
Sketch with debounce:
int lastState = LOW;
int count = 0;
int A = 3;
int B = 4;
int C = 5;
int D = 6;
int E = 8;
int F = 9;
int G = 10;
int Button = 2;
int buttonState = LOW;
int lastButtonState = LOW;
int reading=LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
// put your setup code here, to run once:
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(Button, INPUT);
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
//void loop() {
// // put your main code here, to run repeatedly:
//}
void loop() {
reading = digitalRead(Button);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis()-lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == HIGH) {
if (buttonState != lastState) {
count++;
if (count == 10) {
count = 0;
}
if (count != 1 && count != 2 && count != 3 && count != 7) {
digitalWrite(A, HIGH);
} else {
digitalWrite(A, LOW);
}
if (count != 1 && count != 4) {
digitalWrite(B, HIGH);
} else {
digitalWrite(B, LOW);
}
if (count != 5 && count != 6) {
digitalWrite(C, HIGH);
} else {
digitalWrite(C, LOW);
}
if (count != 1 && count != 0 && count != 7) {
digitalWrite(D, HIGH);
} else {
digitalWrite(D, LOW);
}
if (count == 2 || count == 6 || count == 8 || count == 0) {
digitalWrite(E, HIGH);
} else {
digitalWrite(E, LOW);
}
if (count != 1 && count != 4 && count != 7) {
digitalWrite(F, HIGH);
} else {
digitalWrite(F, LOW);
}
if (count != 2) {
digitalWrite(G, HIGH);
} else {
digitalWrite(G, LOW);
}
delay(20);
lastState = digitalRead(Button);
} else {
delay(20);
lastState = digitalRead(Button);
}
}
}
}
lastButtonState = reading;
}
Is there a problem with debouncing and rising edge detectors?
Thanks in advance,
Moshtaraq