Kazalo:

Uporaba modulov ure v realnem času DS1307 in DS3231 z Arduinom: 3 koraki
Uporaba modulov ure v realnem času DS1307 in DS3231 z Arduinom: 3 koraki

Video: Uporaba modulov ure v realnem času DS1307 in DS3231 z Arduinom: 3 koraki

Video: Uporaba modulov ure v realnem času DS1307 in DS3231 z Arduinom: 3 koraki
Video: Иоша Бах и Джон Верваке: Разум, идеализм, вычисления 2024, November
Anonim
Uporaba modulov ure v realnem času DS1307 in DS3231 z Arduinom
Uporaba modulov ure v realnem času DS1307 in DS3231 z Arduinom
Uporaba modulov ure v realnem času DS1307 in DS3231 z Arduinom
Uporaba modulov ure v realnem času DS1307 in DS3231 z Arduinom

Vedno znova prejemamo zahteve o uporabi modulov ure v realnem času DS1307 in DS3231 z Arduinom iz različnih virov-zato je to prva od dveh delnih vadnic o njihovi uporabi. Za to vadnico Arduino uporabljamo dva modula ure v realnem času, enega, ki temelji na Maxim DS1307 (kvadratni modul) in DS3231 (pravokotni modul).

Obstajata dve glavni razliki med IC-ji na modulih ure v realnem času, to je natančnost merjenja časa. DS1307, uporabljen v prvem modulu, deluje zelo dobro, vendar lahko zunanja temperatura vpliva na frekvenco oscilatornega vezja, ki poganja notranji števec DS1307.

Morda se to sliši kot težava, vendar običajno povzroči, da ura ne deluje za približno pet minut na mesec. DS3231 je veliko natančnejši, saj ima notranji oscilator, na katerega ne vplivajo zunanji dejavniki - in je zato natančen največ do nekaj minut na leto. Če imate modul DS1307- ne počutite se slabo, je to še vedno velika vrednost in vam bo dobro služilo. Pri obeh modulih je potrebna rezervna baterija.

Dobro je kupiti novo baterijo CR2032 in jo namestiti na modul. Poleg sledenja času in datumu imajo ti moduli tudi majhen EEPROM, funkcijo alarma (samo DS3231) in zmožnost ustvarjanja kvadratnega vala različnih frekvenc-vse to bo predmet druge vadnice.

1. korak: Povezovanje modula z Arduinom

Oba modula uporabljata vodilo I2C, kar olajša povezavo.

Najprej boste morali ugotoviti, kateri zatiči na vašem Arduinu ali združljivih ploščah se uporabljajo za vodilo I2C - ti bodo znani kot SDA (ali podatki) in SCL (ali ura). Na Arduino Uno ali združljivih ploščah so ti zatiči A4 in A5 za podatke in uro; na Arduino Mega sta nožici D20 in D21 za podatke in uro; če pa uporabljate Pro Mini, sta zatiča A4 in A5 za podatke in uro, ki sta vzporedna z glavnimi nožicami.

Modul DS1307

Če imate modul DS1307, boste morali žice spajkati na ploščo ali spajkati na nekaj vtičnih zatičih glave, tako da lahko uporabite mostične žice. Nato priključite nožice SCL in SDA na svoj Arduino, pin Vcc pa na 5V pin in GND na GND.

Modul DS3231

Priključitev tega modula je enostavna, saj so zatiči glave tovarniško nameščeni na ploščo. Preprosto lahko znova speljete mostične žice od SCL in SDA do Arduina in znova od zatičev Vcc in GND modula do 5V ali 3.3. V in GND vaše plošče. Vendar se ti na drugi strani podvajajo za spajkanje lastnih žic. Oba modula imata potrebna vlečna upora, zato vam ni treba dodati svojega. Kot vse naprave, povezane z vodilom I2C, poskusite omejiti dolžino žic SDA in SCL na minimum.

2. korak: Branje in zapis časa iz modula RTC

