Sadržaj:

Korištenje DS1307 i DS3231 modula sata u stvarnom vremenu s Arduinom: 3 koraka
Korištenje DS1307 i DS3231 modula sata u stvarnom vremenu s Arduinom: 3 koraka

Video: Korištenje DS1307 i DS3231 modula sata u stvarnom vremenu s Arduinom: 3 koraka

Video: Korištenje DS1307 i DS3231 modula sata u stvarnom vremenu s Arduinom: 3 koraka
Video: Урок 99. Создание цифровых часов Arduino с использованием ЖК-дисплея DS3231 и семисегментного дисплея. 2024, Juli
Anonim
Korištenje DS1307 i DS3231 modula sata u stvarnom vremenu s Arduinom
Korištenje DS1307 i DS3231 modula sata u stvarnom vremenu s Arduinom
Korištenje DS1307 i DS3231 modula sata u stvarnom vremenu s Arduinom
Korištenje DS1307 i DS3231 modula sata u stvarnom vremenu s Arduinom

Stalno dobivamo zahtjeve o tome kako koristiti module sata sa realnim vremenom DS1307 i DS3231 s Arduinom iz različitih izvora-pa je ovo prvi od dva dijela vodiča o tome kako ih koristiti. Za ovaj Arduino vodič imamo dva modula sata u stvarnom vremenu za korištenje, jedan baziran na Maxim DS1307 (kvadratni modul) i DS3231 (pravokutni modul).

Postoje dvije glavne razlike između IC-a na modulima sata u stvarnom vremenu, a to je tačnost mjerenja vremena. DS1307 korišten u prvom modulu radi vrlo dobro, međutim vanjska temperatura može utjecati na frekvenciju oscilatornog kruga koji pokreće unutarnji brojač DS1307.

Ovo može zvučati kao problem, međutim obično će rezultirati time da sat ne radi za otprilike pet -ak minuta mjesečno. DS3231 je mnogo precizniji jer ima unutarnji oscilator na koji ne utječu vanjski faktori - i stoga je precizan najviše do nekoliko minuta godišnje. Ako imate DS1307 modul- nemojte se osjećati loše, to je i dalje velika vrijednost i dobro će vam poslužiti. Za oba modula potrebna je pomoćna baterija.

Bilo bi dobro kupiti novu bateriju CR2032 i postaviti je na modul. Uz praćenje vremena i datuma, ovi moduli također imaju mali EEPROM, funkciju alarma (samo DS3231) i mogućnost generiranja kvadratnog vala različitih frekvencija-a sve će to biti predmet drugog vodiča.

Korak 1: Povezivanje vašeg modula s Arduinom

Oba modula koriste I2C sabirnicu, što povezivanje čini vrlo lakim.

Prvo ćete morati identificirati koji se pinovi na vašem Arduinu ili kompatibilne ploče koriste za I2C sabirnicu - oni će biti poznati kao SDA (ili podaci) i SCL (ili sat). Na Arduino Uno ili kompatibilnim pločama, ti su pinovi A4 i A5 za podatke i sat; na Arduino Mega su pinovi D20 i D21 za podatke i sat; a ako koristite Pro Mini kompatibilne, pinovi su A4 i A5 za podatke i sat koji su paralelni sa glavnim pinovima.

DS1307 modul

Ako imate modul DS1307, morat ćete lemiti žice na ploči ili lemiti na nekim inline zaglavljima tako da možete koristiti kratkospojnike. Zatim spojite SCL i SDA pinove na svoj Arduino, a Vcc pin na 5V pin i GND na GND.

DS3231 modul

Povezivanje ovog modula je jednostavno jer su igle zaglavlja tvornički instalirane na ploči. Možete jednostavno ponovo pokrenuti kratkospojne žice od SCL -a i SDA -a do Arduina, a zatim ponovo od pinova Vcc i GND modula do 5V ili 3.3. V i GND ploče. Međutim, oni se dupliciraju s druge strane za lemljenje vlastitih žica. Oba modula imaju potrebne pull-up otpornike, pa ne morate dodavati svoje. Kao i svi uređaji spojeni na I2C sabirnicu, pokušajte svesti duljinu SDA i SCL žica na minimum.

Korak 2: Čitanje i zapisivanje vremena sa vašeg RTC modula

