I need help with AttachInterrupt. I read this http://arduino.cc/en/Reference/AttachInterrupt but I am lost. Here's my code:
/*
* bike light with pattern reverse button & pot
*/
int potPin = 0; // input pin for the pot
int timer = 50; // you can adjust the numbers below to set the max and min for the speed adjustment
int x = 10; // sets the max speed (0 = fast) the lower the number the faster it can go
int y = 300; // sets the min speed (100 = slow) the higher the number the slower it can go
int switchPin = 2; // switch is connected to pin 2
volatile int state = CHANGE;
int switchPin2 = 3; // switch to reverse pattern is connected to pin 13
int led1Pin = 11;
int led2Pin = 10;
int led3Pin = 9;
int led4Pin = 8;
int led5Pin = 7;
int led6Pin = 6;
int led7Pin = 5;
int led8Pin = 4;
int val; // variable for reading the pin status
int val2; // variable for reading the delayed status
int buttonState; // variable to hold the button state
int val_rev; // variable for reading the pin status
int val2_rev; // variable for reading the delayed status
int buttonState_rev;
int lightMode = 0; // What mode is the light in?
void setup() {
pinMode(switchPin, INPUT); // Set the switch pin as input
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
pinMode(led4Pin, OUTPUT);
pinMode(led5Pin, OUTPUT);
pinMode(led6Pin, OUTPUT);
pinMode(led7Pin, OUTPUT);
pinMode(led8Pin, OUTPUT);
Serial.begin(9600); // Set up serial communication at 9600bps
buttonState = digitalRead(switchPin); // read the initial state
}
void loop(){
digitalWrite(switchPin, state);
val = digitalRead(switchPin); // read input value and store it in val
delay(10); // 10 milliseconds is a good amount of time
timer = 0;
for ( int i = 0; i < 10; i++ ) {
timer += analogRead(0); // reads the pot and sets the timer to the value
}
timer = timer / 10;
timer = map(timer, 0, 1023, x, y); // maps the timer value to the max and min vaues set above with x and y
val2 = digitalRead(switchPin); // read the input again to check for bounces
val_rev = digitalRead(switchPin2); //REVERSE read input value and store it in val
delay(10); // 10 milliseconds is a good amount of time
val2_rev = digitalRead(switchPin2); // read the input again to check for bounces
val_rev = digitalRead(switchPin2);
if (!val_rev) { // make sure we got 2 consistant readings!
buttonState_rev = !buttonState_rev ; // save the new state in our variable
}
if (val == val2) { // make sure we got 2 consistant readings!
if (val != buttonState) { // the button state has changed!
if (val == LOW) { // check if the button is pressed
if (lightMode == 0) { // if its left to right
lightMode = 1; // chase left to right then back!
} else {
if (lightMode == 1) { // if its left to right then back
lightMode = 2; // all off
} else {
if (lightMode == 2) { // if its all off
lightMode = 0;
}
}
}
}
buttonState = val; // save the new state in our variable
}
// Now do whatever the lightMode indicates
if (lightMode == 0) { // single left to right
if ( buttonState_rev == LOW ) {
digitalWrite(led1Pin, HIGH);
delay(timer);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, HIGH);
delay(timer);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, HIGH);
delay(timer);
digitalWrite(led3Pin, LOW);
digitalWrite(led4Pin, HIGH);
delay(timer);
digitalWrite(led4Pin, LOW);
digitalWrite(led5Pin, HIGH);
delay(timer);
digitalWrite(led5Pin, LOW);
digitalWrite(led6Pin, HIGH);
delay(timer);
digitalWrite(led6Pin, LOW);
digitalWrite(led7Pin, HIGH);
delay(timer);
digitalWrite(led7Pin, LOW);
digitalWrite(led8Pin, HIGH);
delay(timer);
digitalWrite(led8Pin, LOW);
}
else { //single right to left
digitalWrite(led8Pin, HIGH);
delay(timer);
digitalWrite(led8Pin, LOW);
digitalWrite(led7Pin, HIGH);
delay(timer);
digitalWrite(led7Pin, LOW);
digitalWrite(led6Pin, HIGH);
delay(timer);
digitalWrite(led6Pin, LOW);
digitalWrite(led5Pin, HIGH);
delay(timer);
digitalWrite(led5Pin, LOW);
digitalWrite(led4Pin, HIGH);
delay(timer);
digitalWrite(led4Pin, LOW);
digitalWrite(led3Pin, HIGH);
delay(timer);
digitalWrite(led3Pin, LOW);
digitalWrite(led2Pin, HIGH);
delay(timer);
digitalWrite(led2Pin, LOW);
digitalWrite(led1Pin, HIGH);
delay(timer);
digitalWrite(led1Pin, LOW);
}
}
if (lightMode == 1) { // single light left to right then back
digitalWrite(led1Pin, HIGH);
delay(timer);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, HIGH);
delay(timer);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, HIGH);
delay(timer);
digitalWrite(led3Pin, LOW);
digitalWrite(led4Pin, HIGH);
delay(timer);
digitalWrite(led4Pin, LOW);
digitalWrite(led5Pin, HIGH);
delay(timer);
digitalWrite(led5Pin, LOW);
digitalWrite(led6Pin, HIGH);
delay(timer);
digitalWrite(led6Pin, LOW);
digitalWrite(led7Pin, HIGH);
delay(timer);
digitalWrite(led7Pin, LOW);
digitalWrite(led8Pin, HIGH);
delay(timer);
digitalWrite(led8Pin, LOW);
digitalWrite(led7Pin, HIGH);
delay(timer);
digitalWrite(led7Pin, LOW);
digitalWrite(led6Pin, HIGH);
delay(timer);
digitalWrite(led6Pin, LOW);
digitalWrite(led5Pin, HIGH);
delay(timer);
digitalWrite(led5Pin, LOW);
digitalWrite(led4Pin, HIGH);
delay(timer);
digitalWrite(led4Pin, LOW);
digitalWrite(led3Pin, HIGH);
delay(timer);
digitalWrite(led3Pin, LOW);
digitalWrite(led2Pin, HIGH);
delay(timer);
digitalWrite(led2Pin, LOW);
digitalWrite(led1Pin, HIGH);
}
else { // reverse
digitalWrite(led8Pin, HIGH);
delay(timer);
digitalWrite(led8Pin, LOW);
digitalWrite(led7Pin, HIGH);
delay(timer);
digitalWrite(led7Pin, LOW);
digitalWrite(led6Pin, HIGH);
delay(timer);
digitalWrite(led6Pin, LOW);
digitalWrite(led5Pin, HIGH);
delay(timer);
digitalWrite(led5Pin, LOW);
digitalWrite(led4Pin, HIGH);
delay(timer);
digitalWrite(led4Pin, LOW);
digitalWrite(led3Pin, HIGH);
delay(timer);
digitalWrite(led3Pin, LOW);
digitalWrite(led2Pin, HIGH);
delay(timer);
digitalWrite(led2Pin, LOW);
digitalWrite(led1Pin, HIGH);
delay(timer);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, HIGH);
delay(timer);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, HIGH);
delay(timer);
digitalWrite(led3Pin, LOW);
digitalWrite(led4Pin, HIGH);
delay(timer);
digitalWrite(led4Pin, LOW);
digitalWrite(led5Pin, HIGH);
delay(timer);
digitalWrite(led5Pin, LOW);
digitalWrite(led6Pin, HIGH);
delay(timer);
digitalWrite(led6Pin, LOW);
digitalWrite(led7Pin, HIGH);
delay(timer);
digitalWrite(led7Pin, LOW);
digitalWrite(led8Pin, HIGH);
}
}
if (lightMode == 2) { // all off
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
digitalWrite(led4Pin, LOW);
digitalWrite(led5Pin, LOW);
digitalWrite(led6Pin, LOW);
digitalWrite(led7Pin, LOW);
digitalWrite(led8Pin, LOW);
}
}
The problem is, when I push the button to change the pattern (SwitchPin 2), sometimes it won't change unless I turn the pot first. Please help. Thank you.