ESP32 Real Time Clock usando Módulo DS3231
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.
Conteudo
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 PIN | Nome do Pin | Outros nomes | Uso |
1 | Gnd | Ground | Pino de aterramento do módulo |
2 | Vdd | Vcc, 5V | Pino de alimentação (3-5 V tolerável) |
3 | SCK | D0,SCL,CLK | Atua como o pino do relógio. Usado para I2C e SPI |
4 | SDA | D1,MOSI | Pino de dados do módulo. Usado para IIC e SPI |
5 | RES | RST,RESET | Reinicia o módulo (útil durante o SPI) |
6 | DC | A0 | Pino de comando de dados. Usado para protocolo SPI |
7 | CS | Chip 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:
- Pino CS (seleção de chip) de OLED -> PIN D5 de ESP32
- Pino DC do OLED -> PIN D4 do ESP32
- PIN RES de OLED -> PIN D2 de ESP32
- Pino SDA de OLED -> PIN D23, ou seja, MOSI de ESP32
- Pino SCK de OLED -> PIN D18, ou seja, SCK de ESP32
- Vdd de OLED -> Vcc de ESP32
- 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)