Paso 4: Tiempo de mantenimiento de la
Seguimiento de tiempo que utilicé solamente el arduino y el arduino estándar función millis(). Este método no será completamente exacto, ya que el oscilador de cristal de 16Mhz, que decide la frecuencia de reloj de la CPU de arduinos, probablemente no será exactamente de 16 000 000 Hz. La buena noticia es que puede medir cómo inexacta su reloj es y compensar en el código, porque la compensación debe ser constante durante un período determinado de tiempo.Medir cómo inexacta tu arduino es:
Como decía anteriormente, el arduino tiene un pequeño error, este error depende del oscilador de cristal y será diferente para cada arduino, para medir cuánto mi reloj de arduino se diferenció de la hora correcta, programé que imprime el tiempo (la hora, minuto y segunda variables) vía serie. Luego déjela funcionar durante un largo tiempo (más de noche y más) y en comparación con el tiempo de arduino con el reloj que supe que era exacta, en el inicio y el final de mi período de medición. Dividir la diferencia de tiempo con el tiempo que la prueba se tomó para calcular el error cada hora. Encontré que mi arduino es 0,4 segundos a ayunar cada hora. Utilicé exacttimenow.com para obtener la hora exacta, pero si tienes un reloj, que sabes es muy exacto, no dude de utilice en su lugar.
El código que usé para mantener el tiempo es una adaptación de código que encontré en los foros de arduino. Reescrito con declaraciones de if en vez de división y modulo, para ver si habría alguna diferencia de velocidad y encontró que la versión de if es más de 15 veces más rápida (aunque ambos son todavía bastante rápido, información sobre la prueba aquí).
Ya que quiero las otras cosas en mi bucle principal (como comprobar el sensor de contacto, para pulsar un botón, etc.) para pasar tan a menudo como sea posible, utilicé la versión más rápida.
El código:
Cada vez que la función del reloj se llama le añade el tiempo en milisegundos desde última se llamó a una variable m, cuando ha pasado un segundo (m > 999) la segunda variable se incrementa en uno y es poner. Cuando la variable segundos llega a 60, la variable minuta se incrementará en uno, y segundos se pondrá a cero. Lo mismo sucede con la variable de minutos; Cuando llegue a 60, añadir 1 a horas y minutos de restablecer. La variable de la hora se restablecerá cuando llega a 24.
Para compensar que mi arduino es 0,4 segundos más rápido cada hora, disminuir a los segundos con dos segundos cada hora Quinta.
____________________________________________________________________ // CLOCK VARIABLES: void clock() // CLOCK VARIABLES: void clock()
The clock() function:
#define MAX_MILLIS_VALUE 34359738
unsigned long current_millis_value = 0;
unsigned long previous_millis_value = 0;
unsigned long m = 0;
int seconds = 0;
int minutes = 0;
int hours = 0;
{
current_millis_value = millis();
if (current_millis_value < previous_millis_value) // if millis overflows
{
m += MAX_MILLIS_VALUE - previous_millis_value + current_millis_value;
}
else // if millis has not overflown
{
m += current_millis_value - previous_millis_value;
}
if (m>999)
{
seconds++;
m = m-1000;
}
if (seconds>59) // if seconds == 60
{
minutes++;
seconds = 0;
}
if (minutes>59) // if minutes == 60
{
hours++;
minutes = 0;
if(hours%5==0) // adjust the time with -2 seconds every 5th hour.
seconds = seconds - 2; // this will cause seconds to be -2,
// therefore seconds can't be unsigned.
}
if (hours>23) // if hours == 24
{
hours = 0;
}
The clock() function:
#define MAX_MILLIS_VALUE 34359738
unsigned long current_millis_value = 0;
unsigned long previous_millis_value = 0;
unsigned long m = 0;
int seconds = 0;
int minutes = 0;
int hours = 0;
{
current_millis_value = millis();
if (current_millis_value < previous_millis_value) // if millis overflows
{
m += MAX_MILLIS_VALUE - previous_millis_value + current_millis_value;
}
else // if millis has not overflown
{
m += current_millis_value - previous_millis_value;
}
if (m>999)
{
seconds++;
m = m-1000;
}
if (seconds>59) // if seconds == 60
{
minutes++;
seconds = 0;
}
if (minutes>59) // if minutes == 60
{
hours++;
minutes = 0;
if(hours%5==0) // adjust the time with -2 seconds every 5th hour.
seconds = seconds - 2; // this will cause seconds to be -2,
// therefore seconds can't be unsigned.
}
if (hours>23) // if hours == 24
{
hours = 0;
}
previous_millis_value = current_millis_value;
}
previous_millis_value = current_millis_value;
}
______________________________________________________________________