Att hålla tid på Arduino-projekt är inte lika lätt som du kanske tror: När datorns anslutning inte finns kvar slutar din unpowered Arduino helt enkelt att köra, inklusive dess interna ticker.
För att hålla din Arduino synkroniserad med världen runt den, behöver du det som kallas en "Real Time Clock Module". Så här använder du en.
Vad är meningen med en realtidsklocka (RTC)?
Din dator synkroniserar sannolikt sin tid med internet, men den har fortfarande en intern klocka som fortsätter även utan en Internetanslutning eller strömmen är avstängd. När du använder en Arduino ansluten till en dator har den tillgång till korrekt tid som tillhandahålls av systemklockan. Det är ganska användbart, men de flesta Arduino-projekt är utformade för att användas bort från en dator - när som helst när strömmen kopplas ur, eller om Arduino startas om, har det ingen aning om vilken tid det är. Den interna klockan återställs och börjar räkna från noll igen nästa gång den sätts på.
Om ditt projekt har någonting att göra med att behöva tiden - till exempel min nattljus och soluppgång väckarklocka Arduino Night Light och Sunrise Alarm Project Arduino Nattljus och Sunrise Alarm Project idag, kommer vi att göra en soluppgång väckarklocka, som försiktigt och Sakta vakna dig utan att tillgripa en offensiv brusmaskin. Läs mer - det här kommer tydligt att bli ett problem. I det projektet kom vi runt problemet genom att manuellt ställa in tiden varje natt på ett ganska oväsentligt sätt - användaren skulle trycka på återställningsknappen strax innan de gick och lägger till en manuell synkronisering. Tydligen är det inte en idealisk långtidslösning.
En RTC-modul är en extra bit av kretsar som kräver ett litet myntcellsbatteri, vilket fortsätter att räkna tiden även när din Arduino är avstängd. Efter att ha ställts in en gång - det kommer att hålla den tiden för batteriets liv, vanligtvis ett bra år eller så.
TinyRTC
Den mest populära RTC för Arduino heter TinyRTC och kan köpas för cirka $ 5- $ 10 på eBay. Du kommer sannolikt att behöva försörja ditt eget batteri (det är olagligt att skicka dessa utomlands till många ställen) och några rubriker (de stiften som slits in i hålen, som du behöver lödda i dig själv).
Detta är modulen jag har:
Det har till och med en inbyggd temperatursensor, men batteriet kommer att hålla längre om du inte använder det.
Antalet hål på det där ser ganska skrämmande ut, men du behöver bara fyra av dem. GND, VCC, SCL och SDA - du kan använda relevanta pinnar på vardera sidan av RTC-modulen. Du pratar med klockan med hjälp av I2C-protokollet, vilket innebär att endast två stift används - en för klockan (en seriell kommunikationsdataklocka, inget att göra med tiden) och en för data. Faktum är att du till och med kedjer upp till 121 I2C-enheter på samma två stift - kolla in denna Adafruit-sida för ett urval av andra I2C-enheter du kan lägga till, eftersom det finns mycket!
Komma igång
Haka upp din TinyRTC-modul enligt diagrammet nedan - den rosa DS-linjen behövs inte, som det är för temperatursensorn.
Därefter laddar du ned tid- och DS1307RTC-biblioteken och placerar de resulterande mapparna i mappen / bibliotek .
Avsluta och starta om Arduino-miljön för att ladda i bibliotek och exempel.
Du hittar två exempel på DS1307RTC-menyn: ladda upp och kör SetTime- exemplet först - det här ställer in RTC till rätt tid. Den faktiska koden är inte värt att gå i detalj med, bara vet att du behöver köra den en gång för att utföra den första tidssynkroniseringen.
Kolla sedan på användningsexempelet med ReadTest .
#include #include #include void setup() { Serial.begin(9600); while (!Serial) ; // wait for serial delay(200); Serial.println("DS1307RTC Read Test"); Serial.println("-------------------"); } void loop() { tmElements_t tm; if (RTC.read(tm)) { Serial.print("Ok, Time = "); print2digits(tm.Hour); Serial.write(':'); print2digits(tm.Minute); Serial.write(':'); print2digits(tm.Second); Serial.print(", Date (D/M/Y) = "); Serial.print(tm.Day); Serial.write('/'); Serial.print(tm.Month); Serial.write('/'); Serial.print(tmYearToCalendar(tm.Year)); Serial.println(); } else { if (RTC.chipPresent()) { Serial.println("The DS1307 is stopped. Please run the SetTime"); Serial.println("example to initialize the time and begin running."); Serial.println(); } else { Serial.println("DS1307 read error! Please check the circuitry."); Serial.println(); } delay(9000); } delay(1000); } void print2digits(int number) { if (number>= 0 && number
Observera att vi också har inkluderat det centrala Wire.h- biblioteket - det här kommer med Arduino och används för kommunikation via I2C. Ladda upp koden, öppna seriekonsolen vid 9600 baud och titta och din Arduino matar ut den aktuella tiden varje sekund. Underbar!
Den viktigaste koden i exemplet är att skapa en tmElements_t tm - det här är en struktur som vi kommer att fylla med den aktuella tiden. och RTC.read (tm) -funktionen, som får den aktuella tiden från RTC-modulen, sätter den i vår tm- struktur och returnerar sant om allt gick bra. Lägg till din felsöknings- eller logik kod inuti det "if" -sättandet, till exempel att skriva ut tiden eller reagera på den.
Nu när du vet hur du får rätt tid med Arduino, kan du försöka skriva om soluppgångalarmprojektet eller skapa en LED-ordklocka - möjligheterna är oändliga! Vad ska du göra?
Bildkrediter: Snootlab Via Flickr