Annonse
Det er ikke så enkelt å holde tiden på Arduino-prosjekter som du kanskje tror: når datatilkoblingen ikke er der, slutter ikke den ustyrte Arduino å kjøre, inkludert den interne tickeren.
For å holde Arduino-en din synkronisert med verden rundt det, trenger du det som kalles en "Real Time Clock-modul". Slik bruker du en.
Hva er vitsen med en sanntids klokke (RTC)?
Datamaskinen synkroniserer sannsynligvis tiden sin med internett, men den har fremdeles en intern klokke som fortsetter å gå, selv uten 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 gitt av systemklokken. Det er ganske nyttig, men de fleste Arduino-prosjekter er designet for å brukes vekk fra en datamaskin - der poeng, når som helst strømmen kobles fra, eller Arduino starter på nytt, har den absolutt ingen anelse om hvilken tid Det er. Den interne klokken tilbakestilles og begynner å telle fra null igjen neste gang den slås på.
Hvis prosjektet ditt har noe å gjøre med å trenge tiden - for eksempel min
nattlys og soloppgang vekkerklokke Arduino Night Light og Sunrise Alarm ProjectI dag lager vi en soloppgang vekkerklokke, som forsiktig og sakte vil vekke deg uten å ty til en støtende støydempende maskin. Les mer - dette kommer helt klart til å bli et problem. I det prosjektet kom vi rundt problemet ved å manuelt sette tiden hver natt i en ganske rå måte - brukeren ville trykke på tilbakestillingsknappen rett før de la seg, og gi en manuell tid sync. Det er klart det ikke er en ideell langvarig løsning.En RTC-modul er en ekstra bit kretsløp, som krever et lite myntcellebatteri, som fortsetter å telle tiden selv når Arduino er slått av. Etter å ha blitt satt en gang - vil det holde tiden for batteriets levetid, vanligvis et godt år eller så.
TinyRTC
Den mest populære RTC for Arduino heter TinyRTC og kan kjøpes for rundt $ 5- $ 10 på eBay. Du vil sannsynligvis trenge å levere ditt eget batteri (det er ulovlig å sende disse til utlandet mange steder), og noen overskrifter (pinnene som sprekker inn i hullene, som du må lodde i deg selv).
Dette er modulen jeg har:

Den har til og med en innebygd temperatursensor, selv om batteriet vil vare 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 klokka ved hjelp av I2C-protokoll, som betyr at bare to pinner brukes - en for “klokken” (en seriell kommunikasjonsdataklokke, ingenting med tid å gjøre) og en for dataene. Faktisk lenker du til og med opptil 121 I2C-enheter på de samme to pinnene - sjekk ut denne Adafruit-siden for et utvalg av andre I2C-enheter du kan legge til, fordi det er mange!
Starter
Koble til din TinyRTC-modul i henhold til diagrammet nedenfor - den rosa DS-linjen er ikke nødvendig, da det er for temperatursensoren.

Last deretter ned Tid og DS1307RTC biblioteker og plasser de resulterende mappene i dine /libraries mappe.
Gå ut og start Arduino-miljøet for å laste inn bibliotekene og eksemplene.
Du finner to eksempler i DS1307RTC-menyen: last opp og kjør fulls eksempel først - dette vil stille 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.
Neste, se på eksemplet bruk med ReadTest.
#inkludere
#inkludere
#inkludere ugyldig oppsett () {Serial.begin (9600); mens (! seriell); // vent på seriell forsinkelse (200); Serial.println ("DS1307RTC Read Test"); Serial.println ( ""); } void loop () {tmElements_t tm; if (RTC.read (tm)) {Serial.print ("Ok, Time ="); print2digits (tm. Time); Serial.write ( ':'); print2digits (tm. Minutt); Serial.write ( ':'); print2digits (tm. Sekund); Serial.print (", dato (D / M / Y) ="); Serial.print (tm. Dag); Serial.write ( '/'); Serial.print (tm. Måned); Serial.write ( '/'); Serial.print (tmYearToCalendar (tm. År)); Serial.println (); } else {if (RTC.chipPresent ()) {Serial.println ("DS1307 er stoppet. Kjør SetTime "); Serial.println ("eksempel for å initialisere tiden og begynne å løpe."); Serial.println (); } else {Serial.println ("DS1307 lesefeil! Kontroller kretsløpet. "); Serial.println (); } forsinkelse (9000); } forsinkelse (1000); } void print2digits (int-nummer) {if (nummer> = 0 && nummer <10) {Serial.write ('0'); } Serial.print (nummer); }
Merk at vi også har inkludert kjernen Wire.h bibliotek - dette leveres med Arduino og brukes til kommunikasjon over I2C. Last opp koden, åpne seriekonsollen på 9600 baud, og se på, og Arduino gir den nåværende tiden hvert sekund. Strålende!
Den viktigste koden i eksemplet er å lage en tmElements_t tm - dette er struktur at vi vil fylle ut med den nåværende tiden; og RTC.read (tm) -funksjonen, som får tiden fra RTC-modulen, setter den inn i vår TM struktur, og kommer tilbake hvis alt gikk bra. Legg til feilsøkingen eller logikkoden din i "if" -uttalelsen, for eksempel å skrive ut tiden eller reagere på den.
Nå som du vet hvordan du får riktig tid med Arduino, kan du prøve å omskrive soloppgangalarmsprosjektet eller lage en LED-ordklokke - mulighetene er uendelige! Hva vil du lage?
Bildetillegg: Snootlab Via Flickr
James har en BSc i kunstig intelligens, og er CompTIA A + og Network + sertifisert. Han er hovedutvikler av MakeUseOf, og bruker fritiden sin på å spille VR paintball og brettspill. Han har bygd pc-er siden han var liten.