Autor Tema: Semáforo para automóviles y peatones controlado por pulsador  (Leído 17773 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Carlos

  • Moderador Global
  • ****
  • Mensajes: 294
1. Descripción
En 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ánicos
Este proyecto no tiene planos mecánicos


4. Listado de componentes
Código: [Seleccionar]
2  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

Código: (Arduino) [Seleccionar]
/*
   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 marcha

a. 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.



« Última modificación: 02/Dic/2015, 17:07:21 pm por Carlos »

Carlos

  • Moderador Global
  • ****
  • Mensajes: 294
Re:Semáforo para automóviles y peatones controlado por pulsador
« Respuesta #1 en: 02/Jun/2015, 21:14:08 pm »
Video del proyecto funcionando:

https://www.youtube.com/watch?v=3dGjZMrAW6E
« Última modificación: 25/Ago/2019, 12:21:37 pm por Carlos »

Isa

  • Freshie
  • *
  • Mensajes: 1
Re:Semáforo para automóviles y peatones controlado por pulsador
« Respuesta #2 en: 31/Ago/2015, 12:18:23 pm »
a. Se debe ajustar el potenciómetro para conseguir que el led verde para peatón permanezca encendido el tiempo deseado.

¿Hacia dónde hay que girar para que aumente el tiempo?

Carlos

  • Moderador Global
  • ****
  • Mensajes: 294
Re:Semáforo para automóviles y peatones controlado por pulsador
« Respuesta #3 en: 31/Ago/2015, 12:22:02 pm »
Depende de cómo se monte el cableado.
Girando hacia el cable que está conectado a positivo (5 voltios) el tiempo aumenta.
Girando hacia el cable que está conectado a negativo (GND o masa) el tiempo disminuye.

En el montaje de la fotografía el tiempo aumenta girando hacia la derecha (sentido horario)

Un saludo.