Despertador binario de Arduino (4 / 16 paso)

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.

____________________________________________________________________

The clock() function:

// CLOCK VARIABLES:
#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;

void clock()
{
  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:

 

// CLOCK VARIABLES:
 #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;

 

void clock()
 {
   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;
}

______________________________________________________________________

Artículos Relacionados

¿Arduino despertador binario (bolsillo)

¿Arduino despertador binario (bolsillo)

Ever quería un despertador binario? Yo también. Así que miré a mi alrededor en Instructables, porque hay muchos buenos alrededor.Lo que es aún mejor: están basados en Arduino, uno de mis juguetes favoritos.Mi favorito es este: Me inspiró mucho y sí t
Cwik Clock v1.0 - un reloj binario de Arduino

Cwik Clock v1.0 - un reloj binario de Arduino

ResumenEsta es una guía a la construcción de un reloj accionado Arduino que utiliza LEDs para mostrar un reloj de 24 horas (horas y minutos) como dígitos binarios, un medidor analógico para mostrar a los segundos, un interruptor para conmutar entre e
Reloj binario de Arduino

Reloj binario de Arduino

Finalmente he dicho, el reloj binario la gente alrededor de mí oído me habló para tan de largo. Estaba tratando de hacer esto durante las últimas vacaciones de Navidad, pero le faltaba tiempo, cambié empleos 2 veces en los últimos 6 meses... por lo q
Reloj binario de Arduino usando LED Matrix

Reloj binario de Arduino usando LED Matrix

Este sitio tiene muchos puestos finas que describe la construcción de los relojes binarios. Soy tremendamente inestable, sin embargo y tienen dificultad para cualquier soldadura. Por lo tanto quería hacer mío de una matriz de 8 x 8 LED MAX7219-contro
Mi reloj binario de Arduino

Mi reloj binario de Arduino

Hola desde ItaliaAunque muchos relojes binarios creados, mi proyecto se inspiró principalmente a esto:http:// muy inteligente y divertido.He intentado mejorar el diseño y para añadir algo personal.Creo que es un buen resultado al final.El proyecto no
Despertador de Bacon - Arduino

Despertador de Bacon - Arduino

Este es un proyecto que surgió inspirado por mi amor de tocino!Este es un reloj alarma diseñado para despertar con el olor de tocino. Con la ayuda de un arduino que el despertador ya tendrá el aroma de tocino llenando la sala de despertar hasta antes
Reloj métrico binario; proyecto Arduino fácil.

Reloj métrico binario; proyecto Arduino fácil.

Se trata de una muy extraña clase de reloj, que fácilmente se puede hacer con materiales simples.Para empezar la explicación, me gustaría decir que siempre he querido tiempo métrico. 5:00 sería mediodía, 7:5 (18:00), las tres cuartas partes y así suc
Reloj binario de Arduino (horas, minutos y segundos)

Reloj binario de Arduino (horas, minutos y segundos)

Hola a todos; Estaba buscando este proyecto durante mucho tiempo.  Finalmente yo se que con mucho esfuerzo.  Para este proyecto necesitarás:1 - Arduino Uno ($30 de Radio Shack)2 - RTC DS1307 (como $2 por EBay)3 - 2 registros de desplazamiento 74HC595
Edificio IllyClock - despertador basado en Arduino en una poder de café

Edificio IllyClock - despertador basado en Arduino en una poder de café

actualizado 04 de agosto de 2011Una versión simplificada es ahora descrito aquí.El propósito de este proyecto es construir un reloj de alarma similar a la que se presenta en el siguiente video.Al lado de la caja, la función original de IllyClock mues
Arduino Powered reloj binario

Arduino Powered reloj binario

este instructable le ayudará a construir un reloj binario de Arduino.  La idea orignial de este instructable fue diseñado por Daniel Andrade.  Mi instructable utiliza componentes de montaje superficial, pero puede ser fácilmente adaptado para a travé
Fracaso y éxito de Arduino Watch

Fracaso y éxito de Arduino Watch

Decidí construir un reloj binario de Arduino. Sé que un reloj de pulsera debe ser de tamaño pequeño ya que es un proyecto usable. Para ello, he seleccionado dispositivo de montaje superficial (SMD) como TQFP Atmega IC, SMD LED y resistencia SMD. Como
Alimentación de Circuts

Alimentación de Circuts

vamos a hacerExplorar publicarSecompartir lo que makeFeatured:IoT de IntelCorte por láserHacks de la vidaJoyeríaCon Instructables pueden compartir lo que hacemos con el mundo y aprovechar una comunidad creciente de expertos creativos. Cómo funciona»
Construcción de droides C3PO

Construcción de droides C3PO

El droide C3PO es un pedazo de pantalla que hice que está parado sobre una base iluminada. El droide es controlado por Arduino dosmicrocontroladores y un controlador de servo de Pololu Maestro USB. Contraté a un imitador de voz para leer un script qu
NerdClock: Un RGB reloj binario [Software de Arduino]

NerdClock: Un RGB reloj binario [Software de Arduino]

IntroducciónRelojes binarios son una manera genial para mostrar el tiempo de una manera misteriosa. Y a los que no saben leer ese tipo de reloj es una manera simple, pero eficaz para incrementar su nerdiness nivel nubes. ¿Que podría ser algo que gust