Ko priključite modul RTC. vnesite in naložite naslednjo skico. Čeprav se opombe in funkcije na skici nanašajo le na DS3231, koda deluje tudi z DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Pretvori normalna decimalna števila v binarno kodirane decimalne bajte decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Pretvorimo binarno kodirano decimalko v normalna decimalna števila bajt bcdToDec (bajt val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Serial.begin (9600); // tukaj nastavimo začetni čas: // DS3231 sekunde, minute, ure, dan, datum, mesec, leto // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (bajtna sekunda, bajtna minuta, bajtna ura, bajt dayOfWeek, bajt dayOfMonth, bajt mesec, bajtno leto) {// nastavi podatke o času in datumu na DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // nastavimo naslednji vhod za začetek pri sekundnem registru Wire.write (decToBcd (second)); // nastavimo sekunde Wire.write (decToBcd (minuta)); // nastavimo minute Wire.write (decToBcd (ura)); // nastavimo ure Wire.write (decToBcd (dayOfWeek)); // nastavimo dan v tednu (1 = nedelja, 7 = sobota) Wire.write (decToBcd (dayOfMonth)); // nastavimo datum (od 1 do 31) Wire.write (decToBcd (mesec)); // nastavite mesec Wire.write (decToBcd (leto)); // nastavimo leto (0 do 99) Wire.endTransmission (); } void readDS3231time (bajt *sekunda, bajt *minuta, bajt *ura, bajt *dayOfWeek, bajt *dayOfMonth, bajt *mesec, bajt *leto) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // nastavimo kazalec registra DS3231 na 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // zahtevamo sedem bajtov podatkov od DS3231, začenši od registra 00h *second = bcdToDec (Wire.read () & 0x7f); *minuta = bcdToDec (Wire.read ()); *ura = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *mesec = bcdToDec (Wire.read ()); *leto = bcdToDec (Wire.read ()); } void displayTime () {byte sekunda, minuta, ura, dayOfWeek, dayOfMonth, mesec, leto; // pridobivanje podatkov iz DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // pošljemo na serijski monitor Serial.print (ura, DEC); // pretvorimo bajtno spremenljivko v decimalno število, ko 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 ("/"); Serial.print (mesec, DEC); Serial.print ("/"); Serial.print (leto, DEC); Serial.print ("Dan v tednu:"); switch (dayOfWeek) {primer 1: Serial.println ("nedelja"); zlom; primer 2: Serial.println ("ponedeljek"); zlom; primer 3: Serial.println ("torek"); zlom; primer 4: Serial.println ("sreda"); zlom; primer 5: Serial.println ("četrtek"); zlom; primer 6: Serial.println ("petek"); zlom; primer 7: Serial.println ("sobota"); zlom; }} void loop () {displayTime (); // prikaz podatkov ure v realnem času na serijskem monitorju, zakasnitev (1000); // vsako sekundo }

Kode je lahko veliko, vendar se dobro razdeli na obvladljive dele.

Najprej vključuje knjižnico Wire, ki se uporablja za komunikacijo z vodilom I2C, čemur sledi naslov vodila za RTC kot 0x68. Temu sledita dve funkciji, ki pretvorita decimalna števila v BCD (binarno kodirano decimalno mesto) in obratno. Ti so potrebni, ker IC RTC delujejo v BCD in ne decimalno.

Za nastavitev ure se uporablja funkcija setDS3231time (). Njegova uporaba je zelo enostavna, preprosto vstavite vrednosti od leta do sekunde in od takrat se bo začel izvajati RTC. Na primer, če želite nastaviti naslednji datum in uro - sreda, 26. november 2014 in 21:42 ter 30 sekund - bi uporabili:

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

3. korak:

Upoštevajte, da je čas nastavljen s 24-urnim časom, četrti parameter pa je "dan v tednu". To pade med 1 in 7, to je od nedelje do sobote. Ti parametri so vrednosti bajtov, če podmenjate svoje spremenljivke.

Ko enkrat zaženete funkcijo, jo je pametno vnesti z // in znova naložiti kodo, zato ne bo ponastavila časa, ko se napajanje prekine ali ponastavi mikrokrmilnik. Branje časa iz vašega RTC je prav tako preprosto, pravzaprav lahko postopek lepo sledite znotraj funkcije displayTime (). Za shranjevanje podatkov iz RTC boste morali določiti sedem bajtnih spremenljivk, ki se nato vstavijo v funkcijo readDS3231time (). Na primer, če so vaše spremenljivke:

bajtova sekunda, minuta, ura, dayOfWeek, dayOfMonth, mesec, leto;

… jih osvežite s trenutnimi podatki iz RTC z uporabo:

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

Nato lahko spremenljivke uporabite, kot se vam zdi primerno, od pošiljanja časa in datuma na serijski monitor, kot to počne primerna skica - do pretvorbe podatkov v primeren obrazec za vse vrste izhodnih naprav.

Če želite samo preveriti, ali vse deluje, v predstavitveno skico vnesite ustrezen čas in datum, jo naložite, komentirajte funkcijo setDS3231time () in jo naložite znova. Nato odprite serijski monitor in na voljo vam bo tekoči prikaz trenutnega časa in datuma.

Od tega trenutka imate zdaj programska orodja za nastavitev podatkov in njihovo pridobivanje iz modula ure v realnem času, in upamo, da razumete, kako uporabljati te poceni module.

Več o posameznih IC-jih za uro v realnem času lahko izveste na proizvajalčevem spletnem mestu-DS1307 in DS3231.

To objavo vam je predstavil pmdway.com - vse za ustvarjalce in navdušence nad elektroniko z brezplačno dostavo po vsem svetu.

Priporočena: