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.
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:
if (digitalRead (10)==HIGH) {
sendSMS();
}
Ahora debes explicárselo para "tontos". Por ejemplo:
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.
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
bool estadoActual, estadoAnterior = false;
en el loop escribes
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