ESP32 Real Time Clock usando Módulo DS3231

Tempo de leitura: 5 minutes

Neste tutorial, aprenderemos sobre Real Time Clock (RTC) e sua interface com o ESP32 e display OLED.

Usaremos o módulo DS3231 RTC para controlar a hora correta e exibi-la no SPI OLED usando ESP32 como nosso microcontrolador. ESP32 é mais do que um microcontrolador. Possui chip de Wi-Fi e Bluetooth dentro dele e 39 pinos GPIO. Ele oferece suporte a todos os protocolos de comunicação, como SPI, I2C, UART, etc. Se você é novo no ESP32, primeiro consulte nosso tutorial de introdução ao ESP32.

 

O que é RTC ??

DS3231 é um módulo RTC (Real Time Clock). É usado para manter a data e a hora da maioria dos projetos eletrônicos. Este módulo tem sua própria fonte de alimentação de célula tipo moeda, usando a qual mantém a data e a hora mesmo quando a alimentação principal é removida ou o MCU passou por um hard reset. Assim, uma vez que definimos a data e a hora neste módulo, ele manterá um registro disso sempre. Existem vários tipos de ICs RTC disponíveis como DS1307, DS3231 etc.

Nota: Ao usar este módulo pela primeira vez, você deve definir a data e a hora. Você também pode usar RTC IC DS1307, já usamos DS1307 com Arduino.

 

Conhecendo os monitores OLED:

O termo OLED significa “diodo emissor de luz orgânico”, ele usa a mesma tecnologia que é usada na maioria de nossas televisões, mas tem menos pixels em comparação a eles. É muito divertido ter esses módulos de exibição legais, pois eles farão nossos projetos parecerem legais. Abordamos um artigo completo sobre monitores OLED e seus tipos aqui.

Estamos usando uma tela OLED SSD1306 de 0,96 ”monocromática de 7 pinos. A razão para escolher este display é que ele pode funcionar em três protocolos de comunicação diferentes, como o modo SPI de 3 fios, o modo de quatro fios SPI e o modo IIC. Este tutorial cobrirá como usar o módulo no modo SPI de 4 fios, pois é o modo de comunicação mais rápido e o padrão.

Os pinos e suas funções são explicados na tabela abaixo.

Número do PINNome do PinOutros nomesUso
1GndGroundPino de aterramento do módulo
2VddVcc, 5VPino de alimentação (3-5 V tolerável)
3SCKD0,SCL,CLKAtua como o pino do relógio. Usado para I2C e SPI
4SDAD1,MOSIPino de dados do módulo. Usado para IIC e SPI
5RESRST,RESETReinicia o módulo (útil durante o SPI)
6DCA0Pino de comando de dados. Usado para protocolo SPI
7CSChip SelectÚtil quando mais de um módulo é usado sob o protocolo SPI

Neste tutorial iremos simplesmente operar o módulo no modo SPI 4-Wire, deixaremos o resto para algum outro tutorial.

A comunidade do Arduino já nos forneceu várias bibliotecas que podem ser usadas diretamente para tornar isso muito mais simples. Experimentei algumas bibliotecas e descobri que a biblioteca Adafruit_SSD1306 era muito fácil de usar e tinha um punhado de opções gráficas, portanto, usaremos as mesmas neste tutorial. Mas, se o seu projeto tem uma restrição de memória/velocidade, tente usar a Biblioteca U8g, pois ela funciona mais rápido e ocupa menos memória do programa.

 

Material necessário:

  • ESP32
  • Módulo DS3231 RTC
  • Módulo de display OLED de 7 pinos 128 × 64 (SSD1306)
  • Fios macho-fêmea
  • ProtoBoard

 

Diagrama de circuito:

O diagrama de circuito para conectar RTC3231 à placa ESP é fornecido abaixo:

O RTC DS3231 IC usa o modo I2C de comunicação. Ele tem pinos SCL, SDA, Vcc e GND saindo dele. A conexão do módulo RTC com ESP32 é fornecida abaixo:

SCL de RTC -> SCL de ESP32, ou seja, Pino D22
SDA de RTC -> SDA de ESP32, ou seja, Pino D21
GND de RTC -> GND de ESP32
Vcc de RTC -> Vcc de ESP32

Aqui, estamos usando o modo SPI para conectar nosso Módulo de display OLED de 128×64 (SSD1306) ao ESP32. Portanto, ele usará 7 pinos. As conexões com ESP32 são fornecidas como:

  1. Pino CS (seleção de chip) de OLED -> PIN D5 de ESP32
  2. Pino DC do OLED -> PIN D4 do ESP32
  3. PIN RES de OLED -> PIN D2 de ESP32
  4. Pino SDA de OLED -> PIN D23, ou seja, MOSI de ESP32
  5. Pino SCK de OLED -> PIN D18, ou seja, SCK de ESP32
  6. Vdd de OLED -> Vcc de ESP32
  7. GND de OLED -> GND de ESP32

 

