|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  AutoIt (Programación) Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  Teleco - Emisora de A.M. Visual Basic Cosas de Windows Webs interesantes
T Búsqueda en este sitio:


.

Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando

-- Tutorial de iniciación a Arduino --

Volver al índice del tutorial

____________________________

48.- Reloj de fecha y hora: RTC DS1307. Memoria EEPROM: AT24C32. Bus I2C.

Mediante este dispositivo RTC (Real Time Clock) podemos obtener la fecha y la hora actual. Para no perder la hora, se le conecta una batería recargable de 3,6V, de esta manera independizamos la memoria EEPROM que contiene la fecha, de la alimentación del Arduino. Si el Arduino falla en su alimentación, el reloj mantendrá la hora real gracias a la pila.

Para hacer las pruebas conectado al Arduino, no hace falta poner la pila.

La información se obtiene mediante el bus I2C.

El módulo contiene tres taladros para soldarle el sensor de temperatura DS18B20. Este sensor lo hemos visto en otro tutorial. Envía la información por un terminal DS (no es I2C). No es necesario para obtener la fecha y hora, simplemente es un añadido que tiene este módulo. No lo usaremos.

 

BAT Indica la tensión en la batería. No es necesario conectarlo.
GND Polo negativo
VCC Tensión positiva de alimentación 5V
SDA Línea de datos del bus I2C
SCL Línea de reloj del bus I2C
DS Entrada del sensor de temperatura DS18B20. No es necesario. Ya hemos visto este sensor en otro tutorial.
SQ Salida de una onda cuadrada. Puede dar una señal cuadrada de 1Hz, 4.096kHz, 8.192kHz o 32.768kHz.

Data Sheet del I2C real time clock (RTC) DS1307.pdf

Data Sheet del 32K I2C EEPROM storage 24C32

Batería recargable: LIR2303

_____________________________

- Librería

- Librería: RTClib


- Ejemplos de la librería:

- Mostrar la fecha y hora actual.

- Diferencia entre dos fechas. Temporizador.

- Guardar y leer información de la memoria (64 bytes). Esta memoria puede estar alimentada por una batería para que no se pierda la información contenida si falla la alimentación del Arduino.

- Sacar una onda cuadrada de 1Hz, 4.096kHz, 8.192kHz o 32.768kHz.

- A veces debemos poner el Serial Monitor a 9600 y en otros ejemplos otro valor.

_____________________________

- Conexiones.

- He utilizado el Arduino UNO R3. Tiene Bus I2C en los terminales indicados. Un par en la parte superior y otro par del mismo bus en las entradas A4 y A5 Analógicas.

- He puesto una pantalla LCD comentada en otro de estos tutoriales, aunque en este tutorial no he puesto su código.

- En SQ obtendríamos una onda cuadrada.

- En DS obtendríamos la temperatura del sensor DS18B20, que en nuestro caso no está conectado. (DS iría una entrada DIGITAL)

- En BAT obtendríamos en nivel de la batería. Su terminal entraría en una ANALOG IN y mediríamos su valor.

 

_____________________________

- Códigos de la librería

_____________________________

1.- Muestra fecha y hora en el Monitor Serie (no utiliza la pantalla LCD).

Fecha_hora.ino

// Juan A. Villalpando
// kio4.com
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
// Con la siguiente línea ajustamos el tiempo tomando como instante inicial el momento de la compilación. 
// Si el módulo ya está alimentado y tiene el tiempo correcto...
// podemos anular esa línea.
RTC.adjust(DateTime(__DATE__, __TIME__));

// Si quisieramos poner un instante de inicio, por ejemplo:
// 24 de junio de 2016 a las 16h 30m 
// RTC.adjust(DateTime(2016, 6, 24, 16, 30, 0));
}

void loop () {
DateTime now = RTC.now();
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

delay(1000);
}
		  

_____________________________

2.- Muestra fecha y hora en la pantalla LCD.

Fecha_hora_lcd.ino

// Juan A. Villalpando.
// kio4.com

#include <Wire.h>
// Pantalla LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
 // Reloj RTC
#include <RTClib.h>
RTC_DS1307 RTC;
		
void setup() {
lcd.begin(16,2);// Columnas y filas de LCD		
// Reloj RTC
   Wire.begin();
   RTC.begin();
   RTC.adjust(DateTime(__DATE__, __TIME__));
  } 
  
