Taula de continguts:

Ús de mòduls de rellotge en temps real DS1307 i DS3231 amb Arduino: 3 passos
Ús de mòduls de rellotge en temps real DS1307 i DS3231 amb Arduino: 3 passos

Vídeo: Ús de mòduls de rellotge en temps real DS1307 i DS3231 amb Arduino: 3 passos

Vídeo: Ús de mòduls de rellotge en temps real DS1307 i DS3231 amb Arduino: 3 passos
Vídeo: Урок 19 – Модуль часов реального времени DS3231 2024, Desembre
Anonim
Ús de mòduls de rellotge en temps real DS1307 i DS3231 amb Arduino
Ús de mòduls de rellotge en temps real DS1307 i DS3231 amb Arduino
Ús de mòduls de rellotge en temps real DS1307 i DS3231 amb Arduino
Ús de mòduls de rellotge en temps real DS1307 i DS3231 amb Arduino

Continuem rebent sol·licituds sobre com utilitzar mòduls de rellotge en temps real DS1307 i DS3231 amb Arduino de diverses fonts, de manera que aquest és el primer d’un tutorial de dues parts sobre com utilitzar-los. Per a aquest tutorial d'Arduino, hem de fer servir dos mòduls de rellotge en temps real, un basat en el Maxim DS1307 (el mòdul quadrat) i el DS3231 (el mòdul rectangular).

Hi ha dues diferències principals entre els CI dels mòduls de rellotge en temps real, que és la precisió del temps. El DS1307 utilitzat al primer mòdul funciona molt bé, però la temperatura externa pot afectar la freqüència del circuit de l’oscil·lador que acciona el comptador intern del DS1307.

Pot semblar un problema, però normalment es produirà que el rellotge estigui apagat aproximadament uns cinc minuts al mes. El DS3231 és molt més precís, ja que té un oscil·lador intern que no es veu afectat per factors externs i, per tant, és precís fins a un màxim de pocs minuts a l’any. Si teniu un mòdul DS1307, no us sentiu malament, continua sent un tauler de gran valor i us servirà bé. Amb els dos mòduls, es necessita una bateria de seguretat.

És una bona idea comprar una nova bateria CR2032 i ajustar-la al mòdul. A més de fer un seguiment de l’hora i la data, aquests mòduls també tenen una petita EEPROM, una funció d’alarma (només DS3231) i la possibilitat de generar una ona quadrada de freqüències diverses, que seran objecte d’un segon tutorial.

Pas 1: Connexió del mòdul a un Arduino

Tots dos mòduls utilitzen el bus I2C, cosa que facilita la connexió.

Primer, haureu d’identificar quins pins del vostre Arduino o de les plaques compatibles s’utilitzen per al bus I2C; es coneixeran com SDA (o dades) i SCL (o rellotge). A les plaques Arduino Uno o compatibles, aquests pins són A4 i A5 per a dades i rellotge; A l'Arduino Mega els pins són D20 i D21 per a dades i rellotge; I si utilitzeu un Pro Mini-compatible, els pins són A4 i A5 per a dades i rellotge, que són paral·lels als pins principals.

Mòdul DS1307

Si teniu el mòdul DS1307, haureu de soldar els cables a la placa o soldar-los en alguns pins de capçalera en línia perquè pugueu utilitzar cables de pont. A continuació, connecteu els pins SCL i SDA al vostre Arduino i el pin Vcc al pin de 5 V i GND a GND.

Mòdul DS3231

Connectar aquest mòdul és fàcil ja que els pins de capçalera s’instal·len a la placa de fàbrica. Simplement podeu tornar a executar cables jumper des de SCL i SDA fins a Arduino i de nou des dels pins Vcc i GND del mòdul fins als 5V o 3.3. V i GND de la vostra placa. Tanmateix, es duplicen a l'altra banda per soldar els vostres propis cables. Aquests dos mòduls tenen les resistències de tracció necessàries, de manera que no cal afegir-ne de pròpies. Com tots els dispositius connectats al bus I2C, intenteu que la longitud dels cables SDA i SCL sigui mínima.

Pas 2: llegir i escriure l'hora des del mòdul RTC

