At holde tid på Arduino-projekter er ikke så let, som du måske tror: Når computerforbindelsen ikke er der, stopper din unpowered Arduino blot med at køre, herunder den interne ticker.
For at holde din Arduino synkroniseret med verden omkring det, skal du bruge hvad der hedder et "Real Time Clock-modul". Sådan bruger du en.
Hvad er meningen med et Real Time Clock (RTC)?
Din computer synkroniserer sandsynligvis sin tid med internettet, men det har stadig et internt ur, der fortsætter selv uden en internetforbindelse eller strømmen er slukket. Når du bruger en Arduino tilsluttet en computer, har den adgang til præcis tid, der leveres af dit systemur. Det er temmelig nyttigt, men de fleste Arduino-projekter er designet til at blive brugt væk fra en computer - på hvilket tidspunkt, når strømmen frakobles, eller Arduino genstartes, har den absolut ingen ide om, hvor lang tid det er. Det interne ur vil blive nulstillet og begynde at tælle fra nul igen, næste gang det er tændt.
Hvis dit projekt har noget at gøre med at have brug for tiden - f.eks. Min natlys og solopgang vækkeur Arduino Night Light og Sunrise Alarm Project Arduino Night Light og Sunrise Alarm Project i dag, vil vi lave et solopgang vækkeur, som forsigtigt og langsomt vække dig uden at ty til en offensiv støjdannende maskine. Læs mere - dette vil helt klart være et problem. I dette projekt kom vi rundt om problemet ved manuelt at indstille tiden hver nat på en ret rå måde - brugeren ville trykke på nulstillingsknappen lige før de gik i seng, hvilket gav en manuel tidssynkronisering. Det er klart, at det ikke er en ideel langtidsløsning.
Et RTC-modul er en ekstra smule kredsløb, der kræver et lille møntcellebatteri, som fortsætter med at tælle tiden, selvom din Arduino er slukket. Efter at være indstillet en gang - det vil holde den tid til batteriets levetid, normalt et godt år eller deromkring.
TinyRTC
Den mest populære RTC for Arduino kaldes TinyRTC og kan købes for omkring $ 5- $ 10 på eBay. Du vil højst sandsynligt skulle forsyne dit eget batteri (det er ulovligt at sende disse oversøiske til mange steder), og nogle overskrifter (de stifter, der springer ind i hullerne, som du skal lodde i dig selv).
Dette er modulet jeg har:
Det har endda en indbygget temperatursensor, selv om batteriet holder længere, hvis du ikke bruger det.
Antallet af huller på den ting ser ret skræmmende ud, men du har kun brug for fire af dem; GND, VCC, SCL og SDA - du kan bruge de relevante stifter på hver side af RTC-modulet. Du taler med uret ved hjælp af I2C-protokollen, hvilket betyder, at der kun anvendes to ben - en til "uret" (et serielt kommunikationsdataklip, intet at gøre med tiden) og en for dataene. Faktisk kæler du endda op til 121 I2C-enheder på de samme to stifter - tjek denne Adafruit-side for et udvalg af andre I2C-enheder, du kan tilføje, fordi der er meget!
Kom i gang
Tilslut dit TinyRTC-modul i henhold til nedenstående diagram - den rosa DS-linje er ikke nødvendig, som det er for temperatursensoren.
Derefter downloades Time og DS1307RTC biblioteker og placer de resulterende mapper i din / biblioteksmappen .
Afslut og genstart Arduino miljøet for at indlæse i biblioteker og eksempler.
Du finder to eksempler på DS1307RTC-menuen: Upload og kør SetTime- eksemplet først - dette vil indstille RTC til den korrekte tid. Den egentlige kode er ikke værd at gå i detaljer med, bare ved at du skal køre det en gang for at udføre den første tidssynkronisering.
Herefter skal du se på eksempelbruget 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
Bemærk, at vi også har inkluderet det centrale Wire.h bibliotek - dette kommer med Arduino og bruges til kommunikation via I2C. Upload koden, åbn seriekonsollen på 9600 baud, og se, og din Arduino udsender den aktuelle tid hvert sekund. Vidunderlig!
Den vigtigste kode i eksemplet er at oprette en tmElements_t tm - dette er en struktur, som vi vil fylde med den aktuelle tid; og RTC.read (tm) -funktionen, som får den aktuelle tid fra RTC-modulet, sætter den ind i vores tm- struktur og returnerer sandt, hvis alt gik godt. Tilføj din fejlretnings- eller logikkode indenfor denne "if" -opgørelse, som f.eks. At udskrive tiden eller reagere på den.
Nu hvor du ved, hvordan du får den rette tid med Arduino, kan du prøve at omskrive solopgangalarmprojektet eller skabe et LED-ordklok - mulighederne er uendelige! Hvad vil du lave?
Billedkreditter: Snootlab Via Flickr