Sisällysluettelo:

DS1307- ja DS3231-reaaliaikaisten kellomoduulien käyttäminen Arduinolla: 3 vaihetta
DS1307- ja DS3231-reaaliaikaisten kellomoduulien käyttäminen Arduinolla: 3 vaihetta

Video: DS1307- ja DS3231-reaaliaikaisten kellomoduulien käyttäminen Arduinolla: 3 vaihetta

Video: DS1307- ja DS3231-reaaliaikaisten kellomoduulien käyttäminen Arduinolla: 3 vaihetta
Video: DS1307 Real Time Clock RTC, Arduino Nano and the Recycled DVD 7 Segment LED Display 2024, Heinäkuu
Anonim
DS1307- ja DS3231-reaaliaikaisten kellomoduulien käyttö Arduinon kanssa
DS1307- ja DS3231-reaaliaikaisten kellomoduulien käyttö Arduinon kanssa
DS1307- ja DS3231-reaaliaikaisten kellomoduulien käyttäminen Arduinon kanssa
DS1307- ja DS3231-reaaliaikaisten kellomoduulien käyttäminen Arduinon kanssa

Saamme jatkuvasti pyyntöjä DS1307- ja DS3231-reaaliaikaisten kellomoduulien käyttämisestä Arduinon kanssa eri lähteistä-joten tämä on ensimmäinen kahden osan opetusohjelma niiden käytöstä. Tätä Arduino-opetusohjelmaa varten meillä on kaksi reaaliaikaista kellomoduulia, joista toinen perustuu Maxim DS1307: een (neliömoduuli) ja DS3231 (suorakulmainen moduuli).

Reaaliaikaisten kellomoduulien IC: iden välillä on kaksi pääasiallista eroa, mikä on ajan pitämisen tarkkuus. Ensimmäisessä moduulissa käytetty DS1307 toimii erittäin hyvin, mutta ulkoinen lämpötila voi vaikuttaa DS1307: n sisäistä laskuria käyttävän oskillaattoripiirin taajuuteen.

Tämä saattaa kuulostaa ongelmalta, mutta yleensä se johtaa siihen, että kello on pois päältä noin viisi minuuttia kuukaudessa. DS3231 on paljon tarkempi, koska siinä on sisäinen oskillaattori, joka ei vaikuta ulkoisiin tekijöihin - ja siten se on tarkka enintään muutaman minuutin vuodessa. Jos sinulla on DS1307-moduuli- älä tunne pahaa, se on silti hyvä arvolevy ja palvelee sinua hyvin. Molemmissa moduuleissa tarvitaan vara -akku.

On hyvä idea ostaa uusi CR2032 -akku ja asentaa se moduuliin. Kellonajan ja päivämäärän seurannan lisäksi näissä moduuleissa on myös pieni EEPROM, hälytystoiminto (vain DS3231) ja kyky tuottaa eri taajuuksisia neliöaaltoja-joista kaikista tulee toinen opetusohjelma.

Vaihe 1: Yhdistä moduuli Arduinoon

Molemmat moduulit käyttävät I2C -väylää, mikä tekee liitännästä erittäin helppoa.

Ensin sinun on tunnistettava, mitä Arduino- tai yhteensopivien korttien nastoja käytetään I2C -väylään - nämä tunnetaan nimillä SDA (tai data) ja SCL (tai kello). Arduino Unossa tai yhteensopivilla levyillä nämä nastat ovat A4 ja A5 dataa ja kelloa varten; Arduino Megassa nastat ovat D20 ja D21 dataa ja kelloa varten; ja jos käytät Pro Mini -yhteensopivaa, nastat ovat A4 ja A5 tietoja ja kelloa varten, jotka ovat yhdensuuntaisia päätappien kanssa.

DS1307 -moduuli

Jos sinulla on DS1307 -moduuli, sinun on juotettava johdot levylle tai juotettava joihinkin sisäisiin otsikkotappeihin, jotta voit käyttää hyppyjohtimia. Liitä sitten SCL- ja SDA -nastat Arduinoosi ja Vcc -nasta 5 V: n napaan ja GND GND: hen.

