This is an old revision of the document!


/*
 * Semaforo como maquina de estados usando
 * punteros a funcion.
 * Leonardo Yamasaki
 * GPL*/
 
#define RED1  2
#define YEL1  3
#define GRE1  4
#define RED2  5
#define YEL2  6
#define GRE2  7
 
// States
void redSem1();
void yelSem1();
void greSem1();
void redSem2();
void yelSem2();
void greSem2();
 
// State pointer
void (*statefunc)() = greSem1;
 
//punteros a estados
void redSem1(){
  digitalWrite(RED1,HIGH);
  digitalWrite(YEL1,LOW);
  digitalWrite(GRE1,LOW);
  digitalWrite(RED2,LOW);
  digitalWrite(YEL2,LOW);
  digitalWrite(GRE2,HIGH);
  statefunc = greSem2;
}
 
void redSem2(){
  digitalWrite(RED1,LOW);
  digitalWrite(YEL1,LOW);
  digitalWrite(GRE1,HIGH);
  digitalWrite(RED2,HIGH);
  digitalWrite(YEL2,LOW);
  digitalWrite(GRE2,LOW);
  statefunc = greSem1;
}
 
void yelSem1(){
  digitalWrite(RED1,LOW);
  digitalWrite(YEL1,HIGH);
  digitalWrite(GRE1,LOW);
  digitalWrite(RED2,HIGH);
  digitalWrite(YEL2,LOW);
  digitalWrite(GRE2,LOW);
  statefunc = redSem1;
}
 
void yelSem2(){
  digitalWrite(RED1,HIGH);
  digitalWrite(YEL1,LOW);
  digitalWrite(GRE1,LOW);
  digitalWrite(RED2,LOW);
  digitalWrite(YEL2,HIGH);
  digitalWrite(GRE2,LOW);
  statefunc = redSem2;
}
 
void greSem1(){
  digitalWrite(RED1,LOW);
  digitalWrite(YEL1,LOW);
  digitalWrite(GRE1,HIGH);
  digitalWrite(RED2,HIGH);
  digitalWrite(YEL2,LOW);
  digitalWrite(GRE2,LOW);
  statefunc = yelSem1;
}
 
void greSem2(){
  digitalWrite(RED1,HIGH);
  digitalWrite(YEL1,LOW);
  digitalWrite(GRE1,LOW);
  digitalWrite(RED2,LOW);
  digitalWrite(YEL2,LOW);
  digitalWrite(GRE2,HIGH);
  statefunc = yelSem2;
}
 
void setup(){
  pinMode(RED1,OUTPUT);
  pinMode(YEL1,OUTPUT);
  pinMode(GRE1,OUTPUT);
  pinMode(RED2,OUTPUT);
  pinMode(YEL2,OUTPUT);
  pinMode(GRE2,OUTPUT);
}
 
void loop(){
  (*statefunc)();
  delay(500);
}