Stap 4: Tijd houden
Als u wilt bijhouden van de tijd gebruikte ik alleen de arduino, en de standaard arduino functie millis(). Deze methode zal niet helemaal exact, want de 16Mhz kristal oscillator, die beslist van de klokfrequentie van de arduinos CPU, waarschijnlijk niet precies 16 000 000 Hz zijn. Het goede nieuws is dat je meten kan hoe onjuist uw klok is en compenseren in uw code, omdat de offset constant gedurende een bepaalde periode van tijd moet.Meten hoe onjuist je arduino is:
Zoals al eerder zei, de arduino zal hebben een kleine fout, deze fout is afhankelijk van de kristal oscillator en anders voor elke arduino, zal zijn om te meten hoeveel mijn arduino klok verschilde van de juiste tijd, ik het uitprinten van de tijd (uur, minuut en tweede variabelen) via seriële geprogrammeerd. Ik laat het lopen voor een lange tijd (Over nacht en meer) en de arduino tijd ten opzichte van een klok die ik wist was precies te zijn, aan het begin en het einde van mijn meettijd. Verdeel het tijdsverschil met de tijd die de test was voor het berekenen van de fout elk uur. Ik vond dat mijn arduino ongeveer 0,4 seconden is snel elk uur. Ik gebruikte exacttimenow.com te krijgen van de exacte tijd, maar hebt u een horloge die u weet is zeer precies te zijn, voel je vrij om die te gebruiken.
De code die ik gebruikt de tijd te houden is een aanpassing van sommige code vond ik op de arduino forums. Ik herschreef het met if-statements in plaats van de divisie en restbepaling bij deling, om te zien of er zou om het even welk verschil snelheid en vond dat de als-versie meer dan 15 keer sneller is (hoewel beide nog steeds heel snel zijn, meer info over de test hier).
Omdat ik wil andere dingen in mijn hoofdlus (zoals het controleren van de touch sensor, controleren op de knop persen, enz) gebeurt zo vaak mogelijk, ik gebruikte de snellere versie.
De code:
Elke keer als de klokfunctie heet het voegt de tijd in milliseconden sinds laatste tot een variabele m, heette wanneer er één seconde is verstreken (m > 999) de tweede variabele is verhoogd en m wordt teruggesteld. Wanneer de variabele seconden 60 bereikt, de minuut variabele wordt met één verhoogd, en seconden wordt ingesteld op nul. Hetzelfde gebeurt met de variabele minuten; Wanneer het 60 wordt bereikt, er 1 bij optellen om de uren en minuten opnieuw. De variabele uur zal worden teruggesteld wanneer het 24 is bereikt.
Om dit te compenseren dat mijn arduino 0,4 seconden sneller evey uur is, minder ik de seconden met twee seconden elk vijfde uur.
____________________________________________________________________ // CLOCK VARIABLES: void clock() // CLOCK VARIABLES: void clock()
The clock() function:
#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;
{
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:
#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;
{
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;
}
______________________________________________________________________