Pulsador y Led rojo, amarillo y verde emulación semáforo

 Buenas!
En este proyecto presentaremos un circuito con pulsador y leds de diversos colores para simular el comportamiento de un semáforo cuando presionamos el pulsador.

Diagrama del circuito

 El diagrama del circuito es el que se presenta a continuación. Los led se alimentan de los pines digitales 13,12 y 11 que serán definidos como salidas (OUTPUT) en su pata más larga que es el polo positivo o Ánodo y reciben en el polo negativo la masa (GND) de arduino con una resistencia en serie de 220 ohmios aproximada, yo he puesto 1k porque no tenía, cada uno.
 
 
 
 
 
El pulsador tiene una resistencia pull-down de 10 k (qué es un resistencia pull-down, lee esta entrada) para asegurar que se encuentren en un estado lógico de baja energía (LOW) y solo tenga un estado alto (HIGH), cuando se pulse. Se alimenta en uno de los extremos con el voltaje 5V de Arduino y en el otro extremo se conecta el pin número 2 que será una entrada (INPUT) y la resistencia 10 k en serie a GND.

La relación entre los dos elementos del circuito es la siguiente
  • En el setup se quedarán encendidos los tres leds de colores
  • Si pulsamos el botón, comenzará una secuencia de encendido y apagado de cada una de las luces como si de un semáforo se tratara, esa secuencia tendrá 5 repeticiones mediante una sentencia de control o bucle iterativo que comentaremos, el bucle while(condición).
  • Una vez finalice la secuencia de semáforo, se apagarán todos los leds, si volvemos a pulsar el botón se iniciará la secuencia del semáforo

Simulación en Tinkercad

Creamos un nuevo circuito en Tinkercad (tinkercad.com -> una vez nos hayamos registrado y nos loguemos nos vamos a la opción circuits para ir situando todos los componentes necesarios)
 
Y realizamos la simulación con el siguiente código
 

//con doble barra podemos poner comentarios
//para valores constantes nos interesa definir constantes
//en vez de utilizar variables que consumen más memoria
//se utiliza la sentencia #define nombreconstante valor
#define buttonPin  2    // el Pin  digital que se conecta al botón
#define ledRedPin  13
#define ledYellowPin 12
#define ledGreenPin  11
byte buttonState =0;
 //en este ejemplo inicializamos todos los componentes y encendemos
//todos los led en el setup
void setup() {
  // put your setup code here, to run once:
 
  pinMode(ledRedPin, OUTPUT);     
  pinMode(ledYellowPin, OUTPUT);
  pinMode(ledGreenPin, OUTPUT);
        // initialize el pin del  pulsador como entrada:
        pinMode(buttonPin, INPUT);    
        digitalWrite(ledRedPin, HIGH);
    digitalWrite(ledYellowPin, HIGH);
    digitalWrite(ledGreenPin, HIGH);
}
void loop()
{
    buttonState = digitalRead(buttonPin);
    if(buttonState==HIGH){
    enciendeSemaforo();
    apagaSemaforo();
       
    }
}


 void enciendeSemaforo(){
 byte i = 0;
  while(i<5){
    digitalWrite(ledRedPin, HIGH);
    digitalWrite(ledYellowPin, LOW);
    digitalWrite(ledGreenPin, LOW);
    delay(2000);
    digitalWrite(ledRedPin, LOW);
    digitalWrite(ledYellowPin, HIGH);
    digitalWrite(ledGreenPin, LOW);
    delay(2000);
    digitalWrite(ledRedPin, LOW);
    digitalWrite(ledYellowPin, LOW);
    digitalWrite(ledGreenPin, HIGH);
    delay(2000);
     i++;
  }
 
 }
 void apagaSemaforo(){
   digitalWrite(ledRedPin, LOW);
    digitalWrite(ledYellowPin, LOW);
    digitalWrite(ledGreenPin, LOW);
 }
En este código hemos utilizado la sentencia #define del preprocesador para declarar constantes, es decir identificadores asociados a un valor que no varía durante la ejecución, de esta manera hacemos más eficiente el programa al no desperdiciar asignación de memoria extra para tipos de datos que requieren más memoria.
Hemos creado nuestras dos primeras funciones enciendeSemaforo() y apagaSemaforo(), que ejecutan un bloque de código cada vez que se llaman, no teniendo que escribir tantas líneas de código y haciendo más eficiente y legible el program. 
En este código, dentro de la función enciendeSemaforo también hacemos uso de una sentencia condicional que se evalúa cíclicamente
while (i < 5)
se traduce por
"mientras la variable i tenga un valor inferior a cinco, continúo dentro del bucle y ejecuto todas las sentencias que se encuentran entre las llaves del bucle while"
con la instrucción
i++;
incrementamos el valor de la variable i en una unidad, recordar que la hemos declarado a cero al comienzo de la función.
Si ejecutamos este código en la simulación de thinkercad podremos apreciar como el circuito hace justamente lo que le hemos pedido que haga
.

Construcción del circuito real

Por último, si tienes todos los componentes puedes armar el circuito, escribir el código en IDE y subirlo o plancharlo en la placa Arduino uno, 
 
 
 
Prototipo real en funcionamiento

 
 para verlo en funcionamiento:

 
Y eso es todo.
Gracias por tu tiempo y atención
Un saludo!