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, Srpanj
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 temeljen 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 toč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, no obično će rezultirati time da sat ne radi otprilike pet -ak minuta mjesečno. DS3231 mnogo je točniji jer ima unutarnji oscilator na koji ne utječu vanjski čimbenici - pa je točan najviše do nekoliko minuta godišnje. Ako imate modul DS1307- 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, ti 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 koje pinove na vašem Arduinu ili kompatibilne ploče koriste za I2C sabirnicu - to će biti poznate kao SDA (ili podaci) i SCL (ili sat). Na Arduino Uno ili kompatibilnim pločama ove su igle A4 i A5 za podatke i sat; na Arduino Mega su igle 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 s glavnim pinovima.

DS1307 modul

Ako imate modul DS1307, morat ćete lemiti žice na ploči ili lemiti na nekim umetnutim iglama zaglavlja kako biste mogli koristiti kratkospojne žice. Zatim spojite SCL i SDA pinove na svoj Arduino, a Vcc pin na 5V pin i GND na GND.

DS3231 modul

Spajanje ovog modula jednostavno je jer su igle zaglavlja tvornički instalirane na ploči. Možete jednostavno ponovno pokrenuti kratkospojne žice od SCL -a i SDA -a do Arduina, a zatim opet od pinova Vcc i GND modula do 5V ili 3.3. V i GND vaše ploče. Međutim, oni se s druge strane dupliciraju za lemljenje vlastitih žica. Oba ova 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 iz vašeg RTC modula

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

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Pretvorite normalne decimalne brojeve u binarno kodirane decimalne bajte decToBcd (byte 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 bajta, minuta bajta, sat bajta, dan dayOfWeek, bajt dayOfMonth, mjesec bajta, godina bajtova) {// 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 (drugi)); // postavljanje sekundi Wire.write (decToBcd (minuta)); // postavljanje minuta Wire.write (decToBcd (sat)); // postavljanje sati Wire.write (decToBcd (dayOfWeek)); // postavljanje dana u tjednu (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); // postavimo pokazivač registra DS3231 na 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // tražimo sedam bajtova podataka od DS3231 počevši od registra 00h *second = bcdToDec (Wire.read () & 0x7f); *minuta = 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 () {byte second, minute, hour, dayOfWeek, dayOfMonth, mjesec, godina; // dohvaćanje podataka iz DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // šalje ga na serijski monitor Serial.print (sat, DEC); // pretvara varijablu bajta u decimalni broj kada se prikaže Serial.print (":"); if (minuta <10) {Serial.print ("0"); } Serial.print (minuta, DEC); Serial.print (":"); if (drugo <10) {Serial.print ("0"); } Serial.print (drugi, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serijski.ispis (mjesec, DEC); Serial.print ("/"); Serijski.tisak (godina, DEC); Serial.print ("Dan u tjednu:"); switch (dayOfWeek) {slučaj 1: Serial.println ("nedjelja"); pauza; slučaj 2: Serial.println ("ponedjeljak"); pauza; slučaj 3: Serial.println ("utorak"); pauza; slučaj 4: Serial.println ("srijeda"); pauza; slučaj 5: Serial.println ("četvrtak"); pauza; slučaj 6: Serial.println ("petak"); pauza; slučaj 7: Serial.println ("subota"); pauza; }} void loop () {displayTime (); // prikaz podataka sata u stvarnom vremenu na serijskom monitoru, kašnjenje (1000); // svake sekunde }

Koda može biti puno, no on 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. 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 tog vremena. Na primjer, ako želite postaviti sljedeći datum i vrijeme - srijeda, 26. studenog 2014. i 21:42 te 30 sekundi - upotrijebili biste:

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

3. korak:

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

Nakon što pokrenete funkciju, pametno je dodati joj // i ponovno učitati kôd, tako da neće poništiti vrijeme nakon uključivanja napajanja ili resetiranja mikrokontrolera. Čitanje vremena s vašeg RTC -a jednako je jednostavno, zapravo se proces 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);

Tada 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 prikladan oblik za sve vrste izlaznih uređaja.

Samo da provjerite radi li sve, unesite odgovarajuće vrijeme i datum u demonstracijsku skicu, prenesite je, komentirajte funkciju setDS3231time () i prenesite 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 pojedinim 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 diljem svijeta.

Preporučeni: