#define REDBULB 11 #define YELLOWBULB 10 #define GREENBULB 9 #define BUZZER 7 #define RIGHTSWITCH 4 #define LEFTSWITCH 2 #define PHOTOPOT 0 #define REDON 0 #define YELLOWON 1 #define GREENON 2 #define REDFADE 3 #define YELLOWFADE 4 #define GREENFADE 5 #define MAKEBUZZ 6 #define TESTLIGHT 7 #define TESTRBUTTON 8 #define TESTLBUTTON 9 #define NUMSTATES (TESTLBUTTON+1) #define SECPERSTATE 3 unsigned int state ; unsigned long lastChange ; unsigned long nextChange ; void setup() { pinMode(REDBULB, OUTPUT) ; pinMode(YELLOWBULB, OUTPUT) ; pinMode(GREENBULB, OUTPUT) ; pinMode(BUZZER, OUTPUT) ; pinMode(RIGHTSWITCH, INPUT) ; pinMode(LEFTSWITCH, INPUT) ; digitalWrite(REDBULB, HIGH) ; digitalWrite(YELLOWBULB, HIGH) ; digitalWrite(GREENBULB, HIGH) ; digitalWrite(RIGHTSWITCH, HIGH) ; digitalWrite(LEFTSWITCH, HIGH) ; nextChange = micros() ; state = NUMSTATES-1 ; Serial.begin(38400) ; } void lightsOff() { digitalWrite(REDBULB, HIGH) ; digitalWrite(YELLOWBULB, HIGH) ; digitalWrite(GREENBULB, HIGH) ; } void lightsOn() { digitalWrite(REDBULB, LOW) ; digitalWrite(YELLOWBULB, LOW) ; digitalWrite(GREENBULB, LOW) ; } void enterRedOn() { lightsOff() ; digitalWrite(REDBULB, LOW) ; } void enterYellowOn() { lightsOff() ; digitalWrite(YELLOWBULB, LOW) ; } void enterGreenOn() { lightsOff() ; digitalWrite(GREENBULB, LOW) ; } int voltBuzz ; void enterBuzzOn() { lightsOff() ; voltBuzz = 1 ; } #define STATEDIV100 (SECPERSTATE*1000000UL/100) void fadeRed(unsigned long stateDelta) { int inState = stateDelta/STATEDIV100 ; analogWrite(REDBULB, inState*5/2) ; } void fadeYellow(unsigned long stateDelta) { int inState = stateDelta/STATEDIV100 ; analogWrite(YELLOWBULB, inState*5/2) ; } void fadeGreen(unsigned long stateDelta) { int inState = stateDelta/STATEDIV100 ; analogWrite(GREENBULB, inState*5/2) ; } #define NOTEFREQ 440 #define HALFPERIOD (100000/NOTEFREQ/2) void makeBuzz(unsigned long stateDelta) { int highORlow = stateDelta/HALFPERIOD & 0x1 ; if (highORlow != voltBuzz) { if (highORlow) { digitalWrite(BUZZER, HIGH) ; } else { digitalWrite(BUZZER, LOW) ; } voltBuzz = highORlow ; } } int maxSensor = 0 ; int minSensor = 1024 ; void sensorTest() { int sensorValue = analogRead(PHOTOPOT) ; if (minSensor > sensorValue) { minSensor = sensorValue ; } if (maxSensor < sensorValue) { maxSensor = sensorValue ; } if (minSensor != maxSensor) { int sensorOut = (long)(sensorValue-minSensor)*255 / (maxSensor-minSensor) ; analogWrite(REDBULB, sensorOut) ; } } void printMinMax() { Serial.print(minSensor) ; Serial.print('-') ; Serial.println(maxSensor) ; } void rightButtonTest() { digitalWrite(REDBULB, digitalRead(RIGHTSWITCH)) ; } void leftButtonTest() { digitalWrite(GREENBULB, digitalRead(LEFTSWITCH)) ; } void loop() { unsigned long presTime = micros() ; if (presTime >= nextChange) { ++state ; if (state == NUMSTATES) { state = 0 ; } lastChange = nextChange ; nextChange = presTime + SECPERSTATE*1000000 ; switch(state) { case REDON: case REDFADE: enterRedOn() ; break ; case GREENON: case GREENFADE: enterGreenOn() ; break ; case YELLOWON: case YELLOWFADE: enterYellowOn() ; break ; case MAKEBUZZ: enterBuzzOn() ; break ; case TESTLIGHT: printMinMax() ; break ; case TESTRBUTTON: case TESTLBUTTON: lightsOff() ; break ; default: ; } } else { unsigned long stateDelta = presTime - lastChange ; switch(state) { case REDFADE: fadeRed(stateDelta) ; break ; case GREENFADE: fadeGreen(stateDelta) ; break ; case YELLOWFADE: fadeYellow(stateDelta) ; break ; case MAKEBUZZ: makeBuzz(stateDelta) ; break ; case TESTLIGHT: sensorTest() ; break ; case TESTRBUTTON: rightButtonTest() ; break ; case TESTLBUTTON: leftButtonTest() ; break ; default: ; } } }