Te he hecho una pequeña clase para que puedas controlar que haya transcurrido la cantidad arbitraria de días que quieras. Puedes usarla para controlar otras unidades de tiempo que no sean días.
const unsigned long UN_SEGUNDO = 1000UL;
const unsigned long UN_MINUTO = 60000UL;
const unsigned long UNA_HORA = 3600000UL;
const unsigned long UN_DIA = 86400000UL;
// Clase para controlar la cantidad de "unidades" de tiempo transcurrida
class Transcurrido {
public:
// Constructor de la clase, indicar la unidad de tiempo en milisegundos
Transcurrido(unsigned long unidad) : cantidad(0), unidad(unidad), t(millis()) {}
// Pone el conteo a cero
void clear() {this->cantidad = 0;}
// Obtiene el valor del conteo
uint32_t getCantidad() {
unsigned long ahora = millis();
while ((ahora - this->t) >= this->unidad) {
this->cantidad++;
this->t += this->unidad;
}
return this->cantidad;
}
private:
uint32_t cantidad;
unsigned long unidad;
unsigned long t;
};
Transcurrido diasTranscurridos(UN_DIA); // Lo definimos para que nos cuente días (UN_DIA = 86400000UL milisegundos)
void setup() {
Serial.begin(9600);
}
void loop() {
if (diasTranscurridos.getCantidad() >= 10) { // Si ha transcurrido 10 días o más
Serial.println(F("Han transcurrido 10 días"));
diasTranscurridos.clear(); // Ponemos a cero el contador
}
}
He puesto un ejemplo de 10 días, pero si en Transcurrido diasTranscurridos(UN_DIA); se cambia UN_DIA por UN_SEGUNDO, se podrá probar que el mensaje sale cada diez segundos.
No olvidarse de llamar a diasTranscurridos.clear() para poner el contador a cero. Se puede llamar a diasTranscurridos.clear() en cualquier momento que se quiera volver a empezar la cuenta. Esto se puede aprovechar para poner a cero la cantidad de días cuando se manda un SMS por cualquier motivo, antes de que se cumplan los días que quieres. Así se mandaría el SMS sólo si han transcurrido X días sin mandar ningun SMS de cualquier tipo. Ojo, si el Arduino se apaga o se resetea, la cuenta se pone a cero.
Si se emplease para controlar segundos, hay que tener en cuenta que si se llama a .getCantidad() en intervalos mayores a un segundo, las cantidades que retorna podrían no ser consecutivas. Por eso la comparación ha de ser >=.