En este breve pero interesante entrada os mostramos la forma de dotar a nuestro Arduino de «fecha y hora» de una manera sencilla. ¿Qué necesitamos? … pues tan solo nuestra placa Arduino y un módulo RTC (Real Time Clock) que incorpora como núcleo de su operativa el chip DS1307, además del conexionado de los pocos componentes periféricos que precisa incorpora – y esto si es interesante – la pila tipo botón que se encargará de que guarde fecha y hora aunque desconectemos el módulo del Arduino.
La operativa con Arduino es sumamente sencilla vía bus I2C. Parte de la información utilizada, así como el código desarrollado está basado en la excelente página sobre RTC y Arduino. Si tenemos tiempo podemos indagar en la misma y sacar aún más partido a este pequeño módulo.
En marcha …
Nos ponemos manos a la obra y nos hacemos con el módulo comentado, disponible en Internet en varios sitios, por ejemplo en la tienda de Bricogeek. El conexionado del módulo es tan sencillo que no es preciso ni un esquema, son solo cuatro los hilos que unen el módulo RTC con el Arduino, a saber:
1 2 3 4 5 6 |
Arduino Modulo RTC ======= ========== +5V <--------> 5V GND<--------> GND SDA <--------> A4 SCL <--------> A5 |
Para facilitaros aún más la operativa hemos desarrollado dos pequeños programas para que Arduino use el RTC. El primer programa (Set_RTC) es el que imprescindiblemente hemos de utilizar en primer lugar para «poner en hora» nuestro DS1307.
Nota: es ¡ IMPORTANTE ! que editemos las posiciones de fecha y hora en el programa Set_RTC – lógicamente – para que al ejecutarlo se escriban dichos datos en la memoria del chip. Una vez en hora, y gracias a la batería que incorpora el módulo, no hemos de preocuparnos más por su ajuste. Tan solo lo utilizaremos como reloj de consulta (por ejemplo, con el programa Lee_RTC).
Editamos estos datos (año, mes, dia…etc.) fijándonos en el formato admitido para cada uno de ellos.
El segundo programa (Lee_RTC) es el que nos muestra como recabar la información de fecha y hora que se guarda en este módulo. Podemos utilizarlo como ejemplo que nos ayude a integrar posteriormente el reloj en cualquier dispositivo que lo necesite.
Los programas
El código comentado puede verse a continuación y – como siempre – está disponible para su descarga al final de esta entrada.
PROGRAMA PARA PUESTA EN FECHA/HORA DEL MODULO RTC (DS1307)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
// =============================================================== // = **** Set RTC - DIVERTEKA (J.C.G.P.) ** v. 1.0 **** = // =============================================================== // Parte de este codigo esta basado en la excelente pagina: // RTC Control v1.00 by <http://www.combustory.com> John Vaughters // =============================================================== /* Programa que "pone en fecha y hora" el RTC basado en DS1307 y nos muestra los datos fijados en pantalla. El "dia de la semana" se graba tambien. */ #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // I2C address // -- Global Variables -- byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // -- Convert DECIMAL ==> BCD -- byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } // -- Convert BCD ==> DECIMAL -- byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } // -- Setup -- void setup() { Wire.begin(); Serial.begin(9600); // -- Datos a escribir en DS1307 -- /* Formatos a utilizar sec (00-59), min (00-59), hour (00-23), dayOfWeek (1-7) dayOfMonth (01-31), month (01-12), year (00-99) */ second = 00; minute = 15; hour = 20; dayOfWeek = 01; dayOfMonth = 14; month = 04; year = 14; } // -- Print with 2 digits format String fprint (int dato) { String retorno = String(dato); if (retorno.length() < 2) retorno = "0" + retorno; return retorno; } void AjustaRTC() { // -- Escribo en DS1307 -- Wire.beginTransmission(DS1307_I2C_ADDRESS); // Open I2C line in write mode Wire.write((byte)0x00); // Set the register pointer to (0x00) Wire.write(decToBcd(second)); // Write seven bytes Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission(); // End write mode Wire.beginTransmission(DS1307_I2C_ADDRESS); // Open I2C line in write mode Wire.write((byte)0x00); // Set the register pointer to (0x00) Wire.endTransmission(); // End Write Transmission } // -- Main Loop -- void loop() { AjustaRTC(); // -- Show Info about process -- Serial.println(); Serial.println("===================================" ); Serial.println("= Lectura RTC DS1307 - DIVERTEKA =" ); Serial.println("= ------------------------------ =" ); Serial.println("= tras el ajuste del RTC - DS1307 =" ); Serial.println("===================================" ); Serial.print("- [hh:mm:ss] --> " ); Serial.print(fprint(hour)); Serial.print(":"); Serial.print(fprint(minute)); Serial.print(":"); Serial.print(fprint(second)); Serial.println(); Serial.print("- [DD/MM/YY] --> " ); Serial.print(fprint(dayOfMonth)); Serial.print("/"); Serial.print(fprint(month)); Serial.print("/"); Serial.print(fprint(year)); Serial.println(); delay(3000); } |
PROGRAMA PARA CONSULTA DE FECHA/HORA AL MODULO RTC (DS1307)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
// =============================================================== // = **** Lee RTC - DIVERTEKA (J.C.G.P.) ** v. 1.0 **** = // =============================================================== // Parte de este codigo esta basado en la excelente pagina: // RTC Control v1.00 by <http://www.combustory.com> John Vaughters // =============================================================== /* Programa que accede al RTC basado en DS1307 y nos muestra datos de fecha y hora almacenados en el. El dato "dia de la semana" no se utiliza, aunque es leido tambien. */ #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // I2C address // -- Global Variables -- byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // -- Setup -- void setup() { Wire.begin(); Serial.begin(9600); } // -- Convert BCD ==> DECIMAL -- byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } // -- Print with 2 digits format String fprint (int dato) { String retorno = String(dato); if (retorno.length() < 2) retorno = "0" + retorno; return retorno; } // -- Main Loop -- void loop() { // -- Reading process -- Wire.beginTransmission(DS1307_I2C_ADDRESS); // Open I2C line in write mode Wire.write((byte)0x00); // Set the register pointer to (0x00) Wire.endTransmission(); // End Write Transmission Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // Open the I2C line in send mode second = bcdToDec(Wire.read() & 0x7f); // Read seven bytes of data minute = bcdToDec(Wire.read()); hour = bcdToDec(Wire.read() & 0x3f); dayOfWeek = bcdToDec(Wire.read()); dayOfMonth = bcdToDec(Wire.read()); month = bcdToDec(Wire.read()); year = bcdToDec(Wire.read()); // -- Show read data -- Serial.println(); Serial.println("===================================" ); Serial.println("= Lectura RTC DS1307 - DIVERTEKA =" ); Serial.println("===================================" ); Serial.print("- [hh:mm:ss] --> " ); Serial.print(fprint(hour)); Serial.print(":"); Serial.print(fprint(minute)); Serial.print(":"); Serial.print(fprint(second)); Serial.println(); Serial.print("- [DD/MM/YY] --> " ); Serial.print(fprint(dayOfMonth)); Serial.print("/"); Serial.print(fprint(month)); Serial.print("/"); Serial.print(fprint(year)); Serial.println(); delay(1500); } |
Podemos sacar más partido al chip DS1307, todo es cuestión de ponerse … por ejemplo, podemos acceder a posiciones de memoria internas donde podemos alojar datos de nuestro interés.
A DIVERTIRSE
Descarga de código
El fichero descargable contiene:
- Software Set_RTC.ino para ajuste del DS1307.
- Software Lee_RTC.ino para consulta del DS1307.
- Información del chip DS1307