Buenas noches, soy nuevo en arduino y estoy super atorado con algo sencillo que no me deja terminar un proyecto de semaforo automatico, lo que hace mi codigo es que que va a encender un par de lamparas y hacer sona una bocina, dependiendo el estado de 2 sensores, el primero hace que parpadee un luz roja y el segundo sensor hace que la misma luz roja se quede encendido y a su vez haga sonar una bocina por 1500 milisegundos, el detalle que tengo es que todo corre bien solo que la bocina se queda sonando y no se detiene hasta que el sensor deja de activarse, me podrian apoyar por favor, este seria el codigo, les agradezco su orientacion, gracias.
int sen1 = 0;
int sen2 = 0;
int unnamed = 0;
void setup()
{
pinMode(10, INPUT);
pinMode(9, INPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
}
void loop()
{
// Leer sensores
sen1 = digitalRead(10);
sen2 = digitalRead(9);
if (sen1 == LOW && sen2 == LOW) {
digitalWrite(13, HIGH);
} else {
if (sen1 == HIGH && sen2 == LOW) {
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
delay(500); // Wait for 500 millisecond(s)
digitalWrite(12, LOW);
delay(500); // Wait for 500 millisecond(s)
} else {
if (sen1 == HIGH && sen2 == HIGH) {
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
if (sen2 == HIGH) {
digitalWrite(11, HIGH);
delay(1500); // Wait for 1500 millisecond(s)
digitalWrite(11, LOW);
}
}
}
}
}
Una posible solución (de paso acomodé un poco tu código)
int sen1 = 0;
int sen2 = 0;
int sen2ant = 0;
int unnamed = 0;
void setup()
{
pinMode(10, INPUT);
pinMode(9, INPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
}
void loop()
{
// Leer sensores
sen1 = digitalRead(10);
sen2 = digitalRead(9);
if (sen1 == LOW) {
if (sen2 == LOW) {
digitalWrite(13, HIGH);
}
} else { // sen1 == HIGH
if (sen2 == LOW) {
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
delay(500); // Wait for 500 millisecond(s)
digitalWrite(12, LOW);
delay(500); // Wait for 500 millisecond(s)
} else { // sen2 == HIGH
if (sen2 != sen2ant) { // si sen2 cambió de estado (de LOW a HIGH )
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
delay(1500); // Wait for 1500 millisecond(s)
digitalWrite(11, LOW);
}
}
}
sen2ant = sen2;
}
Agregué una variable sen2ant que guarda el último estado de sen2.
Así el sonido solo se ejecuta cada vez que sen1 sea HIGH y sen2 sea HIGH pero antes haya sido LOW. De este modo deja de sonar después de 1.5 seg aunque el sensor siga activado.
Fíjate si te sirve.
Por otro lado, sería buena idea ponerle nombre a los pines e incluso comentar a que se conecta, te aseguro que te facilita mucho entender y mantener el código.
Por ej.
const int PIN_SEN1 = 10; // pin conectado al sensor xxxxx
const int PIN_SEN2 = 9; // pin conectado al sensor yyyyy
// ...
pinMode(PIN_SEN1, INPUT);
pinMode(PIN_SEN2, INPUT);
// ...
// Leer sensores
sen1 = digitalRead(PIN_SEN1);
sen2 = digitalRead(PIN_SEN2);
no, si estube revisando las conecciones y realice pruebas varias veces y siempre se activa la bocina y se queda pegado, en la simulacion corre sin tema pero ya en fisico hace eso
Sube un esquema de las conexiones (puede ser hecho a mano, lo importante es que se entienda)
así lo vemos.
Además, si puedes agregar un par de fotos del montaje también pueden ser de ayuda.
Los optoaislados que conozco activan con LOW entonces es claro que va a quedar activo si
digitalWrite(11, HIGH); // acá lo está desactivando
delay(1500); // Wait for 1500 millisecond(s)
digitalWrite(11, LOW); // acá lo activa y queda activado
Tienes que invertir los estados
digitalWrite(11, LOW);
delay(1500); // Wait for 1500 millisecond(s)
digitalWrite(11, HIGH);
Pero revisa los demás porque deberían presentar el mismo problema, estarían trabajando al revés.
pues encontre que si se pegaba cuando arrancaba el arduino y de ahi se quedaba pegado, y tube que hacer otros arreglos para que se desabilitara, aun que si tube que colocarlo como lo mencionaste y al parecer si quedo, aunque cuando enciendo el arduino una primera vez se enclava la bocina, y hasta queno hago el circuito completo del proyecto se deshabilita, y ya de ahi funciona sin tema, te gradezco mucho tu apoyo
También podrías probar poniendo resistencias de 10K entre 5V y cada uno de esos pines, para asegurar el estado alto a las entradas de los relés en el momento de dar alimentación.