Cómo utilizar el módulo de reloj en tiempo real (RTC) DS3231 con un ESP32

Como Utilizar El Modulo De Reloj En Tiempo Real Rtc Ds3231 Con Un Esp32



ESP32 es una placa de microcontrolador inteligente con capacidades integradas de Wi-Fi y Bluetooth. ESP32 viene con un RTC interno, pero su funcionamiento depende de la energía. Entonces, si desea diseñar proyectos o circuitos que desea ejecutar incluso cuando no hay energía, debe usar cualquier módulo RTC externo como DS1307 o DS3231.

Ya hicimos un tutorial sobre Interfaz DS1307 con el módulo ESP32 . Hoy discutiremos los conceptos básicos del sensor RTC DS3231 y comprobaremos cómo se puede conectar con la placa ESP32.

Tabla de contenido:







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



2. Cómo conectar DS3231 con ESP32



3. Hardware





4. Código

5. Salida



6. Cómo mostrar la hora RTC DS3231 en una pantalla OLED usando ESP32

Conclusión

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

El módulo DS3231 proporciona un cronometraje muy preciso. Incluye un oscilador de cristal con temperatura compensada (TCXO) integrado para darnos la hora con gran precisión. El módulo opera en el protocolo I2C usando la configuración Maestro-Esclavo. Puede mantener la hora y la fecha con una batería de respaldo incluso cuando no hay alimentación de entrada principal. Se utiliza comúnmente en dispositivos que dependen de la fecha y la hora.

El DS3231 controla los segundos, minutos y horas. También puede mantener un registro de fechas y días laborables. Cuando se trata de años bisiestos, ajusta automáticamente el tiempo en consecuencia. Además, puede mostrar la hora en formato de 12 o 24 horas, completo con un indicador AM/PM.

1.1. DS3231 frente a DS1307

Tanto DS3231 como DS1307 son módulos de cronometraje con soporte de batería de respaldo. Sin embargo, el DS3231 es más preciso que el DS1307. La razón principal es que el DS1307 depende de un cristal externo de 32 kHz para el cronometraje.

Sin embargo, el RTC DS3231 cuenta con un oscilador de cristal interno con compensación de temperatura (TCXO). Esto hace que se vea menos afectado por la temperatura externa y, como resultado, tiene una ventaja de precisión de unos pocos minutos por año que el DS1307.

1.2. Distribución de pines DS3231

DS3231 funciona utilizando el protocolo I2C. En el corazón de este módulo RTC, tenemos el preciso chip RTC diseñado por Maxim. Este chip maneja todas las funciones de tiempo y se comunica mediante el I2C con ESP32 o placa Arduino.

Los pines principales de los módulos RTC DS3231 son:

  • CCV: Conecte este pin al terminal positivo de su fuente de alimentación.
  • Tierra: Conexión a tierra.
  • ASD: Pin de datos serie (utilizado para la comunicación I2C).
  • SCL: Pin de reloj serie (también parte de la interfaz I2C).
  • Pregunta: Pin de salida de onda cuadrada (puede generar una señal periódica, por ejemplo, para alarmas u otros fines de sincronización).
  • 32K: Salida de oscilador de 32 KHz (útil para aplicaciones de sincronización precisa).

Los siguientes son los principales componentes integrados del módulo RTC DS3231:

  • Soporte de la batería: Permite que el módulo siga funcionando cuando no hay alimentación externa.
  • Chip RTC: Este chip mantiene la hora y la fecha.
  • AT24C32 EEPROM: Proporciona almacenamiento no volátil para registro de datos y otros fines con 1.000.000 de ciclos de escritura.
  • TCXO: Oscilador con compensación de temperatura para proporcionar el tiempo correcto para un rango variable de temperaturas.
  • Sensor de temperatura: Toma lecturas de temperatura y las proporciona como parte de la función del módulo.

2. Cómo conectar DS3231 con ESP32

Para interconectar DS3231 con ESP32, necesita instalar el biblioteca RTClib primero. Después de instalar esta biblioteca Adafruit RTC, puede conectar su placa ESP32 con DS3231 usando el protocolo I2C. Para conectar ESP32 I2C con el módulo RTC DS3231, puede utilizar los pines ESP32 D21 y D22.

2.1. Diagrama de cableado de ESP32 con RTC DS3231

Primero, debe conectar el ESP32 con su módulo I2C RTC DS3231. Siga la configuración de pines que se proporciona a continuación para el cableado:

Después de conectar el ESP32 con RTC DS3231, su diagrama de cableado debería verse así. También puede alimentar el DS3231 desde el pin VIN de ESP32. Los voltajes de funcionamiento del DS3231 son de 3,3 a 5,5 VCC.

