Reloj en tiempo real (RTC) ESP32 usando DS1307 y pantalla OLED

Reloj En Tiempo Real Rtc Esp32 Usando Ds1307 Y Pantalla Oled



ESP32 viene con un módulo RTC incorporado, pero solo funciona cuando hay energía. Si se corta la energía, el reloj se reiniciará y no podrá mantener la hora correcta. Entonces, si desea realizar un seguimiento del tiempo o controlar cualquier dispositivo basado en el tiempo, pruebe el sensor RTC DS1307. Sin embargo, es posible que esté pensando en conectar una batería de respaldo a su placa ESP32, pero ese no es el mejor de los casos si tiene escasez de energía. La mejor alternativa es utilizar el sensor DS1307, ya que viene con una batería incorporada que puede durar un mínimo de un año.

Para dejar las cosas claras, el reloj en tiempo real (RTC) interno del ESP32 puede realizar un seguimiento del tiempo incluso cuando el procesador principal está apagado o en suspensión profunda. Puede utilizar el ESP32 RTC para realizar un seguimiento del tiempo sin consumir mucha energía ni afectar el procesador principal. Pero todavía requiere energía para funcionar, no mucha, pero se requiere una cantidad mínima de energía para que funcione el RTC interno.

Entonces con esto, solo nos queda la solución de usar el módulo RTC externo. Veamos los pasos para conectar la placa ESP32 con el módulo RTC DS1307.







Contenido:

1. ¿Qué es el módulo RTC DS1307?

DS1307 es un dispositivo de bajo consumo que puede realizar un seguimiento preciso de la hora y la fecha. Utiliza formato decimal codificado en binario (BCD). Puede indicarle la hora en un formato detallado como segundos, minutos e incluso horas y días. También puede imprimir la fecha en formato completo como mes y año. También sabe cuándo es año bisiesto, hasta 2100. Para comunicarse con DS1307, puede utilizar el protocolo I2C.





DS1307 tiene una batería incorporada que puede alimentarlo durante aproximadamente un año sin una fuente externa de 5 V. Con esta batería de respaldo, puede retener la hora incluso cuando la alimentación principal está apagada. También dispone de 56 bytes de SRAM para almacenar algunos datos. El DS1307 es un dispositivo práctico que tiene muchas aplicaciones cuando se combina con una placa Arduino o ESP32. Por ejemplo, estos datos pueden ser útiles en el registro de datos, sistemas de alarma o control industrial. Si necesita un cronometraje confiable, el DS1307 es una excelente opción.





Especificaciones del módulo RTC DS1307

El módulo RTC DS1307 consta del RTC IC, una EEPROM, un oscilador de cristal y un soporte de batería de respaldo.



A continuación se detallan los detalles de estas partes:

DS1307 RTC IC : El DS1307 RTC IC es un chip de 8 pines que realiza un seguimiento de la hora y la fecha mediante el protocolo I2C. Utiliza muy poca energía, menos de 500 nA. Puede mostrar la hora en segundos, minutos y horas, y la fecha en días, meses y años. También puede cambiar entre formatos de 24 y 12 horas.

24C32 EEPROM IC : El 24C32 EEPROM IC es un chip de 32 bytes de Atmel que almacena la configuración, la hora y la fecha. También utiliza el protocolo I2C.

Cristal de 32,768 kHz : El oscilador de cristal de 32,768 kHz proporciona la frecuencia de reloj para el IC RTC DS1307.

Soporte de la batería : El soporte de la batería contiene una batería CR2032. Es una pila de botón de litio de 3V. Proporciona energía continua al DS1307 RTC IC.

Provisión de sensores DS18B20 : La provisión del sensor DS18B20 le permite soldar y utilizar el sensor de temperatura DS18B20. No está presoldado. Puede soldar el paquete de orificio pasante y obtener la temperatura del pin DS del módulo.

La siguiente lista proporciona algunas especificaciones rápidas del sensor RTC DS1307:

  • Tensión de funcionamiento: 4,5–5,5 V, normalmente 5 V
  • Consumo actual : Menos de 1,5 mA
  • Exactitud : 0–40 °C, depende del cristal
  • Batería : CR2032 (moneda de 3 V)
  • Memoria : 56 bytes de RAM no volátil
  • Interfaz : Interfaz serie de dos cables (I2C)
  • Producción : pin de salida de 1 Hz
  • Salida de onda cuadrada programable : Consume menos de 500 nA en modo de respaldo de batería
  • Detección de fallo de alimentación : Detección automática de fallos de alimentación y circuitos de conmutación
  • Circuito de detección de potencia : Puede cambiar automáticamente para respaldar el suministro en caso de escasez de energía.
  • Compensación por año bisiesto : Válido hasta el año 2100

Distribución de pines del módulo RTC DS1307

El módulo tiene varios pines con diferentes funciones.

  • VCC es el pin que necesita un voltaje CC entre 3.3V y 5.5V para alimentar el módulo.
  • Tierra es el pin para bajo voltaje o tierra.
  • ASD y SCL son los pines que comunican datos y señales de reloj a través del bus I2C.
  • DS es el pin que mide la temperatura con el sensor DS1307 si tienes uno en el módulo RTC.
  • SQ es el pin que genera una señal de onda cuadrada con una frecuencia de 1 Hz, 4 kHz, 8 kHz o 32 kHz, dependiendo de cómo lo programes.
  • UNO es el pin que utiliza una batería de 3V para mantener la hora exacta cuando la alimentación principal está apagada.

2. Cómo conectar RTC DS1307 y pantalla OLED con ESP32

Para conectar ESP32 con DS1307 y pantalla OLED, puede utilizar los pines I2C integrados de la placa ESP32. Tanto la pantalla DS1307 como la OLED son dispositivos basados ​​en I2C. Luego puede comunicarse utilizando el protocolo maestro-esclavo I2C a través del bus I2C.

Antes de avanzar hacia la interfaz de ESP32 con DS1307 y la pantalla OLED, primero debe instalar algunas bibliotecas necesarias.

Instalación de las bibliotecas necesarias

Necesitará dos bibliotecas, una para el módulo RTC y otra para la pantalla OLED. Usando OLED con un módulo RTC, puedes crear vistas previas de reloj sorprendentes e interactivas. Si no tiene planes de mostrar la hora en la pantalla, puede omitir la instalación de esta biblioteca.

A continuación se muestran las dos bibliotecas que necesitará:

  • RTClib (de Adafruit) es una biblioteca IDE de Arduino para configurar y obtener la hora de un RTC. También proporciona clases para manipular fechas, horas y duraciones. Con esta biblioteca, puede interconectar y programar los módulos de reloj en tiempo real (RTC), como DS1307 y DS3231.
  • S SD1306 (de Adafruit) es una biblioteca para Arduino, mediante la cual puede interconectar y programar las pantallas OLED con Arduino o cualquier otra placa de microcontrolador.

Para descargar e instalar ambas bibliotecas en Arduino IDE, primero abra el Administrador de biblioteca busque la biblioteca RTClib y haga clic Instalar :

Tendrá la opción de instalar solo la biblioteca o sus dependencias. Haga clic en el Instalar todo para instalar completamente la biblioteca. De esta manera no obtendrá ningún error si modifica el código que depende de las dependencias de esta biblioteca.

De manera similar, busque la biblioteca SSD1306. Esta biblioteca es necesaria para una pantalla OLED. Hacer clic Instalar para proceder.

Esta vez también recibirás el mismo mensaje de confirmación. Clickea en el Instalar todo opción.

Ahora las bibliotecas para OLED y DS1307 están instaladas y listas para usar. Pero antes de eso, primero, averigüe la dirección I2C de la pantalla OLED.

3. Encontrar la dirección I2C de la pantalla OLED

La dirección I2C es un identificador único para cada dispositivo en el bus I2C. Permite que el dispositivo maestro se comunique con un dispositivo esclavo específico enviando datos a su dirección. El propósito de la dirección I2C es evitar conflictos y confusión entre múltiples dispositivos en el mismo bus.

Para obtener la dirección de un dispositivo I2C, puede utilizar un boceto simple que escanea el autobús e imprime las direcciones de los dispositivos que encuentra. Alternativamente, puede consultar la hoja de datos del dispositivo para ver su dirección predeterminada o configurable.

Aquí, en nuestro caso, después de ejecutar el código del escáner I2C, se muestra la siguiente dirección I2C de la pantalla OLED en el terminal Arduino IDE.

La mayoría de las veces, existe una alta probabilidad de que usted también obtenga lo mismo. 0x3C dirección de su pantalla OLED.

4. Interfaz del módulo OLED y RTC DS1307 con ESP32

1. Conecte los pines SDA y SCL tanto del módulo DS1307 como del Pantalla OLED a los pines I2C de ESP32. Generalmente, estos son GPIO 21 y GPIO 22 , pero también puedes asignar cualquier otro pin en el código si es necesario.

2. Conecte VCC y GND de DS1307 y la pantalla OLED a los pines 3.3V y GND de ESP32.

