Arduino binaire réveil (4 / 16 étapes)

Etape 4: Temps de maintien de la

Pour garder une trace de temps que j’ai utilisé seulement l’arduino et la millis() de fonction arduino standard. Cette méthode ne sera pas totalement exacte, car l’oscillateur à quartz 16Mhz, qui décide de la fréquence d’horloge de l’arduinos CPU, ne sera probablement pas exactement 16 000 000 Hz. La bonne nouvelle est que vous pouvez mesurer comment inexacte votre horloge est et les compenser dans votre code, car le décalage doit être constant pour une période de temps donnée.

Mesurer comment inexacte votre arduino est :
Comme dit précédemment, l’arduino aura une petite erreur, cette erreur dépend de l’oscillateur à quartz et sera différente pour chaque arduino, pour mesurer combien mon horloge arduino diffère de l’heure, j’ai programmé à imprimer sur le temps (l’heure, minutes et seconde variables) par l’intermédiaire de série. J’ai ensuite laissez-le fonctionner pendant une longue période (plus de nuit et plus) et par rapport au temps de l’arduino avec une horloge que je savais était exacte, au début et à la fin de ma période de mesure. Diviser la différence de temps avec le temps, que le test a eu pour calculer l’erreur chaque heure. J’ai trouvé que mon arduino est d’environ 0,4 secondes de jeûner chaque heure. J’ai utilisé exacttimenow.com pour obtenir l’heure exacte, mais si vous avez une montre que vous savez est très exacte, n’hésitez pas à utiliser à la place.
Le code que j’avais l’habitude de garder le temps est une adaptation d’un code que j’ai trouvé sur les forums de l’arduino. J’ai il réécrit avec instructions if plutôt que de division et modulo, pour voir si il n’y aurait aucune différence de vitesse et a trouvé que la version if est plus de 15 fois plus rapide (bien que les deux sont encore assez rapide, plus d’infos sur le test ici).

Puisque je veux que les autres trucs dans ma boucle principale (comme le contrôle du capteur de toucher, recherchant les touches, etc.) se produise aussi souvent que possible, j’ai utilisé la version plus rapide.

Le code :

Chaque fois que l’horloge est appelée, elle ajoute le temps en millisecondes depuis dernière il a été appelé pour une variable m, lorsqu’une seconde a passé (m > 999) la deuxième variable est augmentée d’une unité et m est réinitialisé. Lorsque la variable secondes atteint 60, la variable minute sera augmentée par l’un, et secondes seront définis sur zéro. La même chose arrive avec la variable minutes ; lorsqu’il atteint 60, ajouter 1 à heures et minutes de réinitialiser. La variable de l’heure est réinitialisée lorsqu’il atteint 24.

Pour compenser que mon arduino est 0,4 secondes heure plus vite evey, je diminue les secondes avec deux secondes chaque cinquième heure.

____________________________________________________________________

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;
}

______________________________________________________________________

Articles Liés

Rise and Shine ! -Arduino LDR réveil

Rise and Shine ! -Arduino LDR réveil

Cette instructable a été créée dans l'accomplissement de l'exigence de projet de la MakeCourse à l'Université de Floride du Sud (www.makecourse.com).Principe de fonctionnementCe réveil est conçu pour vous laisser lever avec le soleil. Lorsque la lumi
Arduino binaire 7 Segment affichage horloge & calendrier

Arduino binaire 7 Segment affichage horloge & calendrier

Contrairement à la plupart des autres horloges binaires cette horloge affiche la date et binaire sur 3 rangées de 8 sept segments affiche un et zéro plutôt que de quelques rangées de LEDs.Tous les détails sur ce mon site web ici.Un microprocesseur de
NESBot : Arduino alimenté Robot battre Super Mario Bros de la NES

NESBot : Arduino alimenté Robot battre Super Mario Bros de la NES

ce guide vous emmènera à travers les étapes pour construire un NDA jeu robot.Vous aurez besoin :Un Arduino Duemilanove (autres conseils fonctionnera probablement, mais vous devrez ajuster les étapes de votre appareil)Travail de Console NESSuper Mario
Radio-réveil avec Tetris pour prouver vous êtes éveillé

Radio-réveil avec Tetris pour prouver vous êtes éveillé

il s'agit d'un Arduino alimenté réveil qui, après avoir frappé, répéter deux fois l'alarme ne s'annulent pas jusqu'à ce que l'utilisateur a supprimé 4 lignes dans le jeu Tetris. Vous transformer physiquement l'horloge sur le côté, afin que l'écran so
Arduino congélateur alarme

Arduino congélateur alarme

J'ai commencé ce projet pour remédier à un défaut de conception dans notre congélateur. Son commutateur d'alarme de porte se trouve à proximité des charnières et exige que la porte s'ouvrir grand avant que l'alarme se déclenche. Notre porte de congél
Contrôler n’importe quel appareil électrique ou lumineux avec vous tablette ou smartphone (wifi)

Contrôler n’importe quel appareil électrique ou lumineux avec vous tablette ou smartphone (wifi)

Contrôler n'importe quel appareil électrique ou lumineux avec vous tablette ou smartphone (wifi) à l'aide d'arduino, Billy et un wemos / ESP8266 ConseilDans ce tutoriel nous allons faire quelque chose j'ai appeler un wifi contrôlée ac switch. (Mais i
Capteur infrarouge pour appareil photo reflex numérique

Capteur infrarouge pour appareil photo reflex numérique

Longue histoire courte : il était nécessaire de prendre des photos en plein air chaque fois quand un animal s'approchait un reflex numérique, donc j'ai construit une boîte avec un capteur PIR et un petit Arduino Pro Mini pour contrôler la caméra.Les
Arbre de Noël, lumières contrôlée par téléphone ? Un simple Internet of Things hack.

Arbre de Noël, lumières contrôlée par téléphone ? Un simple Internet of Things hack.

Mon fils voulait être en mesure de tourner l'arbre de Noël avec son téléphone sous et hors tension. Nous avons creusé autour dans le laboratoire de montagne secrète (AKA le sous-sol) et est venu avec le projet suivant, qui utilise un Arduino pour rév
Gazouillis Laser Tripwire avec Webcam Capture

Gazouillis Laser Tripwire avec Webcam Capture

Cette instructable va vous montrer comment construire un tripwire laser peut twitter et saisir une image à partir d'une webcam, aussi bien qu'exécuter toute commande que vous pouvez mettre dans un script bash.Cette instructable est en fait assez simp
Le Robot 4Omni CHAMPION de Soccer roue !

Le Robot 4Omni CHAMPION de Soccer roue !

Ses un Bluetooth contrôlée 4 Wheel drive omni roue robot basé sur Arduino Mega 2560 (vous pouvez utiliser n'importe quel arduino UNO ou régulière ou tout autre, vous voulez), ce n'est pas un robot ordinaire c'est un Robot de Soccer et il a participé
Lampe de 12V Neopixel RV

Lampe de 12V Neopixel RV

... ou, fabricants de combien faut-il pour changer une ampoule ?Une 12V lumière LED dans notre camping-car grillée sans raison évidente. Je suis seulement à apprendre comment utiliser mon nouveau bureau machine CNC et voulait essayer de fraisage des
Ada Robotic Hand - Open Bionics

Ada Robotic Hand - Open Bionics

Il s'agit d'un guide étape par étape sur comment faire une main robotique Open bionique Ada. Il est dérivé de la main robotique Dextrus, par le Projet de main ouverte. Il suppose que vous avez soit ordonné l' Ada robotique main kit ou avez accès à un
RomoBOT - Robot animatronique Face

RomoBOT - Robot animatronique Face

Il s'agit de mon premier instructable, alors soyez gentil. Le RomoBOT est un projet de la mine dans la dernière année de mes études de génie mécanique. C'était une étude indépendante et axé sur la robotique. Le projet a changé plusieurs fois et le pl
Comment faire un chauffage et une veste de refroidissement

Comment faire un chauffage et une veste de refroidissement

projet étudiants CU Boulder GEEN 1400 projets d'ingénierie :Diana George, Jenna Sobieray, Alex Cossoff et Chris Francklyn Vous avez toujours rêvé d'avoir une veste qui a gardé l'équilibre?Eh bien, aujourd'hui est votre jour de chance ! Maintenant pré