Jeffrey Cross
Jeffrey Cross

Aloittaminen reaaliaikaisten kellojen kanssa

Reaaliaikakello (RTC) on pohjimmiltaan aivan kuin kello - se toimii akulla ja pitää ajan sinulle, vaikka sähkökatkos olisi olemassa. Kun käytät projektissa RTC: tä, voit seurata pitkiä aikatauluja, vaikka ohjelmoit mikrokontrollerin uudelleen tai irrotat sen USB- tai virtapistokkeesta.

Useimmilla mikrokontrollereilla, mukaan lukien Arduino, on sisäänrakennettu ajastimen toiminto nimeltä millis (), ja siruun on myös asennettu ajastimia, jotka voivat seurata pidempiä aikoja, kuten minuutteja tai päiviä. Miksi haluat erillisen RTC-sirun? Suurin syy on se, että millis () seuraa vain ajan, kun Arduino oli viimeksi powered. Tämä tarkoittaa, että kun virta kytketään päälle, millisekunninen ajastin asetetaan takaisin arvoon 0. Arduino ei tiedä, että se on "tiistai" tai "8. maaliskuuta", kaikki se voi kertoa, että "se on ollut 14 000 millisekuntia siitä, kun olin viimeinen päälle. ”

OK, niin mitä jos haluat asettaa ajan Arduinolle? Sinun on ohjelmoitava päivämäärä ja kellonaika, ja voitte laskea sen siitä lähtien. Mutta jos se menettää voimansa, sinun on palautettava aika kuten halpa herätyskello: joka kerta, kun he menettävät tehonsa, ne vilkkuvat 12:00.

Vaikka tällainen perusajatus on hyvä joillekin projekteille, muiden projektien, kuten tiedonkeruulaitteiden, kellojen jne., Täytyy olla yhdenmukainen ajan mittaus, joka ei nollaudu, kun Arduinon akku kuolee tai se on ohjelmoitu uudelleen. Siten meillä on erillinen RTC! RTC on erikoistunut siru, joka vain seuraa aikaa. Se voi laskea hitaita vuosia, ja se tietää kuinka monta päivää on kuukaudessa. Huomaa, että se ei huolehdi kesäaikaan - koska se muuttuu paikasta toiseen, sinun on koodattava se tietylle alueelle tai asetukselle.

Tässä vanhempi tietokoneen emolevy, jossa on Dallas Semiconductorin reaaliaikakello (RTC), jota kutsutaan DS1387: ksi. Siellä on litiumparisto, minkä vuoksi se on niin suuri. ; CREDIT: Wikimedia Commons

RTC: n valitseminen

Valmistajat käyttävät yleisesti kolmea reaaliaikakelloa: PCF8523, DS1307 ja DS32231. Nämä ovat suuria akkukäyttöisiä RTC: itä, jotka ovat hyviä tiedonkeruun, kellorakenteen, aikaleiman, ajastimien ja hälytysten kannalta. Kukin kommunikoi kahden johtimen I2C-protokollan kautta. Niin kauan kuin siinä on kolikkokenno sen ajamiseksi, RTC: llä on iloisia vuosia.

»PCF8523 ei ole suuri tarkkuus - se voi menettää tai saada jopa 2 sekuntia päivässä - mutta se on halvin kolmesta. Ja se toimii 3.3V tai 5V teholla ja logiikalla.

»DS1307 on yleisin; se ei ole myöskään tarkkaa, mutta se on edullinen ja helppo juottaa. Se toimii parhaiten 5V-pohjaisilla mikrokontrollereilla kuten Arduino; se vaatii 5 V: n virtaa, vaikka se voi toimia 3,3 V: n logiikalla.

»DS3231-tietolomakkeessa selitetään, että tämä lämpötilakompensoitu siru on“ erittäin tarkka I²C-integroitu RTC / TCXO / Crystal ”. Ja hei, se tekee juuri sen, mitä se sanoo tinasta! Tämä RTC on tarkin, jonka saat pieneen pienitehoiseen pakettiin, ja se toimii 3,3 V: n tai 5 V: n levyillä.

DS3231: n käyttäminen

Useimmat RTC: t käyttävät ulkoista 32 kHz: n ajokiteä pitämään aikaa alhaisella virrankulutuksella. Kaikki on hyvin ja hyvä, mutta näillä kiteillä on lievä juoksu, varsinkin kun lämpötila muuttuu - lämpötila vaikuttaa värähtelytaajuuteen hyvin, hyvin vähän, mutta se lisää. DS3231 on kirkas paketti, koska kide on sirun sisällä! Ja aivan integroidun kiteen vieressä on lämpötila-anturi. Anturi kompensoi taajuuden muutokset lisäämällä tai poistamalla kellon punkkeja niin, että ajanotto pysyy aikataulussa.

Adafruit tarjoaa DS3231: lle pienikokoisen, leipäkorttiystävällisen katkaisulaudan. Kun CR1220-kolikko on liitetty takapaneeliin, voit saada vuosien tarkkuuden ajankohdan, vaikka päävirta katoaisi. Voit juottaa mukana toimitetun otsikon pistorasiaan leipälevyyn tai juottaa johdot suoraan tyynyihin.