Explicação do código:

O código completo para ESP32 é fornecido no final do artigo. Aqui estamos explicando algumas partes importantes do código.

Precisamos de várias bibliotecas para usar em nosso código, que podem ser baixadas dos links abaixo:

1. Adafruit_SSD1306 : https://github.com/adafruit/Adafruit_SSD1306
2. SPI : https://github.com/PaulStoffregen/SPI
3. Adafruit_GFX : https://github.com/adafruit/Adafruit-GFX-Library
4. RTClib : https://github.com/adafruit/RTClib

Então, incluímos todas as bibliotecas

#include <SPI.h>   // para o display OLED
#include <Wire.h>  // para o Modulo RTC I2C
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>  // para gráficos de exibição
#include "RTClib.h"       // para gráficos de exibição

Em seguida, defina todos os pinos do OLED. Você não precisa definir pinos para o módulo RTC porque esses pinos já estão definidos na biblioteca WIRE.

#define OLED_MOSI  23
#define OLED_CLK   18
#define OLED_DC    4
#define OLED_CS    5
#define OLED_RESET 2
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

Na função de configuração, chamaremos a função rtc.adjust(DateTime(__DATE__, __TIME__)) que definirá a hora de acordo com a hora do nosso PC.

void setup() 
{
  Serial.begin(9600);
  if (! rtc.begin()) {
     Serial.println("Não foi possível encontrar RTC");
     while (1);
  }

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

Depois disso, chamamos as funções de exibição para mostrar no OLED.

   display.begin(SSD1306_SWITCHCAPVCC);
   display.clearDisplay();
   display.setTextColor(WHITE);
   //display.startscrollright(0x00, 0x0F); // Você pode descomentar esta linha para rolar seu texto no oled             
   display.setTextSize(2);
   display.setCursor(0,5);
   display.print("  Relógio "); // Isso exibirá o relógio no OLED por 3 segundos
   display.display();
   delay(3000);
}

Então, finalmente, na função de loop, vamos armazenar nosso tempo na variável DateTime now predefinida e exibir o tempo usando funções de exibição como setTextSize, setCursor, etc. Defina-as de acordo com sua necessidade e use a função display.println para mostrar no OLED.

void loop()
{
   DateTime now = rtc.now();

   display.clearDisplay();
   display.setTextSize(2);
   display.setCursor(75,0);
   display.println(now.second(), DEC);

É assim que você pode exibir a hora no OLED usando ESP32 e, como você sabe, o ESP é conhecido por seus recursos de IoT, então você pode usar isso para publicar a hora na Internet. No próximo artigo, mostraremos como exibir o Horário da Internet no ESP sem usar nenhum módulo RTC.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"
RTC_DS3231 rtc;
//char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char daysOfTheWeek[7][12] = {"Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"};
#define OLED_MOSI  23
#define OLED_CLK   18
#define OLED_DC    4
#define OLED_CS    5
#define OLED_RESET 2
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup() 
{

   Serial.begin(9600);

  if (! rtc.begin()) {
     Serial.println("Não foi possível encontrar RTC");
     while (1);
  }
 
  rtc.adjust(DateTime(__DATE__, __TIME__));
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
  display.setTextColor(WHITE);
  //display.startscrollright(0x00, 0x0F);
  display.setTextSize(2);
  display.setCursor(0,5);
  display.print(" Relógio ");
  display.display();
  delay(3000);
}

void loop()
{
    DateTime now = rtc.now();

    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(75,0);
    display.println(now.second(), DEC);

    display.setTextSize(2);
    display.setCursor(25,0);
    display.println(":");

    display.setTextSize(2);
    display.setCursor(65,0);
    display.println(":");

    display.setTextSize(2);
    display.setCursor(40,0);
    display.println(now.minute(), DEC);

    display.setTextSize(2);
    display.setCursor(0,0);
    display.println(now.hour(), DEC);

    display.setTextSize(1);
    display.setCursor(0,15);
    display.println(now.day(), DEC);
    display.print(daysOfTheWeek[now.dayOfTheWeek()]);

    display.setTextSize(1);
    display.setCursor(25,15);
    display.println("-");

    display.setTextSize(1);
    display.setCursor(40,15);
    display.println(now.month(), DEC);

    display.setTextSize(1);
    display.setCursor(55,15);
    display.println("-");

    display.setTextSize(1);
    display.setCursor(70,15);
    display.println(now.year(), DEC);

    display.display(); 
}

 

Espero que tenha gostado desta explicação de como usar o Relógio (Clock) DS3231 no ESP32 com Oled, para facilitar segue o sketch completo no (Link)