Paso 2: La prueba real: ¿Qué tan preciso es un arduino uno / ESP8266 sin RTC?
"Pero el arduino uno / ESP8266 / Wemos es inexacta sin RTC y necesito precisión por encima de todo!"-dice el escéptico. Casi todos arduino reloj instructables por lo tanto cuentan con una unidad RTC, aunque nunca se va a apagar y no requieren el función de respaldo.
Así también estaba escéptico. Pero yo estaba frustrado con aplicaciones de internet complejamente codificados, voluminosas unidades RTC, librerías que no eran compatible universalmente y frustrados con la sloppyness de todo. Así que escribí mi propio boceto para mantener el tiempo que trabaje en cualquier microcontrolador compatible con arduino. El bosquejo se basa solamente en la función millis(). Esta función funciona en cualquier microcontrolador, y todo lo que hace es contar los milisegundos que han transcurrido desde su última puesta a cero. Usted encontrará el bosquejo a continuación incluso comentarios explaing todo y os lo adjunto también en este instructable en un archivo separado .ino. Es suciedad fácil de hacer si sigues mis comentarios y fácilmente podrás hacer tu propia versión personalizada basada en su tiempo manteniendo las necesidades:
Escrito por Ruben Marc Speybrouck
timeNow larga sin signo = 0;
timeLast largo sin signo = 0;
Hora de inicio de configuración:
int startingHour = 12;
su hora de partida aquí, no abajo en horas de int. Esto asegura la corrección diaria precisa de tiempo
int segundos = 0;
int minutos = 33;
horas de int = startingHour;
días de int = 0;
Configuración de precisión
medailyErrorFast nt = 0; / / establecer el número de milisegundos de tiempo de su microcontrolador es rápido sobre una base diaria promedio
int dailyErrorBehind = 0; establecer el número de milisegundos de que tiempo de su microcontrolador está detrás de un diario promedio
int correctedToday = 1; cambiar esta variable, se entiende que el tiempo ya ha sido corregido hoy para el error en tu cristal de tableros. Esto es cierto para el primer día porque sólo tienes que configurar el tiempo de cuando subiste el bosquejo.
void setup() { / puso su código de instalación, para ejecutar una vez:
Serial.Begin(9600); }
void loop() { / / Pon tu código principal, para ejecutar varias veces:
timeNow = millis () / 1000; el número de milisegundos que han transcurrido desde el inicio
segundos = timeNow - timeLast;
el número de segundos que han transcurrido desde que se llegó a la última vez que 60 segundos.
Si (segundos == 60) {}
timeLast = timeNow;
minutos = minutos + 1; }
Si ha pasado un minuto, empezar a contar milisegundos desde cero otra vez y añadir un minuto en el reloj.
Si (minutos == 60) {}
minutos = 0;
horas = horas + 1; }
Si ha pasado una hora, empezar a contar los minutos desde cero y añadir una hora al reloj
Si (horas == 24) {}
horas = 0;
días = días + 1;
}
Si han pasado 24 horas, añadir un día
Si (horas == (24 - startingHour) & & correctedToday == 0) {}
Delay(dailyErrorFast*1000);
segundos = segundos + dailyErrorBehind;
correctedToday = 1; }
cada vez que han pasado 24 horas desde la hora inicial y no ha sido restablecer este día antes, añadir milisegundos o retrasar el programa con algunos milisegundos.
Cambiar esas varialbes según el error de la tabla.
Es la única manera de averiguar cómo lejos el reloj interno de tableros, por subir este bosquejo en exactamente el mismo tiempo que el tiempo real, dejándola correr por unos días
y entonces determinar cuantos segundos lentos y rápidos el reloj interno de tableros en un promedio diario. (24 horas).
Si (horas == 24 - startingHour + 2) {}
correctedToday = 0; }
saber el boceto que ha comenzado un nuevo día para qué corregir problemas, si esta línea no era aquí el arduiono / / seguiría corregir toda una hora que sea 24 - startingHour.
Serial.Print ("el tiempo es:");
Serial.Print(Days);
Serial.Print(":");
Serial.Print(hours);
Serial.Print(":");
Serial.Print(minutes);
Serial.Print(":");
Serial.println(seconds);
}
Funcionó el código en un wemos D1 y un arduino uno. Configurar el tiempo igual con el tiempo de:http://www.timeanddate.com/ día cero de la medianoche (obviamente no tienes que comenzar a la medianoche!-incluí código determinado tiempo sobre instalación de vacío). Después de un día y 9 horas la diferencia entre el tiempo en mi microcontroladores y este sitio web fue aproximadamente un segundo. He comprobado esto tomando una captura de pantalla de mi monitor serial en un lado de la pantalla y tener la página abierta en el otro lado. (ver foto).
Después de 3 días, en mi arduino y wemos el reloj fue rápido aproximadamente de 2 a 2,5 seg. es de 274 segundos un año o poco más de cuatro y medio minutos. 'S inaceptable!!!!!! No, no es realmente. Acaba de agregar una línea de código a mi bosquejo que corrige la hora en mi microcontroladores retrasando el programa solo un poco cada 24 horas o mediante la adición de unos pocos milisegundos cada día. En mi caso aproximadamente 0,75 segundos cada día. Y ahí lo tienen, a largo plazo cerca de timekeeping segundo exacto con ninguna queja sobre cualquier junta!
Aquí está el código de corrección de todos juntos en la práctica una vez más así que fácilmente podía ver la imagen completa
Configuración de precisión
int dailyErrorFast = 0; establece el número promedio de milisegundos de tiempo de su microcontrolador es rápido en un diario base int dailyErrorBehind = 0; / / establecer el número promedio de milisegundos de tiempo de su microcontrolador está detrás en un diario base int correctedToday = 1; / / no cambiar esta variable, uno significa que el tiempo ya ha sido corregido hoy para el error en tu cristal de tableros. Esto es cierto para el primer día porque sólo tienes que configurar el tiempo de cuando subiste el bosquejo.:
Si (horas == (24 - startingHour) & & correctedToday == 0) {} Delay(dailyErrorFast*1000);
cada vez que han pasado 24 horas desde la hora inicial y no ha sido restablecer este día antes)
Si (horas == 24 - startingHour + 2) {correctedToday = 0;}
saber el boceto que ha comenzado un nuevo día para qué corregir problemas, si esta línea no era aquí el arduiono
continuaría a corregir para una hora entera que es 24 - startingHour.