DS3231 Pinout

Power Pins • Vin - Virtatappi. Koska RTC: tä voidaan käyttää 2,3 V: n ja 5,5 V: n välillä, sinun ei tarvitse säätää tai tasokytkintä 3,3 V: n tai 5 V: n logiikan / tehon käyttämiseksi. Anna tällä aluksella sama teho kuin mikrokontrollerin logiikkatasolla - esim. 5 V: n mikropiirillä, kuten Arduino, käytä 5V: tä. • GND - Yhteinen valta ja logiikka. I2C-logiikkatapit • SCL-I2C-kellotappi, liitä mikrokontrollerin I2C-kelloriviin. Tässä tapissa on 10K: n vedonpoistovastus Vinille. • SDA - I2C-datatappi, liitä mikrokontrollerin I2C-tietolinjaan. Myös 10K pullupistolla on Vin. Muut nastat • BAT - Tämä on sama yhteys akun positiiviseen tyynyyn. Käytä tätä, jos haluat käyttää jotain muuta kolikkosolusta tai varmuuskopioida erillisestä akusta. VBat voi olla välillä 2,3V ja 5,5V ja DS3231 siirtyy päälle, kun Vin-teho häviää. • 32K - 32 kHz: n oskillaattorin lähtö. Avaa tyhjennys, joten sinun täytyy liittää pullup, jotta tämä signaali voidaan lukea suoraan mikrokontrollerin nasta. • SQW - Valinnainen neliöaalto tai keskeytys. Avaa jälleen viemäri, liitä vedos lukemaan tämä signaali mikrokontrollerin tapista. • RST - Tämä on hieman erilainen kuin useimmat RST-nastat; sen sijaan, että olisit vain tulo, se on suunniteltu käytettäväksi ulkoisen laitteen nollaamiseen tai ilmoittaakseen, milloin päävirta katoaa. Avaa tyhjennys, mutta siinä on sisäinen 50K-pullup. Vedonpoisto pitää tämän pinjännitteen korkean niin kauan kuin Vin on läsnä. Kun Vin putoaa ja siru siirtyy akun varmuuskopiointiin, tämä tappi menee alhaiseksi.

Jos käytät RTC: tä jossain viileämmässä, tutustu Chris Fastien vertailuun siitä, kuinka neljä DS3221-sirun (ja niiden paristojen) versiota toimivat hyvin alhaisissa lämpötiloissa.

Arduino Käyttö

Voit helposti levittää tämän katkoksen mihin tahansa mikrokontrolleriin; täällä käytämme Arduinoa (kuva TK). Muille mikrokontrollereille varmista, että siinä on I2C, ja siirrä sitten koodi - se on melko yksinkertaista!

Hups, poistin Arduinon 5V nastan virtalangan Vinboard-levylle ennen tämän kuvan ottamista, älä unohda sitä!

Yhdistä Vin virtalähteeseen, 3V – 5V on hyvä. Käytä samaa jännitettä kuin mikrokontrollerin logiikka; useimmille Arduinosille, se on 5V. Kytke GND yhteiseen virtalähteeseen. Kytke SCL-tappi Arduinon I2C-kellon SCL-nastaan. Unossa ja muissa Atmega328-pohjaisissa Arduinosissa tämä tunnetaan myös nimellä A5; Mega: n digitaalinen 21; ja Leonardo tai Micro, digitaalinen 3. Liitä SDA-nastat Arduinon I2C-tietojen SDA-nastaan. Unossa ja muissa 328-luvuissa tämä tunnetaan myös nimellä A4; Mega-laitteessa on digitaalinen 20; ja Leonardo / Micro, digitaalinen 2. TÄRKEÄÄ: DS3231: n oletusarvoinen I2C-osoite on 0x68 eikä sitä voida muuttaa.

Lataa RTClib Voit aloittaa DS3231: n käyttämisen tarvitsemalla Arduino-kirjaston, jonka avulla saat aikaa ja aikaa RTC: ltä. Käytämme JeeLabin erinomaista RTClib-haarukkaa - versio on hieman erilainen, joten käytä vain tätä DS3231-breakoutia varmistaaksesi, että se on yhteensopiva!

Lataa Adafruitin RTClib Github-arkistosta osoitteesta github.com/adafruit/RTClib.

Nimeä pakkaamaton kansio RTClib ja tarkista, että RTClib-kansiossa on RTClib.cpp ja RTClib.h.

Aseta RTClib-kirjaston kansio [arduinosketchfolder] / kirjastoon / kansioon. (Kirjastojen alikansio on ehkä luotava, jos se on ensimmäinen kirjasto.)

Käynnistä IDE uudelleen.

Meillä on myös hyvä opetusohjelma Arduino-kirjaston asennuksesta Adafruit.comiin

Ensimmäinen RTC-testisi Ensimmäinen asia, jonka osoitamme, on testikuvio, joka lukee RTC: stä kerran sekunnissa. Näytämme myös, mitä tapahtuu, jos poistat akun ja vaihdat sen, koska se saa RTC: n pysähtymään. Joten aloittaa, poista akku pidikkeestä (kuva TK), kun taas Arduino ei ole virtalähteenä tai kytkettynä USB: hen. Odota 3 sekuntia ja vaihda akku. Tämä palauttaa RTC-sirun.

Lataa demo-piirros Arduino IDE: ssä avaa Tiedosto → Esimerkit → RTClib → ds3231 ja lataa se Arduinoon, joka on kytketty RTC: hen.

Tarkista nyt Serial Monitor -konsoli 9600 baudilla. Muutaman sekunnin kuluttua näet, että Arduino huomasi, että tämä on ensimmäinen kerta, kun DS3231 on kytketty päälle, ja asettaa ajan Arduino-luonnoksen perusteella.

Irrota Arduino plus RTC -liitäntä muutaman sekunnin (tai minuutin tai tunnin tai viikon) ajan ja kytke se takaisin.

Seuraavan kerran, kun suoritat sen, et saa samaa "RTC-menetettyä virtaa" -viestiä, vaan se tulee heti ja kertoo oikean ajan!

Tästä lähtien sinun ei tarvitse asettaa aikaa uudelleen. Akku kestää 5 vuotta tai enemmän.

Ajan lukeminen Nyt kun RTC on iloisesti valinnut pois, haluamme kysyä sen ajan. Katsokaamme luonnosta uudelleen nähdäksesi, miten tämä tehdään.

void loop () {DateTime now = rtc.now (); Serial.print (now.year (), 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 ();

On aika vain yksi tapa saada aika käyttäen RTClib-toimintoa, joka on nyt soitettava (), funktio, joka palauttaa DateTime-objektin, joka kuvaa vuoden, kuukauden, päivän, tunnin, minuutin ja toisen, kun soitit nyt () .

On olemassa joitakin RTC-kirjastoja, joiden sijaan sinä kutsut jotain RTC.year () ja RTC.hour (), jotta saat nykyisen vuoden ja tunnin. On kuitenkin olemassa yksi ongelma, jos jos kysytte hetken oikeana kello 3:14:59 juuri ennen seuraavan minuutin rullaamista, ja sitten toinen heti minuutin jälkeen rullaa (niin 3:15:00) sinä ” Näen aikaa 3:14:00, joka on minuutti pois. Jos teit sen toisin päin, saatat saada 3:15:59 - niin yhden minuutin pois toisesta suunnasta.

Koska tämä ei ole erityisen epätodennäköinen tapahtuma - varsinkin jos etsit aikaa melko usein - otamme "hetkellisen kuvan" ajasta RTC: stä kerralla ja sitten voimme vetää sen erilleen päivään () tai toiseen () kuten yllä. Se on vähän enemmän vaivaa, mutta mielestämme on syytä välttää virheitä!

Voimme myös saada aikaleiman DateTime-objektista soittamalla unixtime (), joka laskee sekuntien lukumäärän (ei lasketa harppaus sekuntia) 1. tammikuuta 1970 puolenyön jälkeen:

Serial.print ("keskiyön jälkeen 1/1/1970 ="); Serial.print (now.unixtime ()); Serial.print ("s ="); Serial.print (now.unixtime () / 86400L); Serial.println ( "d");

Koska päivässä on 60 * 60 * 24 = 86 400 sekuntia, voimme helposti laskea päiviä sitten. Tämä voi olla hyödyllistä, kun haluat seurata, kuinka paljon aikaa on kulunut viimeisen kyselyn jälkeen, jolloin jotkut matematiikat ovat paljon helpompia. Jos haluat tarkistaa, onko se ollut 5 minuuttia myöhemmin, katso, onko unixtime () kasvanut 300: lla eikä sinun tarvitse huolehtia tuntien muutoksista.


Mennä kauemmas

CircuitPython - DS3231 RTC: n käyttö on helppoa myös CircuitPythonilla! Githubissa on kätevä moduuli, johon voit ladata levyn ja aloittaa asetusten asettamisen ja lukemisen Python-koodilla. Tuo vain DS3231-moduuli, luo luokkakohde ja tee vuorovaikutusta sen datetime-ominaisuuden kanssa asettaaksesi ja saamaan aikaa (kuva TK)! Lisätietoja täältä.

Raspberry Pi - Erittäin edullinen Pi puuttuu RTC: stä; se noutaa ajan Internetin NTP (Network Time Protocol) -palvelimista. Erillisissä projekteissa on helppo yhdistää RTC. Varmista, että käytät päivitettyä ydintä RTC-ohjaimilla, ota I2C käyttöön ja lisää RTC: n /boot/config.txt, esim. dtoverlay = I2C-rtc, ds3231. Poista sitten fake-hwclock-paketti ja muokkaa todellista laitteistokelloa / lib / udev / hwclock-setiä käyttämään RTC: täsi. Lisätietoja täältä.

Osake

Jättänyt Kommenttia