Alarma casera: lio con millis y SIM900

Hola y gracias de antemano por vuestro apoyo. Sin vosotros este proyecto jamás saldría adelante
Para una casa de campo me estoy montando un sistema de alarma compuesto por un arduino uno R3 y una SIM900. El sistema está funcionando en pruebas y completado al 90%

Pero tengo 2 dudas. La primera es con el SIM900. ¿Como cuento cuantos tonos de llamada ha realizado al llamar arduino? Resulta que para saber que el sistema a atendido mi petición vía SMS de cambiar algo (parar/encender zonas, alarma, etc) debe realizar una llamada perdida al teléfono autorizado y la única forma de asegurar que hace la llamada perdida es esperar 10 segundos (malas coberturas) y a veces, en ese tiempo, ha sonado 5 o 6 veces o 1. ¿Hay alguna forma de contar o ajustar a 3, 2… tonos? Reitero que es contar tonos de llamada saliente y no me refiero a los RINGs entrantes

Y la segunda es con millis(). Como sabréis, el long de millis dura alrededor de 50 días y vuelve a 0. Y ahí es donde tengo el lio
En mi sistema, y por culpa de las operadoras, he hecho una función para que cada 50 días (vuelta entera de millis) envíe un SMS para evitar que la tarjeta sim no sea bloqueada. Esos 50 días empiezan a contar desde el ultimo SMS enviado. El proceso parece sencillo, pero hay que tener en cuenta que la duración de cada loop() puede variar de entre 3 segundos a 15 segundos (llamada perdida incluida) por lo cual quiero dar un margen de ±10 segundos (20 en total) para que envíe el SMS “antibloqueo”

Hasta ahora tengo esto:

tiempo=millis();

if(tiempo>=ult_SMS-MARGEN && tiempo<=ult_SMS+MARGEN){ // le damos un margen de (MARGEN) +-10000 (20 segundos) 
    inGSM=TEL+" ESTADO"; // enviar un 'estado' si han transcurrido +-50 días desde el ultimo SMS
    }

Pero como podréis adivinar, si millis() pasa por 0 se fastidia el invento
Lo que hice fue comprobar si millis estaba cercano a cambiar a 0 en el momento de enviar el último SMS

ult_SMS=millis();//ultimo SMS enviado
  ult_SMS-=MARGEN; // descontar MARGEN para no igualar a millis()

//comprobar que dentro del MARGEN millis() no pasa a 0
  while(ult_SMS+MARGEN<ult_SMS) 
      ult_SMS-=MARGEN; // añadir el segundo MARGEN

Pero tengo dudas. Y estas dudas se extienden a todos los millis(), que son muchos los contadores de trabajan en este sistema

Espero que me tiréis un cable pero, de todos modos, os adelanto las gracias

Saludos

PD:error mio. He modificado la linea if(ult_SMS+MARGEN<ult_SMS) por while