2.2. Instalación de las bibliotecas necesarias

Una vez que el circuito esté listo, el siguiente paso es configura tu placa ESP32 con Arduino IDE . Para conectar DS3231, necesitará instalar el biblioteca RTClib . Puede instalarlo utilizando el administrador de biblioteca Arduino IDE.

3. Hardware

Necesitará el siguiente hardware para diseñar el reloj RTC basado en DS3231 con ESP32:

  • Placa de desarrollo ESP32
  • Módulo RTC DS3231
  • batería CR2032
  • Cables de puente
  • Tablero de circuitos

4. Código

Después de instalar la biblioteca RTC, la siguiente parte es escribir el código para DS3231 y cargarlo en la placa ESP32. Primero, debes escribir el código para configurar tu hora actual. Después de configurar la hora en DS3231, recordará la hora y seguirá funcionando incluso si su placa ESP32 se apaga.

Ahora abra el IDE de Arduino, compile y grabe el código en la placa ESP32.

#incluir
#incluir

RTC_DS3231 rtc ; // Inicializa una instancia de la clase RTC_DS3231

vacío configuración ( ) {
De serie. comenzar ( 115200 ) ;
Cable. comenzar ( ) ;

    si ( ! rtc. comenzar ( ) ) {
De serie. imprimir ( 'RTC no detectado' ) ;
        mientras ( 1 ) ; // Se cuelga indefinidamente si no se encuentra RTC
    }

    //Descomenta la línea siguiente para establecer la fecha y hora iniciales
    //rtc.adjust(DateTime(__DATE__, __TIME__));
}

vacío bucle ( ) {
    // Leer la hora actual del sensor (DS3231)
FechaHora ahora = rtc. ahora ( ) ;

    // Imprime la fecha y la hora en la misma línea con dos dígitos para horas, minutos y segundos.
De serie. imprimir ( 'Fecha actual: ' ) ;
De serie. imprimir ( ahora. año ( ) , DIC ) ;
De serie. imprimir ( '/' ) ;
imprimir dos dígitos ( ahora. mes ( ) ) ;
De serie. imprimir ( '/' ) ;
imprimir dos dígitos ( ahora. día ( ) ) ;
De serie. imprimir ( ' Tiempo actual: ' ) ;
imprimir dos dígitos ( ahora. hora ( ) ) ;
De serie. imprimir ( ':' ) ;
imprimir dos dígitos ( ahora. minuto ( ) ) ;
De serie. imprimir ( ':' ) ;
imprimir dos dígitos ( ahora. segundo ( ) ) ;
De serie. imprimir ( ) ;

demora ( 1000 ) ; //Actualiza cada 1 segundo
}

vacío imprimir dos dígitos ( En t número ) {
    si ( número < 10 ) {
De serie. imprimir ( '0' ) ; // Agrega un cero a la izquierda para números de un solo dígito
    }
De serie. imprimir ( número ) ;
}

4.1. Explicación del código

El código comienza inicializando la comunicación serial I2C con la ayuda de una biblioteca de cables. Después de eso, incluimos la biblioteca RTC de Adafruit para interactuar con el módulo DS3231. Esta biblioteca proporciona una función para interactuar con el módulo RTC DS3231.

En el configuración parte, el bus I2C se inicia y se verifican los dispositivos I2C disponibles. Si no se encuentra, el programa se bloquea indefinidamente. La velocidad en baudios también se define para que pueda verificar la salida en el monitor serie Arduino IDE.

Configurar el reloj por primera vez

Al programar el DS3231, debe descomentar esta línea . Esto obtendrá la hora de su sistema y la almacenará dentro de la memoria RTC. Al hacer esto, el reloj del módulo RTC se sincroniza con el reloj de su sistema.

//rtc.adjust(DateTime(__DATE__, __TIME__));

Una vez establecido el tiempo, debe volver a cargar el código anterior, pero esta vez debe comentar la línea de función rtc.adjust() . De lo contrario, esto sobrescribirá el tiempo establecido anteriormente y cuando su ESP32 esté apagado, el RTC comenzará nuevamente desde el momento en que cargó el código.

Al hacer esto, su tiempo permanecerá presente en el fondo del módulo RTC siempre que el módulo RTC tenga energía en su celda CR2032.

En el bucle En parte, la fecha y hora actuales se leen desde el módulo DS3231 utilizando la función rtc.now(). Los componentes de fecha y hora se extraen y la fecha formateada se imprime en el monitor serie Arduino IDE cada segundo.

5. Salida

