¡Hola! Somos tres estudiantes de diseño empezando a programas y a usar Arduino, y tenemos una duda sobre la programación de nuestro proyecto.
El trabajo consiste en hacer un semáforo con tres leds (rojo, verde y amarillo) en la placa base y sus respectivas resistencias, todos conectados a diferentes pines. El trabajo también tiene un pulsador y un zumbador, también conectados a pines.
Supuestamente, el semáforo (que es visible para los coches) tiene que estar en verde todo el rato hasta que el pulsador es pulsado (valga la redundancia), entonces con if se inicia un loop en el que se enciende el ámbar para los coches durante unos instantes y luego se enciende el rojo 30 segundos. Hasta aquí todo bien. Nuestro problema es que queremos que mientras el semáforo rojo está encendido, el zumbador haga un sonido intermitente (que sería lo que oirían los peatones). Lo hemos probado a hacer con while, haciendo que el estado del led sea una variable, y dependiendo de si está encendido o apagado que se inicie el while. Hemos conseguido que el while funcione mientras el rojo está encendido, pero no conseguimos que se apague para que el loop empiece otra vez con el semáforo en verde. Le hemos probado a poner un Delay después del loop y después un digitalWrite LOW en el pin del led rojo, pero nada, sigue infinitamente.
Este es nuestro código con las aclaraciones sobre los pines, etc.
void setup()
{
pinMode(5, OUTPUT); // marcar como salida el led verde
pinMode(6, OUTPUT); // marcar como salida el led ámbar
pinMode(7, OUTPUT); // marcar como salida el led rojo
pinMode(8, INPUT); // marcar como entrada el pulsador
pinMode(4, OUTPUT); // marcar como salida el zumbador
}
void loop()
{
digitalWrite (5, HIGH);
int estado_pulsador = digitalRead (8); // declaramos una variable con el estado del pulsador
if (estado_pulsador == HIGH) // si el pulsador es pulsado, realiza la siguiente acción
{
digitalWrite(5, LOW); // se apaga el led verde para los coches
digitalWrite(6, HIGH); // empieza el amarillo, avisando de que cambiará a rojo
delay(3000);
digitalWrite(6, LOW);
digitalWrite(7, HIGH); // se enciende el rojo
int estado_led = digitalRead (4);
while (estado_led = 1)
{
digitalWrite(4, HIGH);
delay (1000);
digitalWrite(4, LOW);
delay (1000);
}
}
}
Sabemos que hay maneras más sencillas de hacerlo simplemente diciéndole al zumbador que suene y deje de sonar durante un segundo y repetir eso hasta llegar a los 30 segundos que pretendemos que el semáforo esté en rojo, pero la verdad es que programar esto nos está gustando y ya es por pura curiosidad de poder hacer algo guay y aprender de ello.
Si alguien pudiera ayudarnos, ¡sería genial!
Un saludo, Marta, Pablo y Sara.