Kom i gang med realtidsur - 💡 Fix My Ideas

Kom i gang med realtidsur

Kom i gang med realtidsur


Forfatter: Ethan Holmes, 2019

En realtids ur (RTC) chip er stort set ligesom et ur - det kører på et batteri og holder tid til dig selv når der er strømafbrydelse. Ved hjælp af en RTC i dit projekt kan du holde øje med lange tidslinjer, selvom du omprogrammerer din mikrocontroller eller afbryder den fra USB eller dens stikkontakt.

De fleste mikrocontrollere, herunder Arduino, har en indbygget tidsregistreringsfunktion kaldet millis (), og der er også timere indbygget i chipen, der kan holde styr på længere tidsperioder som minutter eller dage. Så hvorfor vil du have en separat RTC chip? Nå, den største årsag er, at millis () kun holder øje med tiden siden Arduino blev drevet sidst. Det betyder, at når strømmen er tændt, er millisekund timeren sat tilbage til 0. Arduino ved ikke, at det er "tirsdag" eller "8. marts," alt det kan fortælle er "det har været 14.000 millisekunder siden jeg var sidste tændt."

OK, så hvad hvis du ville sætte tiden på Arduino? Du skal programmere i dato og klokkeslæt, og du kan få det til at tælle fra det tidspunkt. Men hvis det taber magt, skal du nulstille tiden som et billigt vækkeur: hver gang de mister strøm blinker de 12:00.

Selvom denne slags grundlæggende tidsvisning er ok for nogle projekter, skal andre projekter som dataloggere, ure osv. Have en ensartet tidshorisont, der ikke nulstilles, når Arduino batteriet dør eller det omprogrammeres. Således indgår vi en separat RTC! RTC er en specialiseret chip, der bare holder øje med tiden. Det kan tælle springår, og det ved, hvor mange dage der er i hver måned. Bare bemærk, at det ikke tager sig af sommertid - fordi det skifter fra sted til sted, skal du kode det for din specifikke region eller præference.

Her er en ældre computer bundkort med en Dallas Semiconductor realtid ur (RTC) kaldet DS1387. Der er et lithiumbatteri derinde, hvorfor det er så stort. ; KREDIT: Wikimedia Commons

Valg af en RTC

Tre realtidsure anvendes almindeligvis af producenter: PCF8523, DS1307 og DS32231. Disse er gode batteribackede RTC'er, der er gode til datalogning, urbygning, tidsstempling, timere og alarmer. Hver kommunikerer via to-wire I2C-protokollen. Så længe det har en møntcelle til at køre det, vil din RTC glædelig mærke sammen i årevis.

»PCF8523 er ikke høj præcision - det kan tabe eller øge op til 2 sekunder om dagen - men det er den billigste af de tre. Og det virker med 3.3V eller 5V strøm og logik.

»DS1307 er den mest almindelige; Det er heller ikke høj præcision, men det er billigt og let at lodde. Det fungerer bedst med 5V-baserede mikrocontrollere som Arduino; det kræver 5V strøm, selvom det kan fungere med 3,3V logik.

»DS3231-databladet forklarer, at denne temperaturkompenserede chip er en" Ekstremt nøjagtig I²C-integreret RTC / TCXO / Crystal. "Og hej, det gør præcis det, der står på tin! Denne RTC er den mest præcise, du kan få i en lille, lav-power-pakke, og den fungerer med 3,3 V eller 5 V boards.

Brug af DS3231

De fleste RTC'er bruger en ekstern 32kHz timing krystal for at holde tid med lavt strømdrag. Det er alt godt og godt, men disse krystaller har en svag drift, især når temperaturen ændrer sig - temperaturen påvirker svingningsfrekvensen meget, meget lidt, men det tillægges. DS3231 er i en kølig pakke, fordi krystal er inde i chippen! Og lige ved siden af ​​den integrerede krystal er en temperatursensor. Den sensor kompenserer for frekvensændringerne ved at tilføje eller fjerne klokketre, så timetiden forbliver på skemaet.

Adafruit tilbyder DS3231 i et kompakt, breadboard-venligt breakout bord. Med en CR1220 møntcelle, der er tilsluttet til bagsiden, kan du få mange præcisionstidsopgaver, selv når strømmen går tabt. Du kan lodde den medfølgende hoved til at sætte den i et brødbræt, eller bare loddetrådene direkte til puderne.

DS3231 Pinout

Power Pins • Vin - Strømstiften. Da RTC kan drives fra 2,3V til 5,5V strøm, har du ikke brug for en regulator eller et niveau skifter til at bruge 3.3V eller 5V logik / strøm. Bare giv dette board samme effekt som din mikrocontrollers logikniveau - for eksempel for en 5V mikro som Arduino, brug 5V. • GND - Fælles grundlag for strøm og logik. I2C Logic Pins • SCL - I2C klokke pin, tilslut til din microcontroller's I2C ur linje. Denne pin har en 10K pullup modstand til Vin. • SDA - I2C datapind, tilslutt til din mikrocontrollerens I2C datalinje. Har også en 10K pullup modstand til Vin. Andre stifter • BAT - Dette er den samme forbindelse som batteriets positive pude. Brug dette, hvis du vil strømme noget andet fra møntcellen, eller give batteribackup fra et separat batteri. VBat kan være mellem 2,3V og 5,5V og DS3231 vil skifte over, når hovedvin-strømmen går tabt. • 32K - 32kHz oscillator udgang. Åbn dræning, så du skal vedhæfte en pullup for at læse dette signal direkte fra en microcontroller pin. • SQW - Valgfri firkantbølge eller afbryd output. Igen, åben dræn, vedhæft en pullup for at læse dette signal fra en microcontroller pin. • RST - Denne ene er lidt anderledes end de fleste RST-stifter; snarere end blot at være en indgang, er den designet til at blive brugt til at nulstille en ekstern enhed eller angive, hvornår strømmen går tabt. Åben dræn, men har en intern 50K pullup. Pullup holder denne pin spænding høj, så længe Vin er til stede. Når vin falder, og chippen skifter til batteri backup, går denne pin lav.

Hvis du vil deployere din RTC et eller andet sted køligere end køligt, så sjekk Chris Fasties sammenligning af, hvordan fire varianter af DS3221-chip (og deres batterier) udfører ved meget lave temperaturer.

Arduino brug

Du kan nemt lede denne breakout til enhver microcontroller; her bruger vi en Arduino (Figur TK). For andre mikrocontrollere skal du bare sørge for, at den har I2C, og tag derefter koden - det er ret enkle ting!

Ups, jeg fjernede strømkablet fra Arduino 5V pin til breadboard Vin rail før du tager dette billede, glem det ikke!

Tilslut Vin til strømforsyningen, 3V-5V er fint. Brug den samme spænding som din mikrocontroller logik; for de fleste Arduinos, det er 5V. Tilslut GND til almindelig strøm / data jord. Tilslut SCL-stiften til I2C-klokken SCL-stiften på din Arduino. På en Uno og andre Atmega328-baserede Arduinos er dette også kendt som A5; på en Mega er det digitalt 21; og på en Leonardo eller Micro digital 3. Forbind SDA-stiften til I2C-data SDA-pin på din Arduino. På en Uno og andre 328'er er dette også kendt som A4; på en Mega er det digitalt 20; og på en Leonardo / Micro, digital 2. VIGTIGT: DS3231 har en standard I2C-adresse på 0x68 og kan ikke ændres.

Download RTClib For at begynde at bruge din DS3231, skal du bruge et Arduino bibliotek til at få og indstille tid fra en RTC. Vi bruger en gaffel af JeeLabs fremragende RTClib - vores version er lidt anderledes, så brug kun vores med denne DS3231 breakout for at sikre, at den er kompatibel!

Download Adafruit's RTClib fra vores Github-depot på github.com/adafruit/RTClib.

Omdøb den ukomprimerede mappe RTClib og kontroller, at RTClib-mappen indeholder RTClib.cpp og RTClib.h.

Placer RTCLib bibliotek mappen i din [arduinosketchfolder] / biblioteker / mappe. (Det kan være nødvendigt at oprette bibliotekets undermappe, hvis det er dit første bibliotek.)

Genstart IDE'en.

Vi har også en god tutorial på Arduino bibliotek installation på Adafruit.com

Din første RTC-test Det første, vi skal demonstrere, er en testskitse, der vil læse tiden fra RTC en gang pr. Sekund. Vi viser også, hvad der sker, hvis du fjerner batteriet og udskifter det, da det medfører, at RTC stopper. For at starte, fjern batteriet fra holderen (Figur TK), mens Arduino ikke er tilsluttet eller tilsluttet USB. Vent 3 sekunder, og udskift derefter batteriet. Dette nulstiller RTC-chip.

Indlæs demo skitse I Arduino IDE skal du åbne Fil → Eksempler → RTClib → ds3231 og uploade det til din Arduino, koblet op til RTC.

