Regresa a codigos

/*
 * Semaforo como maquina de estados usando
 * punteros a funcion.
 * Leonardo Yamasaki
 * GPL
*/

#define RED1  14
#define YEL1  15
#define GRE1  16
#define RED2  17
#define YEL2  18
#define GRE2  19

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