Go Down

Topic: Problema con el bucle infinito del void loop (Read 118 times) previous topic - next topic

joselo77

Hola muy buenos días, no soy experto en esto y por eso recurro a ustedes, me encuentro en un dilema al cual no se como darle solución.

Estoy trabajando con un Sim800L el cual me enviara un sms cuando una entrada digital del arduino detecte el estado HIGH accionado por un sensor, es decir digitalRead(10; HIGH); enviara el sms, caso contrario no obviamente. Ahora el problema es que el sensor permanecerá todo el tiempo activado (podría estar días) entonces como el loop es repetitivo el Sim800L me estaría enviando sms todo el tiempo y eso es lo que quiero evitar, es decir quiero que solo me envie un solo sms aunque el pin 10 siga en HIGH. Si pudieran orientarme de como solucionar esto por favor, cualquier idea, recomendación o critica es aceptable. Gracias.   

noter

La pregunta que formulas es bastante recurrente en los que se inician en programación. Ya has descubierto que el arduino es "tonto" y que no es capaz de entender la obviedad de que con un SMS vale. Sencillamente sigue haciendo lo ordenado sin parar como el conejito de las pilas:
Code: [Select]

if (digitalRead (10)==HIGH) {
     sendSMS();
}


Ahora debes explicárselo para "tontos". Por ejemplo:

Code: [Select]

if (digitalRead (10)==HIGH) {
     sendSMS();
     while (digitalRead(10)==HIGH); //Bucle vacío. No hace nada mientras siga en HIGH.
}



Habría otras formas más elaboradas de decirle cúando enviar el SMS, además de cuando esté el pin en HIGH. Por ejemplo, si ha pasado al menos un tiempo determinado desde el último SMS.

surbyte

Para mi lo mas facil es ver el cambio de estado y eso asegura que lo envía una sola vez.
Para ver el cambio de estado debes usar una variable que guara el estado anterior.

ejemplo:

En la definición de variables pones

Code: [Select]
bool estadoActual, estadoAnterior = false;


en el loop escribes


 
Code: [Select]

   void loop() {
    estadoActual = digitalRead(10);
    if (estadoActual == HIGH && !estadoAnterior == LOW) { // responde a un cambio 0 a 1
        SendSMS();   // solo lo hace una vez.
    }
    estadoAnterior = estadoActual;    // guardo el estado actual en la variable Anterior
 (/code]


Si la comparación fuera a la inversa o sea ver la transición 1 a 0, inviertes la consulta

Go Up