|     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.

 

Código
// 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.- 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.

_________________________________________________
3.- 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

________________________________

- 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