Usaremos dos botones para simular los sensores del vehículo en cada extremo del puente. Cada juego de luces tendrá LEDs rojos, amarillos y verdes. Inicialmente, el sistema permitirá que el tráfico fluya de oeste a este, por lo que las luces orientadas a la oeste se pondrán a verde y las luces de la del este se pondrán en rojo.

Cuando un vehículo se acerca al puente y que acabará pulsando el botón la luz es roja, entonces el sistema encenderá la luz en el lado opuesto de verde a amarillo y a rojo, y luego tendrá que un período de tiempo establecido para permitir que cualquier vehículo que se encuentre ya en el puente pueda terminar el cruce. A continuación, la luz amarilla encendida en ell lado del vehículo en espera parpadeará como un aviso de “prepararse” para el conductor y finalmente la luz cambiará a verde. La luz permanecerá verde hasta que el coche se acerque al otro lado, momento en el que se repite el proceso.

Lista de componentes

Esto es lo que necesitarás para crear este proyecto:

  • Dos LEDs rojos (LED1 y LED2)
  • Dos LEDs amarillos (LED3 y LED4)
  • Dos LEDs verdes (LED5 y LED6)
  • Seis resistencias de 560 Ω (de R1 a R6)
  • Dos resistencias de 10 kΩ (R7 y R8)
  • Dos condensadores de 100 nF (C1 y C2)
  • Dos pulsadores (S1 y S2)
  • Protoboard 800p
  • Un Arduino y un cable USB
  • Varios cables de conexión

El código

// Semáforo Arduino
// define the pins that the buttons and lights are connected to:
#define westButton 3
#define eastButton 13
#define westRed 2
#define westYellow 1
#define westGreen 0
#define eastRed 12
#define eastYellow 11
#define eastGreen 10
#define yellowBlinkTime 500 // 0.5 seconds for yellow light blink
boolean trafficWest = true; // west = true, east = false
int flowTime = 10000; // amount of time to let traffic flow
int changeDelay = 2000; // amount of time between color changes
void setup()
{
// setup digital I/O pins
pinMode(westButton, INPUT);
pinMode(eastButton, INPUT);
pinMode(westRed, OUTPUT);
pinMode(westYellow, OUTPUT);
pinMode(westGreen, OUTPUT);
pinMode(eastRed, OUTPUT);
pinMode(eastYellow, OUTPUT);
pinMode(eastGreen, OUTPUT);
// set initial state for lights - west side is green first
digitalWrite(westRed, LOW);
digitalWrite(westYellow, LOW);
digitalWrite(westGreen, HIGH);
digitalWrite(eastRed, HIGH);
digitalWrite(eastYellow, LOW);
digitalWrite(eastGreen, LOW);
}
void loop()
{
if ( digitalRead(westButton) == HIGH ) // request west>east traffic flow
{
if ( trafficWest != true )
// only continue if traffic flowing in the opposite (east) direction
{
trafficWest = true; // change traffic flow flag to west>east
delay(flowTime); // give time for traffic to flow
digitalWrite(eastGreen, LOW); // change east-facing lights from green
// to yellow to red
digitalWrite(eastYellow, HIGH);
delay(changeDelay);
digitalWrite(eastYellow, LOW);
digitalWrite(eastRed, HIGH);
delay(changeDelay);
for ( int a = 0; a < 5; a++ ) // blink yellow light { digitalWrite(westYellow, LOW); delay(yellowBlinkTime); digitalWrite(westYellow, HIGH); delay(yellowBlinkTime); } digitalWrite(westYellow, LOW); digitalWrite(westRed, LOW); // change west-facing lights from red to green digitalWrite(westGreen, HIGH); } } if ( digitalRead(eastButton) == HIGH ) // request east>west traffic flow
{
if ( trafficWest == true )
// only continue if traffic flow is in the opposite (west) direction
{
trafficWest = false; // change traffic flow flag to east>west
delay(flowTime); // give time for traffic to flow
digitalWrite(westGreen, LOW);
// change west lights from green to yellow to red
digitalWrite(westYellow, HIGH);
delay(changeDelay);
digitalWrite(westYellow, LOW);
digitalWrite(westRed, HIGH);
delay(changeDelay);
for ( int a = 0 ; a < 5 ; a++ ) // blink yellow light
{
digitalWrite(eastYellow, LOW);
delay(yellowBlinkTime);
digitalWrite(eastYellow, HIGH);
delay(yellowBlinkTime);
}
digitalWrite(eastYellow, LOW);
digitalWrite(eastRed, LOW); // change east-facing lights from red to green
digitalWrite(eastGreen, HIGH);
}
}
}
https://descubrearduino.com/