void  loop() {   		  
  DateTime now = RTC.now();
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print(now.day(), DEC);
  lcd.print("/");
  lcd.print(now.month(), DEC);
  lcd.print("/");
  lcd.print(now.year(), DEC);
  lcd.setCursor(0,1); // Siguiente renglón.;
  lcd.print(now.hour(), DEC);
  lcd.print("/");
  lcd.print(now.minute(), DEC);
  lcd.print("/");
  lcd.print(now.second(), DEC);
  delay(200);
  }
		  

 

_________________________________________________
3.- Onda cuadrada.

Obtenemos una onda cuadrada de 1Hz, 4.096kHz, 8.192kHz y 32.768kHz por la salida SQ

Para que funcione correctamente se ha de conectar una resistencia de 10K desde el terminal SQ a Vcc.

Código

// SQW/OUT pin mode using a DS1307 RTC connected via I2C.
//
// According to the data sheet (http://datasheets.maxim-ic.com/en/ds/DS1307.pdf), the
// DS1307's SQW/OUT pin can be set to low, high, 1Hz, 4.096kHz, 8.192kHz, or 32.768kHz.
//
// This sketch reads the state of the pin, then iterates through the possible values at
// 5 second intervals.
//
// NOTE:
// You must connect a pull up resistor (~10kohm) from the SQW pin up to VCC. Without
// this pull up the wave output will not work!

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

int mode_index = 0;

Ds1307SqwPinMode modes[] = {OFF, ON, SquareWave1HZ, SquareWave4kHz, SquareWave8kHz, SquareWave32kHz};
void print_mode() {
Ds1307SqwPinMode mode = rtc.readSqwPinMode();

Serial.print("Sqw Pin Mode: ");
switch(mode) {
case OFF: Serial.println("OFF"); break;
case ON: Serial.println("ON"); break;
case SquareWave1HZ: Serial.println("1Hz"); break;
case SquareWave4kHz: Serial.println("4.096kHz"); break;
case SquareWave8kHz: Serial.println("8.192kHz"); break;
case SquareWave32kHz: Serial.println("32.768kHz"); break;
default: Serial.println("UNKNOWN"); break;
}
}

void setup () {
Serial.begin(57600);
Wire.begin();
rtc.begin();

print_mode();
}

void loop () {
rtc.writeSqwPinMode(modes[mode_index++]);
print_mode();

if (mode_index > 5) {
mode_index = 0;
}

// Onda cuadrada de 1 Hz

// mode_index = 2;

delay(5000);
}		  
	  

Si añadimos un LED y las resistencias indicadas en la figura y descomentamos la línea

// mode_index = 2;

del código anterior, el LED parpadeará a 1 Hz, ya que saldrá una onda cuadrada de 1 Hz del terminal SQ.

_________________________________________________
4.- Dirección del bus I2C.

- En el tutorial de pantalla LCD vimos un código para obtener las direcciones I2C de los dispositivos conectados, aquí lo vuelvo a poner...

Código para ver direcciones I2C
#include <Wire.h>

void setup() {
  Serial.begin (115200);

  // Leonardo: wait for serial port to connect
  while (!Serial)
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
 
  Wire.begin();
  for (byte i = 1; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}

En este caso las direcciones una la del reloj RTC y otra la de la memoria EEPROM son:

0x50 (EEPROM) y 0x68 (RTC)

 


___________________________________
- Otra librería

Esta otra librería contiene ejemplos de temporizaciones.

TimeAlarms.zip

_______________________________________________________________________

- Módulo con DS1302, este módulo no tiene bus I2C.

- Hay otro modelo de módulo de reloj que necesita otro código porque no viene adaptado a I2C.

https://playground.arduino.cc/Main/DS1302RTC

https://github.com/msparks/arduino-ds1302

DS1302RTC.pdf

- Encontramos dos librerías para este módulo:

DS1302RTC.zip

DS1302.zip (en este tutorial utilizaré esta)

_____________________________

1.- Muestra fecha y hora en el Monitor Serie.

DS1302.zip

Reloj DS1302

#include <DS1302.h>			
// Conexiones DS1302 
// 2 = RST
// 3 = DAT
// 4 = CLK
DS1302 rtc(2, 3, 4); 

void setup() 
{ 
// Monitor Serie
Serial.begin(9600); 

// Habilita el reloj con halt(false)
// Deshabilita la protección de escritura con writeProtect(false)
rtc.halt(false); 
rtc.writeProtect(false); 

// Las siguientes líneas se pueden anular, se utilizan para establecer una hora y fecha.
rtc.setDOW(FRIDAY); // Poner el día de la semana en FRIDAY 
rtc.setTime(12, 0, 0); // Poner la hora en 12:00:00 (formato de 24 horas)
rtc.setDate(6, 8, 2018); // Poner la fecha en 6 de agosto de 2018
} 

void loop() 
{ 
// Día de la semana. 
Serial.print(rtc.getDOWStr()); 
Serial.print(" "); 

// Fecha
Serial.print(rtc.getDateStr()); 
Serial.print(" -- "); 

// Hora 
Serial.println(rtc.getTimeStr()); 

delay (1000); 
}		

_____________________________

2.- Muestra fecha y hora en la pantalla LCD.

DS1302.zip

Reloj DS1302

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#include <DS1302.h>
// Conexiones DS1302 
// 2 = RST
// 3 = DAT
// 4 = CLK

DS1302 rtc(2, 3, 4);

// Pantalla LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

Time ahora;

void setup() {
lcd.begin(16,2); // Columnas y filas de LCD
Serial.begin(9600);
Wire.begin();

// Habilita el reloj con halt(false)
// Deshabilita la protección de escritura con writeProtect(false)
rtc.halt(false); 
rtc.writeProtect(false); 

// Las siguientes líneas se pueden anular, se utilizan para establecer una hora y fecha.
rtc.setDOW(FRIDAY); // Poner el día de la semana en FRIDAY 
rtc.setTime(12, 0, 0); // Poner la hora en 12:00:00 (formato de 24 horas)
rtc.setDate(20, 5, 2018); // Poner la fecha en 20 de mayo de 2018
}


void loop() {

  ahora = rtc.getTime();
  lcd.clear(); // Borra pantalla. // Anular esta linea.
  lcd.setCursor(0,0); // Inicio del cursor
 
  if (ahora.dow == 1){
    lcd.print("LUN");
  }
  if (ahora.dow == 2){
    lcd.print("MART");
  }
  if (ahora.dow == 3){
    lcd.print("MIER");
  }
  if (ahora.dow == 4){
    lcd.print("JUEV");
  }
  if (ahora.dow == 5){
    lcd.print("VIER");
  }
  if (ahora.dow == 6) {
    lcd.print("SAB");
  }
  if (ahora.dow == 7){
    lcd.print("DOM");
  }

  lcd.setCursor(1,1);      
  lcd.print(ahora.date);  
  lcd.print("/");         
  lcd.print(ahora.mon);       
  lcd.print("/");          
  lcd.print(ahora.year);      
  lcd.setCursor(7,0);     
  lcd.print(ahora.hour);       
  lcd.print(":");          
  lcd.print(ahora.min);  
  lcd.print(":");          
  lcd.print(ahora.sec);       

  delay(1000);  
}
		

___________________________________________________________
- Otra librería para el DS1302.

MyRealTimeClock.zip

Reloj DS1302

			
#include <MyRealTimeClock.h>		
MyRealTimeClock myRTC(6, 7, 8); // Assign Digital Pins 
// Clk = 6
// Dat = 7
// Rst = 8

void setup() {
Serial.begin(9600);


/* To set the current time and date in specific format 
| Second 00 | Minute 59 | Hour 10 | Day 12 |  Month 07 | Year 2015 |
*/

myRTC.setDS1302Time(00, 59, 10, 12 , 10, 07, 2015);
}

void loop() {

// Allow the update of variables for time / accessing the individual element. 
myRTC.updateTime();

Serial.print("Current Date / Time: "); 
Serial.print(myRTC.dayofmonth); // Element 1
Serial.print("/"); 
Serial.print(myRTC.month); // Element 2
Serial.print("/");
Serial.print(myRTC.year); // Element 3
Serial.print(" ");
Serial.print(myRTC.hours); // Element 4
Serial.print(":");
Serial.print(myRTC.minutes); // Element 5
Serial.print(":");
Serial.println(myRTC.seconds); // Element 6
delay( 5000);
}

 

 

________________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información