Yo creo que el modo de programación que estas usando puedo generarte problemas en algún momento del que te va a costar salir.
O sea que simplemente estas programando mal y es lógico que asi sea cuando estas haciendo tus primeros programas.
A mi me llevó un buen tiempo leyendo foros en inglés cuando vi en muchos comentarios que les decían..
tu problema es el delay()
tu problema es el delay()
tu problema es el delay()
.
.
tu problema es el delay()
imagina que esos fueron 100 hilos diferentes.
Entonces cómo se resuelve... ahhh => no uso UN SOLO DELAY y en su lugar millis()
Pero... millis() no funciona como delay(). Claro que no!! no puedes reemplazar uno por otro tal como estaba tu código anterior. Ni por asomo, son intercambiables.
Es y resulta muy dificil cambiar del modo delay() al modo millis(). Creo que mas dificil es hacerlo en la cabeza que en otro sitio.
Por eso te sugerí que lo practiques por fuera de este sketch.
Casi todo lo que veo en tu programa tiene delay() de 100mseg como mínimo a 1 y 2 seg o mas (encontré uno de 25 seg).
Como pretendes aplicar millis() y que funcione como quieres? Es imposible.
Para usar millis() no debe haber ninguna interrupción o programa bloqueante, por eso se habla de códigos non-blocking que no interrumpen el flujo del programa.
Por eso te sugerí que vieras ejemplos donde cuando le envías una petición al SIM900 este responde via comandos y tu te quedas a la espera de dicha respuesta pero mientras puedes hacer otras cosas dando la sensación de tener la bendita multitarea.
Si solo se trata de programar de otro modo.
Sigue tal como estas, intenta no usar delay() que bloqueen demasiado el código, ve liberando su uso. Ejemplo
si necesitas un delay(2000) divídelo en delay(100) y ve contando 20 veces y durante éstos, puedes prestar atención a otra cosa.
Me gustaría mostrarte como hacerlo pero una buena inspección de tu código me hace ver que esta lleno de dela() que bloquean todos los caminos.
El loop general parece estar bien pero cuando se activa una zona me encuentro con
void activate_ALERT(String zona){
//
delay(25000);
//
}
25 seguntos detenidos. Acá compruebas porque falla millis().
Ademas esta el llamado a SensSMS que incluye mas delay(), 500 solo a llegar a sendSMS y otros 500 al updateSerial o sea 1 segundo mas.
Todo eso hay que desarmarlo para que se libere los tiempos muertos.
Se debe trabajar en cada rutina para que funcione sin bloquearse o sea devolviendo el control hasta que un determinado evento se cumpla y quede resuelto lo que se le pidió.
Es como si fueras un profesor y le dices a 5 alumnos hagan una tarea pero no te quedas con el primero hasta que la termine sino que les dices.. cuando alguno termine levante la mano (bandera o flag) y me avisa.. entonces hago lo que debo hacer.
Bien, tanto comentario y no extraes nada positivo o tal vez si.
Cuando quieras hacer la versión 2.0 hablamos.