3. Inserte una batería de tipo botón CR2032 en el módulo DS1307 para proporcionar energía de respaldo para el reloj en tiempo real.

4. Cargue el código de ejemplo de este tutorial a su placa ESP32. Modifique el código para salidas personalizadas.

Después de la carga, un reloj comenzará a partir de la hora establecida y mostrará la hora en la pantalla OLED.

5. Diagrama del circuito

El diagrama de circuito de ESP32 con DS1307 es simple, con solo cuatro cables que deben conectarse. Puede acortar los cables I2C SDA y SCL de los sensores OLED y DS1307. De manera similar, para encender ambos sensores, se pueden usar los pines 3V3 y GND de la placa ESP32. También puede alimentarlo desde una fuente separada si es necesario.

Nota : Es seguro alimentar el RTC DS1307 desde un pin de 3,3 V de ESP32 si no se excede el límite de corriente de ESP32. Pero si desea estar en un sitio seguro, puede utilizar una fuente de alimentación independiente para el módulo RTC o probar el sensor DS3231 de bajo consumo cuyo rango de funcionamiento está entre 3,3 y 5,5 VCC.

La siguiente imagen ilustra la conexión de ESP32 con el sensor RTC DS1307.

De manera similar, si deseas conectar la pantalla OLED para mostrar la hora, puedes usar los mismos pines I2C y los pines de alimentación de la placa ESP32.

6. Código

Usando el siguiente código, estableceremos la fecha y hora actuales en el RTC. Después de configurar la hora, el código mostrará la hora en el terminal Arduino IDE. Antes de cargar el código, debe actualizarlo con su fecha y hora actuales.

#incluir 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Días_semanas [ 7 ] [ 12 ] = { 'Domingo' , 'Lunes' , 'Martes' , 'Miércoles' , 'Jueves' , 'Viernes' , 'Sábado' } ;
configuración vacía ( ) {
Serie.comienzo ( 115200 ) ;
#ifndefESP8266
  mientras ( ! De serie ) ;
#terminara si
  si ( ! DS1307_RTC.comenzar ( ) ) {
Serial.println ( 'No se pudo encontrar RTC' ) ;
    mientras ( 1 ) ;
  }
DS1307_RTC.ajustar ( Fecha y hora ( F ( __FECHA__ ) , f ( __TIEMPO__ ) ) ) ;
}
bucle vacío ( ) {
FechaHora ahora = DS1307_RTC.now ( ) ;
Impresión.serie ( ahora.año ( ) , DIC ) ;
Impresión.serie ( '/' ) ;
Impresión.serie ( ahora.mes ( ) , DIC ) ;
Impresión.serie ( '/' ) ;
Impresión.serie ( now.day ( ) , DIC ) ;
Impresión.serie ( ' (' ) ;
Impresión.serie ( Días_de_semana [ ahora.diadelasemana ( ) ] ) ;
Impresión.serie ( ') ' ) ;
Impresión.serie ( ahora.hora ( ) , DIC ) ;
Impresión.serie ( ':' ) ;
Impresión.serie ( ahora.minuto ( ) , DIC ) ;
Impresión.serie ( ':' ) ;
Impresión.serie ( ahora.segundo ( ) , DIC ) ;
Serial.println ( ) ;
demora ( 1000 ) ;
}

Este código utiliza el biblioteca RTClib para interactuar con un módulo de reloj en tiempo real DS1307 que realiza un seguimiento de la fecha y la hora.

El configuración La función comenzó con la inicialización de la velocidad en baudios. Luego de eso, dentro de esta sección, definimos la función para sincronizar la fecha y hora de la computadora con el sensor DS1307. Esto cargará la hora de compilación del código en el sensor RTC.

Puedes usar el bucle función para obtener la fecha y hora de RTC. Luego, puede visualizarlo en el monitor serie así: año/mes/día (día de la semana) hora:minuto:segundo. Recuerde agregar un retraso de un segundo después de cada ciclo, para que el código no se ejecute demasiado rápido.

Mostrar la hora actual en la pantalla OLED

Para mostrar la misma hora en la pantalla OLED, tenemos que agregar una parte de código adicional para la pantalla OLED. Simplemente cargue el código proporcionado. Este código mostrará la hora actual en su pantalla OLED.

Recuerde, aquí utilizamos el módulo de pantalla OLED SSD I2C de 128 × 64 de 0,96 pulgadas. Si está utilizando cualquier otro tamaño, modifique el código en consecuencia. Además, verifique la dirección I2C y modifíquela en el código proporcionado. En nuestro caso tenemos una dirección I2C 0x3C para la pantalla OLED.

