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)();
}