Stap 2: De werkelijke TEST: hoe nauwkeurig is een arduino uno / ESP8266 zonder RTC?
"Maar de arduino uno / ESP8266 / Wemos is onnauwkeurig zonder RTC en ibehoefte nauwkeurigheid boven alles!"-zegt de scepticus. Bijna alle arduino klok instructables zijn daarom voorzien van een RTC-eenheid, zelfs als ze zijn never gonna worden uitgeschakeld en niet de back-up functie vereisen.
Nou was ik ook scepticus. Maar ik was gefrustreerd met ingewikkeld gecodeerde internettoepassingen, omvangrijk RTC eenheden, documentatiecentra die niet universeel toepasbare, en gefrustreerd met de sloppyness van dit alles waren. Dus schreef ik mijn eigen schets om te houden van de tijd die op een arduino compatibel microcontroller werken zal. De schets is uitsluitend gebaseerd op de millis()-functie. Deze functie werkt op een microcontroller en alles wat het doet is het tellen van de milliseconden dat is verstreken sinds uw laatste reset. U vindt de schets hieronder met inbegrip van opmerkingen explaing alles en ik ook aan het dit instructable in een aparte Ino bestand. Het is vuil eenvoudig te maken als u mijn reacties volgen en u gemakkelijk zult om uw eigen aangepaste versie op basis van uw behoeften van de tijdwaarneming te maken:
Geschreven door Ruben Marc Speybrouck
unsigned long timeNow = 0;
unsigned long timeLast = 0;
De instellingen van de tijd start:
int startingHour = 12;
uw startende uur hieronder, niet op int uur. Dit zorgt voor een nauwkeurige dagelijkse correctie van tijd
int seconden = 0;
int minuten = 33;
int uur = startingHour;
int dagen = 0;
Nauwkeurigheid instellingen
Iknt dailyErrorFast = 0; / / het gemiddelde aantal milliseconden van uw microcontroller tijd snel op een dagelijkse basis is set
int dailyErrorBehind = 0; het gemiddelde aantal milliseconden die van uw microcontroller tijd achter op een dagelijkse basis is instellen
int correctedToday = 1; Wijzig deze variabele, niet een betekent dat de tijd is reeds gecorrigeerd vandaag voor de fout in uw planken kristal. Dit geldt voor de eerste dag omdat je gewoon de tijd wanneer u de schets geüpload instellen.
void setup { / / zetten uw setup-code hier, om het eenmalig uit te voeren:
Serial.begin(9600); }
void loop { / / zet uw belangrijkste code hier, om het herhaaldelijk uitvoeren:
timeNow = millis () / 1000; het aantal milliseconden dat is verstreken sinds de boot
seconden = timeNow - timeLast;
het aantal seconden dat is verstreken sinds de laatste keer 60 seconden werd bereikt.
Als (seconden == 60) {}
timeLast = timeNow;
minuten = minuten + 1; }
Als één minuut is verstreken, start tellen milliseconden vanaf nul opnieuw en voeg één minuut op de klok.
Als (minuten == 60) {}
minuten = 0;
uren = uur + 1; }
Als een uur is verstreken, beginnen tellen vanaf nul minuten en één uur toe te voegen aan de klok
Als (uren == 24) {}
uren = 0;
dagen = dagen + 1;
}
als 24 uur verstreken zijn, voegt u één dag
Als (uren == (24 - startingHour) & & correctedToday == 0) {}
delay(dailyErrorFast*1000);
seconden = seconden + dailyErrorBehind;
correctedToday = 1; }
telkens 24 uur zijn verstreken sinds de aanvankelijke begintijd en het is niet deze eergisteren reset, toevoegen van milliseconden of vertraging van het programma met enkele milliseconden.
Het wijzigen van deze varialbes volgens de fout van je board.
De enige manier om erachter te komen hoe ver uw planken interne klok is, is door het uploaden van deze schets op precies hetzelfde moment als de real-time, te laten lopen voor een paar dagen
en dan bepalen hoeveel seconden langzaam/snel uw interne klok van de planken is op een dagelijkse gemiddelde. (24 uur).
Als (uren 24 - startingHour + 2 ==) {}
correctedToday = 0; }
Laat de schets weten dat een nieuwe dag is begonnen voor wat betreft correctie, als deze regel niet hier de arduiono is / / zou blijven om te corrigeren voor een hele uur thats 24 - startingHour.
Serial.Print ("de tijd is:");
Serial.Print(Days);
Serial.Print(":");
Serial.Print(hours);
Serial.Print(":");
Serial.Print(minutes);
Serial.Print(":");
Serial.println(seconds);
}
Ik liep de code op een wemos D1 zowel een arduino uno. Ik stel de tijd gelijk is aan de tijd van:http://www.timeanddate.com/ op middernacht dag nul (Natuurlijk hoef te beginnen bij middernacht!-ik opgenomen instellen tijdcode boven void setup). Na één dag en 9 uur was het verschil tussen de tijd op mijn microcontrollers en deze website ongeveer één seconde. Ik heb dit gecontroleerd door het nemen van een screenshot van mijn seriële monitor aan de ene kant van het scherm en de webpagina opent aan de andere kant. (zie foto).
Na ongeveer 3 dagen, op zowel mijn arduino en wemos werd de klok ongeveer 2-2,5 sec snel. dat is 274 seconden een jaar uit of net iets meer dan vier en een halve minuut. Dat is onaanvaardbaar! Nee, niet echt. Ik voegde enkel een regel code aan mijn schets waarmee de tijd op mijn microcontrollers worden gecorrigeerd door het uitstellen van het programma slechts een beetje elke 24 uur of door het toevoegen van een paar milliseconden elke dag. In mijn geval ongeveer 0,75 seconden elke dag. En daar heb je het, lange termijn in de buurt van tweede nauwkeurige tijdwaarneming met geen gedoe op elk bord!
Hier is de correctie code allemaal samen in de praktijk nogmaals zodat je gemakkelijk het hele plaatje zien kon
Nauwkeurigheid instellingen
int dailyErrorFast = 0; het gemiddelde aantal milliseconden van uw microcontroller tijd snel op een dagelijkse is basis int dailyErrorBehind = 0; / / set van het gemiddelde aantal milliseconden van uw microcontroller tijd achter op een dagelijkse basis int correctedToday = 1 is; / / Wijzig deze variabele, niet een betekent dat de tijd is reeds gecorrigeerd vandaag voor de fout in uw planken kristal. Dit geldt voor de eerste dag omdat je gewoon de tijd wanneer u de schets geüpload instellen.:
Als (uren == (24 - startingHour) & & correctedToday == 0) {} delay(dailyErrorFast*1000);
elke keer als 24 uur zijn verstreken sinds de aanvankelijke begintijd en er niet opnieuw deze eergisteren)
Als (uren 24 - startingHour + 2 ==) {correctedToday = 0;}
Laat de schets weten dat een nieuwe dag is begonnen voor wat betreft correctie, als deze regel niet hier de arduiono is
zou blijven om te corrigeren voor een hele uur thats 24 - startingHour.