This is an old revision of the document!
/*
** A state machine for a semaphore (pedestrian Traffic Light)
** using ponters to function
** Author: Leonardo Yamasaki
** Licence GPL Free to use.
*/
// Define pins of led
#define RED1 14
#define YEL1 15
#define GRE1 16
#define RED2 17
#define YEL2 18
#define GRE2 19
// define pin sensor analogico
#define SENSOR 20
//define timmings
#define REDDEL 1000
#define YELDEL 500
#define GREDEL 1000
#define BLINKDEL 50
#define NUMBLINK 20
// States red, yellow and green of two semaphores
void redSem1();
void yelSem1();
void greSem1();
void redSem2();
void yelSem2();
void greSem2();
// State pointer and init state
void (*statefunc)() = greSem1;
// state fuctions
void redSem1(){
digitalWrite(RED1,HIGH);
digitalWrite(YEL1,LOW);
digitalWrite(GRE1,LOW);
digitalWrite(RED2,LOW);
digitalWrite(YEL2,LOW);
digitalWrite(GRE2,HIGH);
statefunc = greSem2;
delay(REDDEL);
}
void redSem2(){
digitalWrite(RED1,LOW);
digitalWrite(YEL1,LOW);
digitalWrite(GRE1,HIGH);
digitalWrite(RED2,HIGH);
digitalWrite(YEL2,LOW);
digitalWrite(GRE2,LOW);
statefunc = greSem1;
delay(REDDEL);
}
void yelSem1(){
digitalWrite(RED1,LOW);
digitalWrite(YEL1,HIGH);
digitalWrite(GRE1,LOW);
digitalWrite(RED2,HIGH);
digitalWrite(YEL2,LOW);
digitalWrite(GRE2,LOW);
statefunc = redSem1;
delay(YELDEL);
}
void yelSem2(){
digitalWrite(RED1,HIGH);
digitalWrite(YEL1,LOW);
digitalWrite(GRE1,LOW);
digitalWrite(RED2,LOW);
digitalWrite(YEL2,HIGH);
digitalWrite(GRE2,LOW);
statefunc = redSem2;
delay(YELDEL);
}
void greSem1(){
digitalWrite(RED1,LOW);
digitalWrite(YEL1,LOW);
digitalWrite(GRE1,HIGH);
digitalWrite(RED2,HIGH);
digitalWrite(YEL2,LOW);
digitalWrite(GRE2,LOW);
// Adding sensor for peatonal use
while(analogRead(SENSOR)>900){}
statefunc = yelSem1;
delay(GREDEL);
blinkPin(GRE1);
}
void greSem2(){
digitalWrite(RED1,HIGH);
digitalWrite(YEL1,LOW);
digitalWrite(GRE1,LOW);
digitalWrite(RED2,LOW);
digitalWrite(YEL2,LOW);
digitalWrite(GRE2,HIGH);
statefunc = yelSem2;
delay(GREDEL);
blinkPin(GRE2);
}
void blinkPin(int pin){
int statepin,i;
statepin = digitalRead(pin);
for(i=0;i<NUMBLINK;i++){
digitalWrite(pin,LOW);
delay(BLINKDEL); //blink on/off
digitalWrite(pin,HIGH);
delay(BLINKDEL); //blink on/off
}
digitalWrite(pin,statepin);
}
// Setup pins
void setup(){
pinMode(RED1,OUTPUT);
pinMode(YEL1,OUTPUT);
pinMode(GRE1,OUTPUT);
pinMode(RED2,OUTPUT);
pinMode(YEL2,OUTPUT);
pinMode(GRE2,OUTPUT);
}
// loop states
void loop(){
(*statefunc)();
}