Un cop hàgiu connectat el mòdul RTC. introduïu i pengeu el següent esbós. Tot i que les notes i funcions de l'esbós es refereixen només al DS3231, el codi també funciona amb el DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Converteix els nombres decimals normals en byte decimal codificat binari decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); } // Converteix decimal codificat binari en nombres decimals normals byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16)); } void setup () {Wire.begin (); Serial.begin (9600); // defineix l'hora inicial aquí: // DS3231 segons, minuts, hores, dia, data, mes, any // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {// estableix les dades de data i hora a DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // configureu l'entrada següent per començar al registre de segons Wire.write (decToBcd (segon)); // establir segons Wire.write (decToBcd (minut)); // establir minuts Wire.write (decToBcd (hora)); // establir hores Wire.write (decToBcd (dayOfWeek)); // fixar el dia de la setmana (1 = diumenge, 7 = dissabte) Wire.write (decToBcd (dayOfMonth)); // fixar la data (1 a 31) Wire.write (decToBcd (mes)); // set mes Wire.write (decToBcd (any)); // set year (0 to 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); // Estableix el punter de registre DS3231 a 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // sol·liciteu set bytes de dades de DS3231 a partir del registre 00h * segon = bcdToDec (Wire.read () & 0x7f); * minut = bcdToDec (Wire.read ()); * hora = bcdToDec (Wire.read () & 0x3f); * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * mes = bcdToDec (Wire.read ()); * any = bcdToDec (Wire.read ()); } void displayTime () {byte segon, minut, hora, dayOfWeek, dayOfMes, mes, any; // recuperar dades de DS3231 readDS3231time (& segon, & minut, & hora, & dayOfWeek, & dayOfMonth, & mes, & any); // envieu-lo al monitor sèrie Serial.print (hora, DEC); // converteix la variable byte en un nombre decimal quan es mostri Serial.print (":"); if (minut <10) {Serial.print ("0"); } Serial.print (minut, DEC); Serial.print (":"); if (segon <10) {Serial.print ("0"); } Serial.print (segon, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (mes, DEC); Serial.print ("/"); Serial.print (any, DEC); Serial.print ("Dia de la setmana:"); switch (dayOfWeek) {cas 1: Serial.println ("diumenge"); trencar; cas 2: Serial.println ("dilluns"); trencar; cas 3: Serial.println ("dimarts"); trencar; cas 4: Serial.println ("dimecres"); trencar; cas 5: Serial.println ("dijous"); trencar; cas 6: Serial.println ("divendres"); trencar; cas 7: Serial.println ("dissabte"); trencar; }} void loop () {displayTime (); // mostra les dades del rellotge en temps real al monitor de sèrie, demora (1000); // cada segon }

Pot haver-hi molt de codi, però es divideix bé en parts manejables.

Primer inclou la biblioteca Wire, que s’utilitza per a la comunicació de bus I2C, seguida de definir l’adreça de bus del RTC com a 0x68. Aquestes són seguides per dues funcions que converteixen els nombres decimals a BCD (decimal amb codi binari) i viceversa. Són necessaris ja que els IC RTC funcionen en BCD no decimal.

La funció setDS3231time () s’utilitza per configurar el rellotge. El seu ús és molt senzill i senzill inserir els valors de l'any a segon, i el RTC començarà a partir d'aquest moment. Per exemple, si voleu establir la data i hora següents (dimecres 26 de novembre de 2014 i 21:42 i 30 segons), utilitzeu:

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

Pas 3:

Tingueu en compte que l'hora s'estableix amb 24 hores i que el quart paràmetre és el "dia de la setmana". Això oscil·la entre l'1 i el 7, que és de diumenge a dissabte respectivament. Aquests paràmetres són valors de bytes si substituïu les vostres pròpies variables.

Un cop hàgiu executat la funció, és aconsellable posar-la amb // i tornar a penjar el codi, de manera que no es restablirà l’hora un cop s’hagi activat l’alimentació o restablert el microcontrolador. Llegir el formulari de temps del vostre RTC és tan senzill, de fet, el procés es pot seguir perfectament dins de la funció displayTime (). Haureu de definir variables de set bytes per emmagatzemar les dades del RTC, que després s’insereixen a la funció readDS3231time (). Per exemple, si les vostres variables són:

byte segon, minut, hora, dayOfWeek, dayOfMonth, mes, any;

… els actualitzareu amb les dades actuals del RTC utilitzant:

readDS3232time (& segon, & minut, & hora, & dayOfWeek, & dayOfMonth, & mes, & any);

A continuació, podeu utilitzar les variables que considereu oportunes, des d’enviar l’hora i la data al monitor sèrie com fa l’esbós d’exemple, fins a convertir les dades en un formulari adequat per a tot tipus de dispositius de sortida.

Només per comprovar que tot funciona, introduïu l’hora i la data adequades a l’esbós de demostració, pengeu-lo, comenteu la funció setDS3231time () i torneu-lo a penjar. A continuació, obriu el monitor sèrie i se us proporcionarà una visualització en curs de l'hora i la data actuals.

A partir d’aquest moment, ja teniu les eines de programari per configurar i recuperar dades del mòdul de rellotge en temps real i esperem que tingueu coneixement de com utilitzar aquests mòduls econòmics.

Podeu obtenir més informació sobre els CI de rellotge en temps real particulars al lloc web del fabricant: DS1307 i DS3231.

Aquest article us el proporciona pmdway.com: tot per a fabricants i aficionats a l'electrònica, amb lliurament gratuït a tot el món.

Recomanat: