Tengo un funcion que por comunicacion serial pide una sola vez la variable epoch que son los segundos desde 1970 hasta ahora, luego con timeLib lo convierto para saber la hora, minutos, y seguundos, mi problema es que luego de hacer la peticion quiero poder que el arduino siga contando y sumando a epoch para no saturar el servidor NTP que es de donde la obtengo
void obtenerHora() {
if (epoch == 0) {
Serial1.print(2);
if (Serial1.available() > 0) {
String data = Serial1.readString();
epoch = data.toInt();
}
} else {
epoch += millis()/1000; // aca esta mi problema lo que pasa es que al hacer esto mi causa error y la hora minutos y segundos toman valores erroneos
}
// estas variables son globales estan definidas fuera de la funcion
Hr = hour(epoch) - 3;
mins = minute(epoch);
secs = second(epoch);
}
Su función es incorrecta, toma el valor de milis completo y lo divide por 1000. Entonces obtiene el tiempo desde el controlador reset, pero necesita el tiempo desde la respuesta del NTP.
Debe recordar el valor de milis en el momento en que obtiene el tempo del NTP y luego calcular la diferencia entre los milis actuales y el valor memorizado
void obtenerHora() {
static uint32_t prev_millis =0;
if (epoch == 0) {
Serial1.print(2);
if (Serial1.available() > 0) {
String data = Serial1.readString();
epoch = data.toInt();
prev_millis = millis();
}
} else {
epoch += (millis()- prev_millis)/1000; // aca esta mi problema lo que pasa es que al hacer esto mi causa error y la hora minutos y segundos toman valores erroneos
}
Gracias por tu aporte pero lastimosamente acabo de probarlo y no soluciona, los segunbdos aumentan de una forma exageradamente alta, y en consecuencia los minutos y la hora
¿No has probado crear un RTC virtual con RTClib que no solo sirve para manejar RTC "reales"?
Puedes cargar la hora en formato epoch y de lo demás se encarga la librería.
De todos modos recuerda que la precisión del cristal del arduino es "más o menos" así que cada tanto tendrías que volver a consultar el servidor para ajustar la hora.
Agrego porque me fui de tema...
La instrucción correcta debería ser
new_epoch = epoch + (millis()- prev_millis)/1000;
O sea, mantienes de base la hora epoch que ingresaste y le sumas los segundos transcurridos desde el ingreso pero en una nueva variable de trabajo.
https://www.prometec.net/ntp/
Ya que no has puesto todo el código supongamos que este fuera el caso.
Aca le envian un paquete cada 1 seg y claramente el servidor puede con eso.
Podrias tener un RTC virtual como te dice @anon90500195 y ajustarlo cada X tiempo. Millis() no es la panacea pero si lo corriges cada 10 min seguramente estarás mas que bien.