Después de cargar el código en la placa ESP32, verá que la hora comenzará a imprimirse en el monitor serie Arduino IDE.

6. Cómo mostrar la hora RTC DS3231 en la pantalla OLED usando ESP32

También puedes ir un paso más allá y mostrar la hora en tu pantalla OLED después de leerla desde DS3231. Para esto es necesario instalar el Biblioteca Adafruit GFX SSD1306 en el IDE de Arduino.

Una vez instalado, conecte el ESP32 con el módulo OLED y RTC en la siguiente configuración.

Después de conectar su sensor, verá que el circuito se parece al siguiente diagrama esquemático.

Ahora cargue el siguiente código DS3231 en la placa ESP32.

#incluir
#incluir
#incluir
#incluir 'RTClib.h'

RTC_DS3231 rtc ;

carbonizarse días [ 7 ] [ 12 ] = { 'Domingo' , 'Lunes' , 'Martes' , 'Miércoles' , 'Jueves' , 'Viernes' , 'Sábado' } ;

Pantalla Adafruit_SSD1306 = Adafruit_SSD1306 ( 128 , 64 , & Cable , - 1 ) ;

vacío configuración ( ) {
De serie. comenzar ( 115200 ) ;

mostrar. comenzar ( SSD1306_SWITHCAPVCC , 0x3C ) ;

  si ( ! rtc. comenzar ( ) ) {
De serie. imprimir ( '¡No se pudo encontrar el RTC! Verifique el circuito'. ) ;
    mientras ( 1 ) ;
  }
  //elimina el comentario de la línea siguiente mientras configuras la hora por primera vez
  //rtc.adjust(DateTime(__DATE__, __TIME__));
mostrar. claroPantalla ( ) ;
mostrar. establecerTextColor ( BLANCO ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 0 , 20 ) ;
mostrar. imprimir ( 'RELOJ RTC' ) ;
mostrar. mostrar ( ) ;
demora ( 5000 ) ;
}

vacío bucle ( ) {
FechaHora ahora = rtc. ahora ( ) ;

mostrar. claroPantalla ( ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 75 , 0 ) ;
mostrar. imprimir ( ahora. segundo ( ) , DIC ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 25 , 0 ) ;
mostrar. imprimir ( ':' ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 65 , 0 ) ;
mostrar. imprimir ( ':' ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 40 , 0 ) ;
mostrar. imprimir ( ahora. minuto ( ) , DIC ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 0 , 0 ) ;
mostrar. imprimir ( ahora. hora ( ) , DIC ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 0 , 25 ) ;
mostrar. imprimir ( ahora. día ( ) , DIC ) ;
mostrar. imprimir ( días [ ahora. día de la semana ( ) ] ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 20 , 25 ) ;
mostrar. imprimir ( '-' ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 35 , 25 ) ;
mostrar. imprimir ( ahora. mes ( ) , DIC ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 60 , 25 ) ;
mostrar. imprimir ( '-' ) ;
mostrar. establecerTamañoDeTexto ( 2 ) ;
mostrar. establecercursor ( 75 , 25 ) ;
mostrar. imprimir ( ahora. año ( ) , DIC ) ;
mostrar. mostrar ( ) ;
}

Explicación del código

El código comenzó con algunas bibliotecas importantes que se requieren para las pantallas RTC y OLED. La pantalla OLED se configura utilizando la biblioteca Adafruit SSD1306.

En la parte del bucle, la fecha y hora actuales se obtienen utilizando rtc.now(). Después de eso, la pantalla OLED se borra y los componentes de la hora se muestran en formato de reloj digital. También puede modificar el código para ajustar el formato de fecha y hora.

Una vez que el código se cargue en su tablero, obtendrá la hora actual en la pantalla OLED.

Nota: El código anterior utiliza el 0x3C Dirección I2C para OLED. Esta es la dirección I2C más común disponible en las pantallas OLED SSD1306. Si desea encontrar la dirección I2C para su pantalla OLED, puede ejecutar el Código del escáner I2C .

Conclusión

DS3231 es un sensor RTC que se puede utilizar para el cronometraje. Tiene una batería de respaldo que puede mantener la hora exacta incluso si la placa del microcontrolador está apagada. Para interconectar ESP2 con DS3231, debe instalar la biblioteca RTClib en su IDE de Arduino. Después de eso, debes conectar el módulo RTC a través del protocolo I2C usando el pin digital de ESP32. Una vez conectado, simplemente cargue el código y ajuste la hora. Ahora el sensor RTC mantendrá el tiempo y podrá leerlo en su monitor en serie en proyectos basados ​​en el tiempo de diseño.