Kontroller nu Serial Monitor-konsollen ved 9600 baud. Efter et par sekunder vil du se den rapport, som Arduino bemærkede dette er første gang DS3231 er sat op og sætter tiden baseret på Arduino-skitsen.

Træk din Arduino plus RTC i nogle få sekunder (eller minutter eller timer eller uger) og tilslut igen.

Næste gang du kører det, får du ikke den samme "RTC lost power" besked, men det kommer straks og fortæller dig den rigtige tid!

Fra nu af er du ikke nødt til at indstille tiden igen. Batteriet varer 5 eller flere år.

Læsning af tiden Nu, hvor RTC er glædelig tikkende væk, vil vi gerne spørge om det for tiden. Lad os se på skissen igen for at se, hvordan dette er gjort.

void loop () {DateTime now = rtc.now (); Serial.print (nu.år (), DEC); Serial.print ( '/'); Serial.print (now.month (), DEC); Serial.print ( '/'); Serial.print (now.day (), DEC); Serial.print ("("); Serial.print (daysOfTheWeek [now.dayOfTheWeek ()]); Serial.print (")"); Serial.print (now.hour (), DEC); Serial.print ( ':'); Serial.print (now.minute (), DEC); Serial.print ( ':'); Serial.print (now.second (), DEC); Serial.println ();

Der er stort set kun en måde at få tiden til at bruge RTClib, som skal ringes nu (), en funktion, der returnerer en DateTime-objekt, der beskriver år, måned, dag, time, minut og sekund, når du ringede nu () .

Der er nogle RTC biblioteker, der i stedet har dig til at kalde noget som RTC.year () og RTC.hour () for at få det aktuelle år og time. Men der er et problem, hvor hvis du tilfældigvis beder om minut lige om 3:14:59 lige før næste minut ruller over, og så den anden lige efter minut ruller over (så kl 3:15:00) ll se tiden som 3:14:00 som er et minut væk. Hvis du gjorde det, kunne den anden vej omkring dig få 3:15:59 - så et minut væk i den anden retning.

Fordi dette ikke er en særlig usandsynlig begivenhed - især hvis du spørger tiden temmelig ofte - tager vi et "snapshot" af tiden fra RTC på en gang, og så kan vi trække det fra hinanden i dag () eller anden () som set ovenfor. Det er en lille smule mere indsats, men vi synes det er værd at undgå fejl!

Vi kan også få en "tidsstempel" ud af DateTime-objektet ved at kalde unixtime (), som tæller antallet af sekunder (ikke tæller spring sekunder) siden midnat 1. januar 1970:

Serial.print ("siden midnat 1/1/1970 ="); Serial.print (now.unixtime ()); Serial.print ("s ="); Serial.print (nu.unixtime () / 86400L); Serial.println ( "d");

Da der er 60 * 60 * 24 = 86.400 sekunder om dagen, kan vi nemt tælle dage siden da også. Dette kan være nyttigt, når du vil holde øje med, hvor meget tid der er gået siden sidste forespørgsel, hvilket gør nogle matte meget nemmere. For øjeblikket, for at kontrollere om det har været 5 minutter senere, skal du se, om unixtime () er steget med 300, og du behøver ikke bekymre dig om timers ændringer.


Går videre

CircuitPython - Det er nemt at bruge DS3231 RTC med CircuitPython også! Der er et praktisk modul på Github, du kan indlæse på et bord og begynde at indstille og læse tiden med Python kode. Du skal blot importere DS3231-modulet, oprette en forekomst af klassen og interagere med dens datetime-egenskab for at indstille og få tiden (figur TK)! Lær mere her.

Raspberry Pi - Den ultra-lave pris Pi mangler en RTC; det henter tiden fra internets NTP-servere (Network Time Protocol) i stedet. For selvstændige projekter er det nemt at forbinde en RTC. Sørg for, at du kører en opdateret kerne med RTC-drivere, aktiver I2C, og tilføj din RTC til /boot/config.txt, f.eks. dtoverlay = i2c-RTC, ds3231. Fjern derefter fake-hwclock-pakken og rediger det ægte hardware ur script / lib / udev / hwclock-sæt for at bruge din RTC i stedet. Lær mere her.



Du Kan Være Interesseret

Shenzhen forbereder største producent Faire i Asien

Shenzhen forbereder største producent Faire i Asien


En skabers misadventures i lufthavnssikkerhed

En skabers misadventures i lufthavnssikkerhed


Affaldsmæssigt markedsselskab

Affaldsmæssigt markedsselskab


Over de øverste boligindretninger til Halloween

Over de øverste boligindretninger til Halloween






Seneste Indlæg