Nakon što ste povezali svoj RTC modul. unesite i otpremite sljedeću skicu. Iako se napomene i funkcije na skici odnose samo na DS3231, kôd radi i sa DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Pretvorite normalne decimalne brojeve u binarno kodirane decimalne bajtove decToBcd (bajt val) {return ((val/10*16) + (val%10)); } // Pretvorimo binarno kodirane decimalne brojeve u normalne decimalne brojeve bajt bcdToDec (bajt val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Serial.begin (9600); // ovdje postavljamo početno vrijeme: // DS3231 sekunde, minute, sati, dan, datum, mjesec, godina // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (sekunda u bajtima, minut u bajtu, sat u bajtu, dan u tjednu, bajt u dan u mjesecu, mjesec u bajtu, godina u bajtovima) {// postavlja podatke o vremenu i datumu na DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // postavljanje sljedećeg ulaza za početak u registru sekundi Wire.write (decToBcd (second)); // postavljanje sekundi Wire.write (decToBcd (minute)); // postavljanje minuta Wire.write (decToBcd (sat)); // postavljanje sati Wire.write (decToBcd (dayOfWeek)); // postavlja dan u sedmici (1 = nedjelja, 7 = subota) Wire.write (decToBcd (dayOfMonth)); // postavljanje datuma (1 do 31) Wire.write (decToBcd (mjesec)); // postavljanje mjeseca Wire.write (decToBcd (godina)); // postavljanje godine (0 do 99) Wire.endTransmission (); } void readDS3231time (byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // postavljamo pokazivač registra DS3231 na 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // zahtijeva sedam bajtova podataka od DS3231 počevši od registra 00h *second = bcdToDec (Wire.read () & 0x7f); *minute = bcdToDec (Wire.read ()); *sat = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *mjesec = bcdToDec (Wire.read ()); *godina = bcdToDec (Wire.read ()); } void displayTime () {bajt drugi, minut, sat, danOfWeek, dayOfMonth, mesec, godina; // dohvaćanje podataka iz DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // šalje ga na serijski monitor Serial.print (sat, DEC); // pretvara bajt varijablu u decimalni broj kada se prikaže Serial.print (":"); if (minuta <10) {Serial.print ("0"); } Serial.print (minut, DEC); Serial.print (":"); if (drugo <10) {Serial.print ("0"); } Serial.print (drugi, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (mjesec, DEC); Serial.print ("/"); Serial.print (godina, DEC); Serial.print ("Dan u sedmici:"); switch (dayOfWeek) {slučaj 1: Serial.println ("nedjelja"); break; slučaj 2: Serial.println ("ponedjeljak"); break; slučaj 3: Serial.println ("utorak"); break; slučaj 4: Serial.println ("srijeda"); break; slučaj 5: Serial.println ("četvrtak"); break; slučaj 6: Serial.println ("petak"); break; slučaj 7: Serial.println ("subota"); break; }} void loop () {displayTime (); // prikazuje podatke sata u realnom vremenu na serijskom monitoru, kašnjenje (1000); // svake sekunde }

Koda može biti puno, ali se dobro razlaže na dijelove kojima se može upravljati.

Prvo uključuje knjižnicu Wire, koja se koristi za komunikaciju I2C sabirnicom, nakon čega slijedi definiranje adrese sabirnice za RTC kao 0x68. Nakon toga slijede dvije funkcije koje pretvaraju decimalne brojeve u BCD (binarno kodirani decimalni broj) i obrnuto. To je potrebno jer RTC IC -ovi rade u BCD -u, a ne decimalni.

Za postavljanje sata koristi se funkcija setDS3231time (). Korištenje je vrlo jednostavno, jednostavno umetnite vrijednosti od godine do sekunde, a RTC će početi od tada. Na primjer, ako želite postaviti sljedeći datum i vrijeme - srijeda, 26. novembar 2014. i 21:42 i 30 sekundi - koristili biste:

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

Korak 3:

Imajte na umu da se vrijeme postavlja pomoću 24-satnog vremena, a četvrti parametar je "dan u sedmici". Ovo pada između 1 i 7, odnosno od nedjelje do subote. Ovi parametri su vrijednosti bajtova ako mijenjate vlastite varijable.

Nakon što pokrenete funkciju, jednom je pametno dodati joj // i ponovo učitati kôd, tako da neće poništiti vrijeme nakon uključivanja napajanja ili resetiranja mikrokontrolera. Čitanje vremena sa vašeg RTC -a je isto tako jednostavno, u stvari proces se može uredno pratiti unutar funkcije displayTime (). Morat ćete definirati sedam bajtnih varijabli za spremanje podataka iz RTC -a, a one se zatim ubacuju u funkciju readDS3231time (). Na primjer, ako su vaše varijable:

byte second, minute, hour, dayOfWeek, dayOfMonth, mjesec, godina;

… osvježili biste ih trenutnim podacima iz RTC -a koristeći:

readDS3232time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

Zatim možete koristiti varijable kako smatrate prikladnim, od slanja vremena i datuma na serijski monitor kao što je prikazano na primjeru skice - do pretvaranja podataka u odgovarajući oblik za sve vrste izlaznih uređaja.

Samo da provjerite radi li sve, unesite odgovarajuće vrijeme i datum u skicu demonstracije, učitajte je, komentirajte funkciju setDS3231time () i učitajte je ponovo. Zatim otvorite serijski monitor i trebali biste dobiti tekući prikaz trenutnog vremena i datuma.

Od ovog trenutka sada imate softverske alate za postavljanje podataka i njihovo preuzimanje iz vašeg modula sata u stvarnom vremenu, i nadamo se da razumijete kako koristiti ove jeftine module.

Više o određenim IC-ovima sata u stvarnom vremenu možete saznati s web stranice proizvođača-DS1307 i DS3231.

Ovaj post vam donosi pmdway.com - sve za proizvođače i ljubitelje elektronike, uz besplatnu dostavu širom svijeta.

Preporučuje se: