Étape 2: L’essai proprement dit : quelle est la précision un arduino uno / ESP8266 sans CCF ?
"Mais l’arduino uno / ESP8266 / Wemos est inexacte sans CCF et j’ai besoin de précision avant toute chose! »-dit le sceptique. Presque tous les arduino horloge instructables disposent donc une unité de la CCF, même s’ils ne vont jamais être éteint et ne nécessitent pas la fonction de sauvegarde.
Eh bien, j’étais sceptique aussi. Mais j’ai été frustré avec codé des applications internet, les encombrants CCF unités, les librairies qui n’ont pas été universellement compatible et frustré avec le sloppyness de tout cela. Donc j’ai écrit mon propre esquisse pour garder l’heure qui fonctionne sur n’importe quel microcontrôleur compatible arduino. L’esquisse est basée uniquement sur la fonction millis(). Cette fonction fonctionne sur n’importe quel microcontrôleur et il ne fait que compter les millisecondes qui se sont écoulées depuis votre dernière remise à zéro. Vous trouverez l’esquisse ci-dessous, y compris les commentaires explaing tout et j’ai également joint à cette instructable dans un fichier distinct .ino. Il est simple à faire si vous suivez mes commentaires et vous pourrez facilement faire votre propre version personnalisée basée sur vos besoins de chronométrage de la saleté :
Rédigé par Ruben Marc Speybrouck
unsigned long TEM.PS = 0 ;
unsigned long timeLast = 0 ;
Paramètres de temps de démarrage :
int startingHour = 12 ;
régler votre heure de départ ci-dessous, pas à l’heure int. Cela garantit exacte correction quotidienne du temps
secondes int = 0 ;
int minutes = 33 ;
int h = startingHour ;
jours d’int = 0 ;
Paramètres de précision
J’aint dailyErrorFast = 0; / / set le nombre moyen de millisecondes, temps de votre microcontrôleur est rapide sur une base quotidienne
int dailyErrorBehind = 0; définir le nombre moyen de millisecondes, que temps de votre microcontrôleur est à l’origine sur une base quotidienne
int correctedToday = 1; ne modifiez pas cette variable, on veut dire que le temps a déjà été corrigé aujourd'hui pour l’erreur dans votre cristal de planches. Cela est vrai pour le premier jour parce que vous venez de mettre le temps quand vous avez téléchargé l’esquisse.
void setup() { / / mettez votre code de configuration ici, pour exécuter une fois :
Serial.Begin(9600) ; }
void loop() { / / mettez votre code principal ici, pour exécuter à plusieurs reprises :
TEM.PS = millis () / 1000 ; le nombre de millisecondes écoulées depuis le démarrage
secondes = TEM.PS - timeLast ;
le nombre de secondes qui se sont écoulés depuis la dernière fois que 60 secondes a été atteint.
Si (secondes == 60) {}
timeLast = TEM.PS ;
minutes = minutes + 1 ; }
Si une minute passée, commencer à compter les millisecondes de zéro à nouveau et ajouter une minute à l’horloge.
Si (minutes == 60) {}
minutes = 0 ;
heures = heures + 1 ; }
Si une heure est passée, commencer à compter les minutes entre zéro et ajouter une heure à l’horloge
Si (heures == 24) {}
heures = 0 ;
jours = jours + 1 ;
}
Si 24 heures se sont écoulées, ajoutez un jour
Si (== heures (24 - startingHour) & & correctedToday == 0) {}
Delay(dailyErrorFast*1000) ;
secondes = secondes + dailyErrorBehind ;
correctedToday = 1 ; }
chaque fois que 24 heures se sont écoulées depuis l’heure de départ initiale et n’a pas pu réinitialiser cette veille, ajouter les millisecondes ou retarder le programme avec quelques millisecondes.
Changer ces varialbes selon l’erreur de votre planche.
La seule façon de savoir comment loin votre horloge interne de planches est, est en téléchargeant cette esquisse à exactement le même temps que le temps réel, laisser tourner pendant quelques jours
et puis en déterminant le nombre de secondes lent/rapide votre horloge interne de planches est sur une moyenne quotidienne. (24 heures).
Si (heures == 24 - startingHour + 2) {}
correctedToday = 0 ; }
Informez l’esquisse qu’une nouvelle journée a commencé pour quelle correction de préoccupations, si cette ligne n’était pas ici l’arduiono / / continuerait à corriger pour une heure entière, c’est 24 - startingHour.
Serial.Print ("le temps est:") ;
Serial.Print(Days) ;
Serial.Print(":") ;
Serial.Print(hours) ;
Serial.Print(":") ;
Serial.Print(minutes) ;
Serial.Print(":") ;
Serial.println(seconds) ;
}
J’ai couru le code sur un wemos D1 et un arduino uno. J’ai mis le temps égal au temps de :http://www.timeanddate.com/ le jour de minuit zéro (il ne faut évidemment pas commence à minuit!-j’ai inclus le timecode définie ci-dessus Sub d’installation). Après un jour et 9 heures, la différence entre l’heure de mon microcontrôleurs et ce site Web a été environ une seconde. J’ai vérifié cela en prenant un screenshot de mon serial monitor sur un côté de l’écran et en ayant la page Web à ouvrir de l’autre côté. (voir photo).
Après environ 3 jours, sur mon arduino et wemos l’horloge a été rapide d’environ 2 à 2,5 sec. C’est 274 secondes une année de congé ou un peu plus de 4,5 minutes. C’est inacceptable ! Non, pas vraiment. Je viens d’ajouter une ligne de code à mon esquisse qui corrige le temps sur mon microcontrôleurs en retardant le programme juste un peu toutes les 24 heures, ou en ajoutant quelques millisecondes chaque jour. Dans mon cas environ 0,75 secondes tous les jours. Et là vous avez, à long terme près de chronométrage deuxième précis sans chichis à n’importe quel bord !
Voici le code de correction tous ensemble dans la pratique une fois de plus si on pouvait facilement voir l’image entière
Paramètres de précision
int dailyErrorFast = 0; définir le nombre moyen de millisecondes, temps de votre microcontrôleur est rapide sur un quotidien base int dailyErrorBehind = 0; / / set le nombre moyen de millisecondes, temps de votre microcontrôleur est derrière sur un quotidien base int correctedToday = 1; / / ne pas changer cette variable, on veut dire que le temps a déjà été corrigé aujourd'hui pour l’erreur dans votre cristal de planches. Cela est vrai pour le premier jour parce que vous venez de mettre le temps quand vous avez téléchargé l’esquisse. :
Si (== heures (24 - startingHour) & & correctedToday == 0) {} Delay(dailyErrorFast*1000) ;
chaque fois que 24 heures se sont écoulées depuis l’heure de départ initiale et n’a pas pu réinitialiser cette veille)
Si (heures == 24 - startingHour + 2) {correctedToday = 0;}
Informez l’esquisse qu’une nouvelle journée a commencé pour quelle correction de préoccupations, si cette ligne n’était pas ici l’arduiono
continuerait à corriger pour une heure entière, c’est 24 - startingHour.