DS3231 -moduuli

Tämän moduulin liittäminen on helppoa, koska otsikkotapit on asennettu levylle tehtaalla. Voit yksinkertaisesti käyttää hyppyjohtoja uudelleen SCL: stä ja SDA: sta Arduinoon ja uudelleen moduulin Vcc- ja GND -nastoista korttisi 5 V: n tai 3.3. V: n ja GND: n. Nämä ovat kuitenkin päällekkäisiä toisella puolella omien johtojen juottamiseksi. Molemmissa moduuleissa on vaaditut vetovastukset, joten sinun ei tarvitse lisätä omia. Kuten kaikki I2C -väylään kytketyt laitteet, yritä pitää SDA- ja SCL -johtimien pituus mahdollisimman pienenä.

Vaihe 2: Ajan lukeminen ja kirjoittaminen RTC -moduulista

Kun olet kytkenyt RTC -moduulin. kirjoita ja lähetä seuraava luonnos. Vaikka luonnoksen huomautukset ja toiminnot koskevat vain DS3231: tä, koodi toimii myös DS1307: n kanssa.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Muunna normaalit desimaaliluvut binäärikoodatuksi desimaalitavuiksi decToBcd (tavu val) {return ((val/10*16) + (val%10)); } // Muunna binäärikoodattu desimaali normaaliksi desimaaliluvuksi tavuksi bcdToDec (tavu val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Sarja.alku (9600); // Aseta aloitusaika tähän: // DS3231 sekuntia, minuuttia, tuntia, päivä, päivämäärä, kuukausi, vuosi // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (tavu sekunti, tavu minuutti, tavu tunti, tavu dayOfWeek, tavu dayOfMonth, tavu kuukausi, tavuvuosi) {// asettaa aika- ja päivämäärätiedot DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // aseta seuraava tulo aloittamaan sekuntirekisteristä Wire.write (decToBcd (toinen)); // aseta sekunnit Wire.write (decToBcd (minuutti)); // aseta minuutit Wire.write (decToBcd (tunti)); // aseta tunnit Wire.write (decToBcd (dayOfWeek)); // aseta viikonpäivä (1 = sunnuntai, 7 = lauantai) Wire.write (decToBcd (dayOfMonth)); // aseta päivämäärä (1-31) Wire.write (decToBcd (kuukausi)); // aseta kuukausi Wire.write (decToBcd (vuosi)); // aseta vuosi (0-99) Wire.endTransmission (); } void readDS3231time (tavu *sekunti, tavu *minuutti, tavu *tunti, tavu *dayOfWeek, tavu *dayOfMonth, tavu *kuukausi, tavu *vuosi) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // aseta DS3231 -rekisteriosoittimen arvoksi 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // pyytää seitsemää tavua dataa DS3231: ltä alkaen rekisteristä 00h *second = bcdToDec (Wire.read () & 0x7f); *minuutti = bcdToDec (Wire.read ()); *tunti = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *kuukausi = bcdToDec (Wire.read ()); *vuosi = bcdToDec (Wire.read ()); } void displayTime () {tavu sekunti, minuutti, tunti, dayOfWeek, dayOfMonth, kuukausi, vuosi; // noutaa tietoja DS3231 -lukemasta DS3231time (& toinen, & minuutti, & tunti, & dayOfWeek, & dayOfMonth, & month, & year); // lähetä se sarjamonitorille Serial.print (tunti, DEC); // muuntaa tavumuuttujan desimaaliluvuksi Serial.print (":"); if (minuutti <10) {Sarjajälki ("0"); } Sarjajälki (minuutti, DEC); Serial.print (":"); jos (toinen <10) {Sarjajälki ("0"); } Sarjajälki (toinen, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Sarjanjälki (kuukausi, DEC); Serial.print ("/"); Sarjanjälki (vuosi, DEC); Serial.print ("Viikonpäivä:"); switch (dayOfWeek) {tapaus 1: Serial.println ("Sunday"); tauko; tapaus 2: Serial.println ("maanantai"); tauko; tapaus 3: Serial.println ("tiistai"); tauko; tapaus 4: Serial.println ("keskiviikko"); tauko; tapaus 5: Serial.println ("torstai"); tauko; tapaus 6: Serial.println ("perjantai"); tauko; tapaus 7: Serial.println ("lauantai"); tauko; }} void loop () {displayTime (); // näyttää reaaliaikaiset kellotiedot sarjamonitorissa, viive (1000); // joka sekunti }

