Arduino binära väckarklocka (4 / 16 steg)
Steg 4: Tidhållning
Att hålla reda på tiden jag använde bara arduino och standard arduino funktion millis(). Denna metod kommer inte att vara helt exakt, eftersom 16Mhz kristalloscillator, som avgör processorns klockfrekvens arduinos CPU, förmodligen inte är exakt 16 000 000 Hz. Den goda nyheten är att du kan mäta hur inexakt klockan är och kompensera för det i koden, eftersom förskjutningen bör vara konstant under en viss tid.Mäta hur inexakt din arduino är:
Som tidigare sagt arduino kommer att ha en liten tid fel, felet beror på kristalloscillator och kommer att vara olika för varje arduino, att mäta hur mycket min arduino klocka skiljde sig från rätt tid, jag programmerat det att skriva ut tid (timme, minut och andra variabler) via följetong. Jag sedan låta det gå för lång tid (över natt och mer) och jämfört den arduino tid med en klocka som jag visste var exakta, i början och i slutet av min mätning period. Dividera skillnaden med den tid provet tog för att beräkna felet varje timme. Jag tyckte att min arduino är ca 0.4 sekunder snabbt varje timme. Jag brukade exacttimenow.com att få exakt tid, men om du har en klocka som du vet är mycket exakt, Känn dig fri att använda det istället.
Koden jag brukade hålla tiden är en anpassning av lite kod som jag hittade på arduino forum. Jag skrev om det med if-satser i stället för division och modulo, för att se om det skulle finnas någon hastighet skillnad och fann att den om-versionen är mer än 15 gånger snabbare (även om båda är fortfarande ganska snabbt, mer info om testet här).
Eftersom jag vill ha andra saker i min huvudloop (som kontroll touch sensor, kontroll av knapptryckningar, etc.) hända så ofta som möjligt, använde jag snabbare versionen.
Koden:
Varje gång klockfunktionen kallas det lägger tid i millisekunder sedan senast det kallades till en variabel m, när en sekund har passerat (m > 999) den andra variabeln ökas av en och m återställs. När variabeln sekunder når 60, minut variabeln kommer att öka med ett, och sekunder sätts till noll. Samma sak händer med variabeln minuter; När den når 60, lägga till 1 i timmar och återställa minuter. Variabeln timme kommer att återställas när den når 24.
För att kompensera att min arduino är 0.4 sekunder snabbare evey timme, minska jag sekunder med två sekunder varje femte timme.
____________________________________________________________________
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;
}
______________________________________________________________________