¿como terminar un comando dentro de un loop?

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);

muchas gracias por el apoyo, lo pongo en practica y te comento @MaximoEsfuerzo

funciono muy bien, gracias por el apoyo, te lo agradezco, saludos. @MaximoEsfuerzo

Genial. Si querés marcá el post #2 como solución.
Saludos

hola que crees que ya aplicandolo en fisico, se activa la bobina de la bocina, y se queda encendida

¿No la habrás conectado al pin 12 en lugar del 11?

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.




¿Esos módulos de relé activan con HIGH o con LOW?

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

Agrega en setup()

digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);

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.

ok lo considero muchas gracias

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.