Koodia voi olla paljon, mutta se hajoaa hyvin hallittaviin osiin.

Se sisältää ensin Wire -kirjaston, jota käytetään I2C -väylän viestintään, ja sen jälkeen RTC: n väyläosoite on 0x68. Näitä seuraa kaksi toimintoa, jotka muuntavat desimaaliluvut BCD: ksi (binäärikoodatut desimaalit) ja päinvastoin. Nämä ovat välttämättömiä, koska RTC -IC: t toimivat BCD: ssä eivätkä desimaalit.

Toimintoa setDS3231time () käytetään kellon asettamiseen. Sen käyttäminen on erittäin helppoa, yksinkertaista lisätä arvot vuodesta toiseen toiseen, ja RTC alkaa siitä lähtien. Jos haluat esimerkiksi asettaa seuraavan päivämäärän ja kellonajan - keskiviikko 26. marraskuuta 2014 ja kello 21.42 ja 30 sekuntia - käytä seuraavaa:

setDS3231time (30, 42, 21, 4, 26, 11, 14);

Vaihe 3:

Huomaa, että aika asetetaan käyttämällä 24 tunnin aikaa ja neljäs parametri on”viikonpäivä”. Tämä on välillä 1 ja 7 eli sunnuntaista lauantaihin. Nämä parametrit ovat tavuarvoja, jos korvaat omat muuttujasi.

Kun olet suorittanut toiminnon kerran, on viisasta liittää se // -merkkiin ja ladata koodi uudelleen, joten se ei nollaa aikaa, kun virta on kytketty tai mikrolukija on nollattu. Ajan lukeminen RTC: stä on yhtä yksinkertaista, itse asiassa prosessia voidaan seurata siististi displayTime () -toiminnon sisällä. Sinun on määritettävä seitsemän tavun muuttujat RTC: n tietojen tallentamiseksi, ja ne lisätään sitten funktioon readDS3231time (). Jos muuttujasi ovat esimerkiksi:

tavu sekunti, minuutti, tunti, dayOfWeek, dayOfMonth, kuukausi, vuosi;

… Päivität ne RTC: n nykyisillä tiedoilla käyttämällä:

readDS3232time (& toinen, & minuutti, & tunti, & dayOfWeek, & dayOfMonth, & month, & year);

Sitten voit käyttää muuttujia parhaaksi katsomallasi tavalla kellonajan ja päivämäärän lähettämisestä sarjavalvontaan esimerkkiluonnoksessa - tietojen muuntamiseen sopivaan muotoon kaikenlaisille tulostuslaitteille.

Tarkista vain, että kaikki toimii, kirjoita sopiva aika ja päivämäärä esitysluonnokseen, lataa se, kommentoi setDS3231time () -toimintoa ja lataa se uudelleen. Avaa sitten sarjamonitori, ja sinulle tulee näyttää käynnissä oleva kellonaika ja päivämäärä.

Tästä lähtien sinulla on nyt ohjelmistotyökalut, joilla voit asettaa tietoja ja noutaa ne reaaliaikaisesta kellomoduulistasi, ja toivomme, että ymmärrät, miten näitä edullisia moduuleja käytetään.

Voit oppia lisää tietyistä reaaliaikaisista kello-IC: istä valmistajan verkkosivustolta-DS1307 ja DS3231.

Tämän viestin toi sinulle pmdway.com - kaikki valmistajille ja elektroniikan harrastajille, ilmainen toimitus maailmanlaajuisesti.

Suositeltava: