/*en esta práctica tiene que estar el led rojo encendido para los coches y el 
 amarillo para los peatones. Al pulsar el pulsador se activa la secuencia hasta 
 volver a la situación inicial*/

/*diferencio además de los colores de los semáforos si 
los uso para los coches o para los peatones */
int pulsador=35; //asigna el pin del pulsador
int cochesr=23; //led rojo del semáforo de los coches
int cochesa=22; // led amarillo del semáforo de los coches
int cochesv=21; // led verde del semáforo de los coches 
int personasv=13; // led verde del semáforo de los peatones
int personasa=12; // led amarillo del semáforo de los peatones
/*creo tres contadores. Dos de ellos para los semáforos y el úlitmo para hacer 
parpadear el led amarillo del semáforo de los peatones*/
int tcoches=0, tpersonas=0, tpuls=0;  
int estadocoches=0; //estado del semáforo de los coches
int estadopersonas=0; // estado del semáforo de los peatones 
int estadopulsador=0; /*estado del pulsador. Se utiliza para saber si se ha pulsado 
el pulsador, se le asigna un 1, y matiene este valor hasta que termina la secuencia y
se reestablece a cero*/

void setup(){
  Serial.begin(9600);
  Serial.println("ejercicio semáforo");
  pinMode(cochesr, OUTPUT);
  pinMode(cochesa, OUTPUT);
  pinMode(cochesv, OUTPUT);
  pinMode(personasv, OUTPUT);
  pinMode(personasa, OUTPUT);
  pinMode(pulsador, INPUT);
}

void loop()
{
  if (estadopulsador==0){
  digitalWrite(cochesv, HIGH);
  digitalWrite(personasa, HIGH);
  delay (250);
    if (digitalRead(pulsador)==LOW)
  {
    estadopulsador=1;
  }
  digitalWrite(personasa, LOW);
  delay(250);
  }

  if (digitalRead(pulsador)==LOW)
  {
    estadopulsador=1;
  }
/*mientras no se pulse el pulsador el valor de la varialbe estadopulsador es cero 
y el código se queda en el estado de inicio. Al pulsar el pulsador cambia el valor 
de la variable estadopulsador a 1 y empieza la secuencia de los semáforos, entrando 
dentro del bloque if*/
/*el microprocesador ejecuta las funciones dentro del bloque if siempre que el valor 
de la varialbe estadopulsador sea 1*/

 if (estadopulsador==1)
 {
  delay(1);
  tcoches++;
  tpersonas++;
  tpuls++;

/*inicialización y asignación de estado para los coches, dependiendo del estado
anterior del que venía y el tiempo transcurrido*/
   if (estadocoches==0 && tcoches>5000 && estadopulsador==1)
     {
    estadocoches=1;
    tcoches=0;
     } 
    if (estadocoches==1 && tcoches>2000 && estadopulsador==1)
     {
      estadocoches=2;
      tcoches=0;
     }
    if (estadocoches==2 && tcoches>5000 && estadopulsador==1)
     {
      estadocoches=3;
      tcoches=0;
     }
    if (estadocoches==3 && tcoches>2000 && estadopulsador==1)
     {
      estadocoches=0;
      tcoches=0;
      /*en la última asignación de estados del semáforo de los coches, se asigna la 
      variable estadocoches a cero (estado original) y se asigna el a la variable 
      estadopulsador también un cero. Esto úlitmo es para que al acabar la secuencia 
      no vuelva a entrar dentro del bloque if y vuelva a empezar*/
      estadopulsador=0;
     }

/*función que establece, dependiendo del estado en el que se encuentre, el estado de 
los leds del semáforo de los coches. Que leds están apagados y cuáles están encendidos*/
 switch(estadocoches){
   case(0): 
     digitalWrite(cochesr, LOW);
     digitalWrite(cochesa, LOW);
     digitalWrite(cochesv, HIGH);
     break;

   case (1):
   digitalWrite(cochesr,LOW);
   digitalWrite(cochesa, HIGH);
   digitalWrite(cochesv, HIGH);
   break;

   case (2): 
    digitalWrite(cochesr,HIGH);
    digitalWrite(cochesa, LOW);
    digitalWrite(cochesv, LOW);
    break;
  
  case (3): 
  digitalWrite(cochesr,HIGH);
  digitalWrite(cochesa, HIGH);
  digitalWrite(cochesv, LOW);
  break;
 }

/*inicialización y asignación de estado para los peatones, dependiendo del estado
anterior del que venía y el tiempo transcurrido*/
  if (estadopersonas==0 && tpersonas>7000 && estadopulsador==1)
   {
     estadopersonas=1;
     tpersonas=0;
   }
  if (estadopersonas==1 && tpersonas>5000 && estadopulsador==1)
   {
    estadopersonas=0;
    tpersonas=0;
    tpuls=0;
   }

/*función que establece, dependiendo del estado en el que se encuentre, el estado de 
los leds del semáforo de los peatones. Que leds están apagados y cuáles están encendidos*/
 switch(estadopersonas)
 {
   case (0):
     digitalWrite(personasv, LOW);
     if (tpuls==250)
    {
      digitalWrite(personasa, HIGH);
    }
   if (tpuls==500)
    {
      digitalWrite(personasa, LOW);
      tpuls=0;
    }
     break;

  case (1): 
    digitalWrite(personasv, HIGH);
    digitalWrite(personasa, LOW);
    break;
 }
 return;
 }

}
$abcdeabcde151015202530354045505560fghijfghij