Skip to content

Instantly share code, notes, and snippets.

@jared
Created August 12, 2010 23:08
Show Gist options
  • Save jared/521942 to your computer and use it in GitHub Desktop.
Save jared/521942 to your computer and use it in GitHub Desktop.
#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