This is an old revision of the document!


Regresa a codigos

/*
** A state machine for a semaphore using ponters to function
** Adding blink green light
** 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 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);
  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)();
}