#incluir
#incluir
#incluir
#incluir 'RTClib.h'
#definir SCREEN_WIDTH 128
#definir SCREEN_HEIGHT 64

Pantalla Adafruit_SSD1306 ( ANCHO_PANTALLA, ALTO_PANTALLA, & Cable, - 1 ) ;
RTC_DS1307 RTC;
días carbonizados [ 7 ] [ 12 ] = { 'Domingo' , 'Lunes' , 'Martes' , 'Miércoles' , 'Jueves' , 'Viernes' , 'Sábado' } ;
configuración vacía ( ) {
Serie.comienzo ( 115200 ) ;
  si ( ! RTC.comenzar ( ) ) {
Serial.println ( 'No se pudo encontrar RTC' ) ;
    mientras ( 1 ) ;
  }
Ajuste RTC ( Fecha y hora ( F ( __FECHA__ ) , f ( __TIEMPO__ ) ) ) ;
  si ( ! mostrar.comenzar ( SSD1306_SWITHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'Error en la asignación de SSD1306' ) ) ;
    para ( ;; ) ;
  }
demora ( 1000 ) ;
pantalla.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( BLANCO ) ;
display.setCursor ( 30 , 20 ) ;
mostrar.println ( 'Linux' ) ;
pantalla.pantalla ( ) ;
demora ( 3000 ) ;
pantalla.clearDisplay ( ) ;
}
bucle vacío ( ) {
FechaHora ahora = RTC.ahora ( ) ;
pantalla.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
mostrar.imprimir ( now.day ( ) ) ;
mostrar.imprimir ( '/' ) ;
mostrar.imprimir ( ahora.mes ( ) ) ;
mostrar.imprimir ( '/' ) ;
mostrar.imprimir ( ahora.año ( ) ) ;
mostrar.println ( días [ ahora.diadelasemana ( ) ] ) ;
mostrar.println ( ' ' ) ;
display.setCursor ( 0 , 40 ) ;
  si ( ahora.hora ( ) < 10 )
mostrar.imprimir ( '0' ) ;
mostrar.imprimir ( ahora.hora ( ) ) ;
mostrar.imprimir ( ':' ) ;
  si ( ahora.minuto ( ) < 10 )
mostrar.imprimir ( '0' ) ;
mostrar.imprimir ( ahora.minuto ( ) ) ;
mostrar.imprimir ( ':' ) ;
  si ( ahora.segundo ( ) < 10 )
mostrar.imprimir ( '0' ) ;
mostrar.println ( ahora.segundo ( ) ) ;
pantalla.pantalla ( ) ;
}

El código comenzó con las bibliotecas que instalamos para RTC y la pantalla. Después de eso, define el tamaño de la pantalla y la dirección de visualización. Inicializa la matriz con nombres de días laborables.

El configuración La parte comienza con la comunicación en serie. Comprueba si el RTC y la pantalla funcionan o no. Después de eso, hemos definido una cadena de texto 'Linuxhint' que se mostrará durante 3 segundos. Este es solo un mensaje de apertura o inicio, también puede modificar este mensaje con su texto personalizado.

El bucle La función obtiene la fecha y hora del módulo DS1307. Después de eso, borra la pantalla e imprime la fecha y la hora en forma formateada. El código también agrega ceros a la izquierda de las horas, minutos y segundos, en caso de que sus valores sean menores que 10.

7. Hardware

Después de cargar el código en la placa ESP32, verá el siguiente resultado en la pantalla OLED. Para el hardware hemos utilizado la pantalla OLED y un módulo I2C RTC DS1307. Se utiliza una placa ESP32 con 30 pines. También puedes experimentar con cualquier otra placa ESP32, pero asegúrate de conectar los pines I2C correctamente.

Conclusión

El RTC DS1307 tiene una SRAM de 56 bytes con soporte de batería de respaldo. Es un dispositivo de 8 pines que utiliza un protocolo de comunicación I2C. Para interconectar el módulo DS1307 RTC con el ESP32, puede usar los pines I2C (GPIO 22 (SCL) y GPIO 21 (SDA)) de la placa ESP32. Puede imprimir la hora en una consola Arduino IDE o usar cualquier pantalla como OLED o I2C LCD para mostrar la hora. El módulo DS1307 RTC es un dispositivo útil para realizar un seguimiento de la hora y la fecha en diversas aplicaciones. Algunas aplicaciones principales incluyen registradores de datos, relojes digitales y relojes inteligentes.