Hi, im quite new to arduino, and im having a bit of a problem in implementing a debounced interrupt.
So i have 4 leds, which are programmed to light based on a pattern i coded into an array. I have to "pause" the pattern using the pushbutton. However, when i release the button, the result is not always what i expect it to be. Like it jumps to the next pattern, or resets the cycle.
Do you guys have any suggestions for this? I have my attached my code so you can comment on it. Thanks.
const int buttonPin = 2;
int led = 13;
int led0 = 12;
int led1 = 11;
int led2 = 10;
// 0,1,2,3,4,5,6,7,8,9,10
int ledArr [] = {0,0,0,0,1,1,1,1,1,1,1};
int ledArr0[] = {0,0,0,1,0,0,0,1,1,1,1};
int ledArr1[] = {0,0,1,0,0,0,1,0,0,1,1};
int ledArr2[] = {0,1,0,0,0,1,0,0,1,0,1};
volatile int i;
int j = 0;
volatile int buttonState = 0;
int lastButtonState = LOW;
long lastDebounceTime = 0;
long debounceDelay = 40;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT);
pinMode(led, OUTPUT);
pinMode(led0, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
digitalWrite(buttonPin, LOW);
attachInterrupt(0, doNothing, RISING);
}
void loop() {
ledPattern();
}
void debounceThis(){
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
buttonState = reading;
}
lastButtonState = reading;
}
void ledPattern(){
for (i = 0; i < 11; i++){
debounceThis();
if(buttonState == 0){
delay(400);
digitalWrite(led2, ledArr[i]);
digitalWrite(led1, ledArr0[i]);
digitalWrite(led0, ledArr1[i]);
digitalWrite(led, ledArr2[i]);
Serial.println(i);
}
}
}
void doNothing(){
buttonState != buttonState;
Serial.print("i during ISR: ");
Serial.println(i);
}
EXER2.ino (1.41 KB)