1. DescripciónEn este proyecto se controlará con una tarjeta Arduino un semáforo para automóviles y peatones.
El semáforo se encuentra por defecto en verde para automóviles.
Cuando un peatón presiona el pulsador, se inicia la secuencia para poner verde el semáforo de peatones.
El tiempo que estará en verde para peatones depende de la posición de un potenciómetro.
El semáforo terminará en verde para los automóviles.
Si se presiona el pulsador, el sistema memoriza la petición del peatón, pero deberá esperar un tiempo mínimo antes de comenzar la siguiente secuencia.
Fotografía del proyecto:
2. Esquema eléctrico 3. Planos mecánicosEste proyecto no tiene planos mecánicos
4. Listado de componentes2 Led Rojo
2 Led Verde
1 Led Ambar
5 Resistencias de 330 ohmios.
1 Pulsador normalmente abierto
1 Potenciómetro de 10K
9 Cables macho-macho (11 si se conectan las dos tiras + y - de la protoboard)
9 Puentes pequeños (se pueden hacer con cable de red)
1 Placa Arduino Uno
1 Placa Protoboard
El valor de las resistencias de 330 Ohmios se puede reducir hasta 120 ohmios para aumentar el brillo de los led.
5. Esquema de montaje eléctrico y mecánico El montaje es sencillo y se puede realizar a partir de la fotografía de la protoboard del punto 1 y del esquema eléctrico del punto 2
6. Programas/*
Control de semáfofo temporizado con pulsador
El peatón debe presionar un pulsador para solicitar paso.
Entonces, el semáforo corta el paso a los automóviles y
da paso a los peatones.
Fecha: 06/05/2015
Licencia: GPLv3 http://www.gnu.org/licenses/gpl.txt
Web page: www.picuino.com/foro
*/
/*************************************************************
DEFINICIÓN DE CONSTANTES
*************************************************************/
// Definición de pines
const int led_verde_auto = 13;
const int led_ambar_auto = 12;
const int led_rojo_auto = 11;
const int led_verde_peaton = 10;
const int led_rojo_peaton = 9;
const int pin_pulsador = 8;
// Tiempo mínimo que permanecerá en verde el semáforo para automóviles
const int tiempo_minimo_verde_auto = 7000;
/*************************************************************
FUNCIONES AUXILIARES DEL PROGRAMA
*************************************************************/
//
// Inicializa semáforo. Verde para automóviles
//
void semaforo_init(void) {
// Enciende el led verde para automóviles. Apaga los demás leds
digitalWrite(led_verde_auto, HIGH);
digitalWrite(led_rojo_auto, LOW);
digitalWrite(led_ambar_auto, LOW);
// Enciende el led rojo para peatones. Apaga los demás leds
digitalWrite(led_rojo_peaton, HIGH);
digitalWrite(led_verde_peaton, LOW);
}
//
// Cambia el semáforo de automóviles a rojo
//
void semaforo_auto_rojo(void) {
// Apaga el led verde para coches
digitalWrite(led_verde_auto, LOW);
// Enciende el led ambar para coches y parpadea 3 veces
for(int i=4; i>0; i--) {
delay(500);
digitalWrite(led_ambar_auto, HIGH);
delay(500);
digitalWrite(led_ambar_auto, LOW);
}
// Enciende el led rojo para coches
digitalWrite(led_rojo_auto, HIGH);
}
//
// Espera a que se presione el pulsador
//
void semaforo_espera_pulsador(void) {
int presionado;
long time;
// Espera a que se presione el pulsador
// Debe permanecer esperando un tiempo mínimo
time = millis() + tiempo_minimo_verde_auto;
presionado = 0;
while(1) {
// Lee el estado del pulsador
if (digitalRead(pin_pulsador) == LOW)
presionado = 1;
// Si ha pasado el tiempo de verde para coches
// y se ha presionado el pulsador, salir
if ((millis() > time) && (presionado == 1))
break;
}
}
//
// Espera un tiempo que depende del potenciómetro
//
void semaforo_delay(void) {
int tiempo_peatones;
// Calcula el tiempo de espera.
// 2 segundos más el tiempo que añada el potenciómetro
tiempo_peatones = 2000 + 5 * analogRead(A0);
// Envía por el puerto serie el tiempo de espera
Serial.print("Tiempo peatones=");
Serial.println(tiempo_peatones);
// Espera
delay(tiempo_peatones);
}
//
// Cambia el semáforo de peatones a rojo
//
void semaforo_peatones_rojo(void) {
// Parpadea el led verde 3 veces
for(int i=3; i>0; i--) {
digitalWrite(led_verde_peaton, LOW);
delay(500);
digitalWrite(led_verde_peaton, HIGH);
delay(500);
}
// Enciende el led rojo para peatones y apaga el verde
digitalWrite(led_verde_peaton, LOW);
digitalWrite(led_rojo_peaton, HIGH);
}
/*************************************************************
FUNCIONES PRINCIPALES DEL PROGRAMA
*************************************************************/
//
// Inicialización del programa
//
void setup() {
// Define las salidas de Arduino
pinMode(led_verde_auto, OUTPUT);
pinMode(led_ambar_auto, OUTPUT);
pinMode(led_rojo_auto, OUTPUT);
pinMode(led_verde_peaton, OUTPUT);
pinMode(led_rojo_peaton, OUTPUT);
// Define las entradas con resistencia de Pull-up
pinMode(pin_pulsador, INPUT_PULLUP);
// Inicializa el puerto de comunicaciones
Serial.begin(9600);
Serial.println("Semaforo en marcha");
}
//
// Programa principal
//
void loop() {
// Inicializa semáforo. Verde para automóviles
semaforo_init();
// Espera a que se presione el pulsador
semaforo_espera_pulsador();
// Cambia el semáforo de automóviles a rojo
semaforo_auto_rojo();
// Espera antes de permitir paso a peatones
delay(1500);
// Enciende el led verde para peatones
digitalWrite(led_rojo_peaton, LOW);
digitalWrite(led_verde_peaton, HIGH);
// Espera un tiempo que depende del potenciómetro
semaforo_delay();
// Cambia el semáforo de peatones a rojo
semaforo_peatones_rojo();
// Espera antes de permitir el paso a los automóviles
delay(2000);
// Comienza un nuevo ciclo
}
7. Ajustes y puesta en marchaa. Se debe ajustar el potenciómetro para conseguir que el led verde para peatón permanezca encendido el tiempo deseado.
b. Se puede ajustar el tiempo mínimo que permanece encendido el led verde para automóviles, dentro del programa en la definición de constantes.