Created
August 12, 2010 23:08
-
-
Save jared/521942 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define RED 5 | |
#define YELLOW 6 | |
#define GREEN 7 | |
#define INDICATOR 13 | |
#define BUTTONINTERRUPT 0 // This is pin 2 on the arduino board | |
#define BOUNCE_DURATION 30 // define an appropriate bounce time in ms for your switches | |
#define FLASH_DELAY 1000 | |
int mode=1; | |
volatile int state=0; | |
volatile unsigned long bounceTime=0; // variable to hold ms count to debounce a pressed switch | |
void setup() { | |
pinMode(RED, OUTPUT); | |
pinMode(YELLOW, OUTPUT); | |
pinMode(GREEN, OUTPUT); | |
pinMode(INDICATOR, OUTPUT); | |
attachInterrupt(BUTTONINTERRUPT, intHandler, RISING); | |
mode = 1; | |
state = 0; | |
} | |
void loop() { | |
setMode(); | |
switch(mode) { | |
case 1: | |
stoplight(); | |
break; | |
case 2: | |
flashingRed(FLASH_DELAY); | |
break; | |
case 3: | |
flashingYellow(FLASH_DELAY); | |
break; | |
case 4: | |
upAndDown(FLASH_DELAY); | |
break; | |
case 5: | |
allOnThenOff(FLASH_DELAY); | |
break; | |
case 6: | |
allOn(); | |
break; | |
} | |
} | |
void stoplight() { | |
digitalWrite(GREEN, HIGH); | |
delay(60000); | |
digitalWrite(GREEN, LOW); | |
digitalWrite(YELLOW, HIGH); | |
delay(10000); | |
digitalWrite(YELLOW, LOW); | |
digitalWrite(RED, HIGH); | |
delay(60000); | |
digitalWrite(RED, LOW); | |
} | |
void flashingRed(int flashDelay) { | |
digitalWrite(RED, HIGH); | |
delay(flashDelay); | |
digitalWrite(RED, LOW); | |
delay(flashDelay); | |
} | |
void flashingYellow(int flashDelay) { | |
digitalWrite(YELLOW, HIGH); | |
delay(flashDelay); | |
digitalWrite(YELLOW, LOW); | |
delay(flashDelay); | |
} | |
void upAndDown(int flashDelay) { | |
digitalWrite(GREEN, HIGH); | |
delay(flashDelay); | |
digitalWrite(GREEN, LOW); | |
digitalWrite(YELLOW, HIGH); | |
delay(flashDelay); | |
digitalWrite(YELLOW, LOW); | |
digitalWrite(RED, HIGH); | |
delay(flashDelay); | |
digitalWrite(RED, LOW); | |
digitalWrite(YELLOW, HIGH); | |
delay(flashDelay); | |
digitalWrite(YELLOW, LOW); | |
} | |
void allOnThenOff(int flashDelay) { | |
digitalWrite(GREEN, HIGH); | |
delay(flashDelay); | |
digitalWrite(YELLOW, HIGH); | |
delay(flashDelay); | |
digitalWrite(RED, HIGH); | |
delay(flashDelay); | |
digitalWrite(RED, LOW); | |
delay(flashDelay); | |
digitalWrite(YELLOW, LOW); | |
delay(flashDelay); | |
digitalWrite(GREEN, LOW); | |
delay(flashDelay); | |
} | |
void allOn() { | |
digitalWrite(GREEN, HIGH); | |
digitalWrite(YELLOW, HIGH); | |
digitalWrite(RED, HIGH); | |
} | |
void resetLights() { | |
digitalWrite(GREEN, HIGH); | |
digitalWrite(YELLOW, HIGH); | |
digitalWrite(RED, HIGH); | |
delay(500); | |
digitalWrite(GREEN, LOW); | |
digitalWrite(YELLOW, LOW); | |
digitalWrite(RED, LOW); | |
digitalWrite(INDICATOR, LOW); | |
} | |
void setMode() { | |
if(state > 0) { | |
if (mode < 6) { | |
mode++; | |
} else { | |
mode = 1; | |
} | |
resetLights(); | |
state = 0; | |
} | |
} | |
//void buttonChange() { | |
// digitalWrite(INDICATOR, HIGH); | |
// state++; | |
//} | |
void intHandler(){ | |
// this is the interrupt handler for button presses | |
// it ignores presses that occur in intervals less then the bounce time | |
if (abs(millis() - bounceTime) > BOUNCE_DURATION) | |
{ | |
digitalWrite(INDICATOR, HIGH); | |
state++; | |
bounceTime = millis(); // set whatever bounce time in ms is appropriate | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment