Hvordan og hvorfor å legge til en sanntidsklokke til Arduino

Hvordan og hvorfor å legge til en sanntidsklokke til Arduino / DIY

Å holde seg tid på Arduino-prosjekter er ikke så enkelt som du kanskje tror: Når datamaskinforbindelsen ikke er der, slutter din unpowered Arduino rett og slett å kjøre, inkludert sin interne ticker.

For å holde Arduino synkronisert med verden rundt, trenger du det som kalles a “Real Time Clock-modul”. Slik bruker du en.

Hva er poenget med et Real Time Clock (RTC)?

Datamaskinen din sannsynligvis synkroniserer sin tid med internett, men den har fortsatt en intern klokke som fortsetter å gå selv uten en Internett-tilkobling eller strømmen er slått av. Når du bruker en Arduino koblet til en datamaskin, har den tilgang til nøyaktig tid levert av systemuret. Det er ganske nyttig, men de fleste Arduino-prosjekter er designet for å bli brukt vekk fra en datamaskin - når som helst, når strømmen kobles fra, eller Arduino starter på nytt, har det ingen anelse om hvilken tid det er. Den interne klokken vil bli tilbakestilt og begynner å telle fra null igjen neste gang den er slått på.

Hvis prosjektet ditt har noe å gjøre med å trenge tiden - for eksempel nattlys og soloppgangsvekkerklokke Arduino Night Light og Sunrise Alarm Project Arduino nattlys og soloppgang alarmprosjekt i dag, vil vi lage en soloppgangsvekkerklokke som forsiktig og sakte våkne deg uten å gripe til en støtende støymaskin. Les mer - dette kommer tydeligvis til å være et problem. I dette prosjektet kom vi rundt problemet ved å manuelt sette tiden hver natt på en ganske rå måte - brukeren ville trykke på tilbakestillingsknappen like før de gikk i seng, og ga en manuell tidssynkronisering. Klart det er ikke en ideell langtidsløsning.

En RTC-modul er en ekstra bit av krets, som krever et lite myntcellebatteri, som fortsetter å telle tiden selv når Arduino er slått av. Etter å ha blitt satt en gang - det vil holde den tiden for batteriets levetid, vanligvis et godt år eller så.

TinyRTC

Den mest populære RTC for Arduino kalles TinyRTC og kan kjøpes for rundt $ 5- $ 10 på eBay. Du vil sannsynligvis måtte levere ditt eget batteri (det er ulovlig å sende disse til utlandet til mange steder), og noen overskrifter (pinnene som spretter inn i hullene, som du må lodde i deg selv).

Dette er modulen jeg har:

Den har til og med en innebygd temperatursensor, men batteriet varer lenger hvis du ikke bruker det.

Antall hull på den tingen ser ganske skummel ut, men du trenger bare fire av dem; GND, VCC, SCL og SDA - du kan bruke de relevante pinnene på hver side av RTC-modulen. Du snakker med klokken ved hjelp av I2C-protokollen, som betyr at bare to pins brukes - en for “klokke” (en seriell kommunikasjonsdataklokke, ingenting å gjøre med tiden) og en for dataene. Faktisk kan du til og med koble opp til 121 I2C-enheter på samme to pins - sjekk ut denne Adafruit-siden for et utvalg av andre I2C-enheter du kan legge til, fordi det er mye!

Starter

Koble til din TinyRTC-modul i henhold til diagrammet nedenfor - den rosa DS-linjen er ikke nødvendig, som det er for temperatursensoren.

Deretter laster du ned tid- og DS1307RTC-bibliotekene og plasserer de resulterende mappene i din / bibliotek mappe.

Avslutt og gjenoppstart Arduino-miljøet for å laste inn i bibliotekene og eksemplene.

Du finner to eksempler på DS1307RTC-menyen: last opp og kjøre fulls eksempel først - dette vil sette RTC til riktig tid. Den faktiske koden er ikke verdt å gå i detalj med, bare vet at du trenger å kjøre den en gang for å utføre den første tidssynkroniseringen.

Deretter ser du på eksempelbruken med ReadTest.

 #inkludere  #inkludere  #inkludere  ugyldig oppsett () Serial.begin (9600); mens (! Serial); // vent på seriell forsinkelse (200); Serial.println ("DS1307RTC Read Test"); Serial.println ( "-------------------");  tomromsløyfe () tmElements_t tm; hvis (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 ();  ellers hvis (RTC.chipPresent ()) Serial.println ("DS1307 er stoppet. Vennligst kjør SetTime"); Serial.println ("eksempel for å initialisere tiden og begynne å kjøre."); Serial.println ();  ellers Serial.println ("DS1307 lese feil! Vennligst sjekk kretsene."); Serial.println ();  forsinkelse (9000);  forsinkelse (1000);  void print2digits (int nummer) if (number> = 0 && number 

Legg merke til at vi også har tatt med kjerne Wire.h bibliotek - dette kommer med Arduino og brukes til å kommunisere over I2C. Last opp koden, åpne seriekonsollen på 9600 baud, og se og Arduino-utgangene utgir gjeldende tid hvert sekund. Strålende!

Den viktigste koden i eksemplet er å skape en tmElements_t tm - dette er struktur at vi vil fylle med den nåværende tiden; og RTC.read (TM) funksjon, som får den nåværende tiden fra RTC-modulen, setter den inn i vår TM struktur, og returnerer sant hvis alt gikk bra. Legg til feilsøkings- eller logikkoden i den "if" -oppstillingen, for eksempel å skrive ut tiden eller reagere på den.

Nå som du vet hvordan du får den rette tiden med Arduino, kan du prøve å skrive om soloppgangalarmprosjektet eller lage et LED-ordklokke - mulighetene er uendelige! Hva vil du gjøre?

Image Credits: Snootlab Via Flickr

Utforsk mer om: Arduino.