Tidtagning på ESP8266 & arduino uno utan en RTC (realtidsklocka)? (2 / 3 steg)
Steg 2: Den verkliga provningen: hur exakt är en arduino uno / ESP8266 utan RTC?
"Men den arduino uno / ESP8266 / Wemos är felaktiga utan RTC och jag behöver noggrannhet över allt annat!"-säger skeptikern. Nästan alla arduino klocka instructables har därför en RTC enhet, även om de aldrig kommer att stängas av och behöver inte säkerhetskopiera funktion.
Jo var jag skeptiker. Men jag var frustrerad med komplext kodade internetapplikationer, skrymmande RTC enheter, librairies som inte var universellt kompatibla och frustrerad med sloppyness av det hela. Så skrev jag min egen skiss för att hålla tid som fungerar på alla arduino kompatibel mikrokontroller. Skissen är baserat bara på funktionen millis(). Denna funktion fungerar på alla microcontroller och allt det gör är att räkna i millisekunder som har förflutit sedan din senaste nollställning. Du hittar skissen nedan inklusive kommentarer explaing allt och jag också fäst den till detta instructable i en separat .ino fil. Det är smuts som är enkel att göra om du följer mina kommentarer och du kommer enkelt att kunna göra din egen anpassade version baserat på din tid att hålla behoven:
Skriven av Ruben Marc Speybrouck
osignerade långa timeNow = 0;
osignerade långa timeLast = 0;
Tid start inställningar:
int startingHour = 12;
Ange din start timme här inte nedan på int timme. Detta säkerställer korrekt daglig korrigering av tid
int sekunder = 0;
int minuter = 33.
int timmar = startingHour;
int dagar = 0;
Korrekta inställningar
Jagnt dailyErrorFast = 0; / / set det genomsnittliga antalet millisekunder din mikrokontroller är snabbt på en daglig basis
int dailyErrorBehind = 0; Ange det genomsnittliga antalet millisekunder din microcontroller tid ligger bakom dagligen
int correctedToday = 1; Ändra inte denna variabel, en betyder att tiden redan har korrigerats idag för felet i din styrelser crystal. Detta gäller för den första dagen för du bara sätta tiden när du laddat upp skissen.
void setup() { / / lägga installationen koden här, om du vill köra en gång:
Serial.BEGIN(9600); }
void loop() { / / sätta din huvudsakliga kod här, för att köra flera gånger:
timeNow = millis () / 1000; antalet millisekunder som har gått sedan boot
sekunder = timeNow - timeLast;
antalet sekunder som har gått sedan den senaste gången 60 sekunder nåddes.
om (sekunder == 60) {
timeLast = timeNow;
minuter = minuter + 1. }
om en minut har gått, börja räkna millisekunder från noll igen och lägga till en minut i klockan.
om (minuter == 60) {
minuter = 0;
timmar = timmar + 1. }
om en timme har gått ut, börja räkna minuter från noll och lägga till en timme i klockan
om (timmar == 24) {
timmar = 0;
dagar = dagar + 1.
}
om 24 timmar har passerat, lägga till en dag
om (timmar == (24 - startingHour) & & correctedToday == 0) {
Delay(dailyErrorFast*1000);
sekunder = sekunder + dailyErrorBehind;
correctedToday = 1; }
varje gång 24 timmar har gått sedan den första tidpunkten och det har inte varit återställa denna dagen innan, lägga till millisekunder eller fördröja programmet med några millisekunder.
Ändra dessa varialbes enligt din styrelse fel.
Det enda sättet att ta reda på hur långt bort din styrelser inre klocka är, är genom att ladda upp denna skiss på exakt samma tid i realtid, att låta det gå några dagar
och sedan bestämma hur många sekunder långsamt/snabbt din styrelser inre klocka är en daglig genomsnitt. (24 timmar).
om (timmar == 24 - startingHour + 2) {
correctedToday = 0; }
Låt skissen som vet att en ny dag har börjat för vad gäller korrigering, om denna linje inte var här arduiono / / skulle fortsätta att korrigera för hela timme som är 24 - startingHour.
Serial.Print ("tiden är:");
Serial.Print(Days);
Serial.Print(":");
Serial.Print(hours);
Serial.Print(":");
Serial.Print(Minutes);
Serial.Print(":");
Serial.println(seconds);
}
Jag sprang koden på både en wemos D1 och en arduino uno. Jag ställa in tiden lika med tiden från:http://www.timeanddate.com/ på midnatt dag noll (du har uppenbarligen inte att starta vid midnatt!-Jag ingår tid ange koden ovan void setup). Efter en dag och 9 timmar var skillnaden mellan tiden på min mikrokontroller och denna hemsida ca en sekund. Jag kollade detta genom att ta en skärmdump av min följetong bildskärm på ena sidan av skärmen och har webbsidan öppnar på andra sidan. (se bild).
Efter ca 3 dagar, på både min arduino och wemos var klockan ca 2 till 2,5 sek snabbt. Det är 274 sekunder ett år off eller drygt fyra och en halv minut. Som är oacceptabelt! Nej, inte riktigt. Jag har precis lagt en rad kod till min skiss som korrigerar tiden på min microcontrollers antingen genom att fördröja programmet bara lite varje 24 timmar eller genom att lägga till några millisekunder varje dag. I mitt fall ca 0,75 sekunder varje dag. Och där har du det på lång sikt nära andra exakt tidtagning med nej bråken någon ombord!
Här är korrigering koden alla tillsammans i praktiken ännu en gång så du kan lätt se hela bilden
Korrekta inställningar
int dailyErrorFast = 0; Ange det genomsnittliga antalet millisekunder din mikrokontroller är snabbt på en daglig grund int dailyErrorBehind = 0; / / set det genomsnittliga antalet millisekunder din mikrokontroller är bakom på en daglig basis int correctedToday = 1; / / ändra inte denna variabel, en betyder att tiden redan har korrigerats idag för felet i din styrelser crystal. Detta gäller för den första dagen för du bara sätta tiden när du laddat upp skissen.:
om (timmar == (24 - startingHour) & & correctedToday == 0) { Delay(dailyErrorFast*1000);
varje gång 24 timmar har gått sedan den första tidpunkten och det har inte varit återställa denna dagen innan)
om (timmar == 24 - startingHour + 2) {correctedToday = 0;}
Låt skissen som vet att en ny dag har börjat för vad gäller korrigering, om denna linje inte var här arduiono
skulle fortsätta att korrigera för hela timme som är 24 - startingHour.