ESP32 Relógio em tempo real (RTC) usando DS1307 e display OLED

Esp32 Relogio Em Tempo Real Rtc Usando Ds1307 E Display Oled



O ESP32 vem com um módulo RTC integrado, mas que funciona apenas quando há energia. Se houver perda de energia, o relógio será reiniciado e não será possível manter a hora correta. Portanto, se você deseja controlar o tempo ou controlar qualquer dispositivo baseado em tempo, experimente o sensor DS1307 RTC. No entanto, você pode estar pensando em conectar uma bateria reserva à sua placa ESP32, mas esse não é o melhor cenário a ser feito se houver falta de energia. A melhor alternativa é utilizar o sensor DS1307, pois ele vem com bateria embutida que pode durar no mínimo um ano.

Para deixar as coisas mais claras, o Real-Time Clock (RTC) interno do ESP32 pode monitorar o tempo mesmo quando o processador principal está desligado ou em hibernação profunda. Você pode usar o ESP32 RTC para controlar o tempo sem usar muita energia ou afetar o processador principal. Mas ele ainda requer energia para funcionar, não muito, mas é necessária uma quantidade mínima de energia para que o RTC interno funcione.

Então com isso só nos resta a solução de utilizar o módulo RTC externo. Vamos conferir os passos de interface da placa ESP32 com o módulo DS1307 RTC.







Conteúdo:

1. O que é o módulo RTC DS1307

DS1307 é um dispositivo de baixo consumo de energia que pode controlar a hora e a data com precisão. Ele usa o formato decimal codificado em binário (BCD). Ele pode informar a hora em um formato detalhado, como segundos, minutos e até horas e dias. Você também pode imprimir a data em formato completo, como mês e ano. Ele também sabe quando é um ano bissexto, até 2100. Para se comunicar com o DS1307, você pode usar o protocolo I2C.





O DS1307 possui uma bateria embutida que pode alimentá-lo por cerca de um ano sem uma fonte externa de 5V. Usando esta bateria reserva, ele pode reter a hora mesmo quando a energia principal está desligada. Também possui 56 bytes de SRAM para armazenar alguns dados. O DS1307 é um dispositivo prático que possui muitas aplicações quando combinado com uma placa Arduino ou ESP32. Por exemplo, esses dados podem ser úteis no registro de dados, sistemas de alarme ou controle industrial. Se você precisa de uma cronometragem confiável, o DS1307 é uma ótima opção.





Especificações do módulo RTC DS1307

O módulo RTC DS1307 consiste no RTC IC, uma EEPROM, um oscilador de cristal e um suporte de bateria para backup.



Abaixo estão os detalhes dessas peças:

DS1307 RTC CI : O DS1307 RTC IC é um chip de 8 pinos que controla a hora e a data usando o protocolo I2C. Consome muito pouca energia, menos de 500nA. Ele pode exibir a hora em segundos, minutos e horas e a data em dias, meses e anos. Ele também pode alternar entre os formatos de 24 e 12 horas.

CI EEPROM 24C32 : O IC EEPROM 24C32 é um chip de 32 bytes da Atmel que armazena as configurações, hora e data. Ele também usa o protocolo I2C.

Cristal de 32,768 kHz : O oscilador de cristal de 32,768kHz fornece a frequência de clock para o DS1307 RTC IC.

Suporte da bateria : O suporte da bateria contém uma bateria CR2032. É uma célula tipo moeda de lítio de 3V. Ele fornece energia contínua ao DS1307 RTC IC.

Fornecimento de sensor DS18B20 : A disposição do sensor DS18B20 permite soldar e usar o sensor de temperatura DS18B20. Não é pré-soldado. Você pode soldar o pacote passante e obter a temperatura do pino DS do módulo.

A lista abaixo fornece algumas especificações rápidas do sensor DS1307 RTC:

  • Tensão operacional: 4,5–5,5 V, normalmente 5 V
  • Consumo atual : Menos de 1,5 mA
  • Precisão : 0–40 °C, depende do cristal
  • Bateria : CR2032 (moeda de 3 V)
  • Memória : 56 bytes de RAM não volátil
  • Interface : Interface serial de dois fios (I2C)
  • Saída : pino de saída de 1 Hz
  • Saída de onda quadrada programável : Consome menos de 500 nA no modo de bateria reserva
  • Detecção de falha de energia : Detecção automática de falha de energia e circuito de comutação
  • Circuito de detecção de potência : Pode alternar automaticamente para fazer backup do fornecimento em caso de falta de energia
  • Compensação de ano bissexto : Válido até o ano 2100

Pinagem do módulo RTC DS1307

O módulo possui vários pinos com funções diferentes.

  • CCV é o pino que precisa de uma tensão DC entre 3,3 V e 5,5 V para alimentar o módulo.
  • GND é o pino para baixa tensão ou terra.
  • IASD e SCL são os pinos que comunicam dados e sinais de clock através do barramento I2C.
  • DS é o pino que mede a temperatura com o sensor DS1307 se você tiver um no módulo RTC.
  • QUADRADO é o pino que gera um sinal de onda quadrada com frequência de 1 Hz, 4 kHz, 8 kHz ou 32 kHz, dependendo de como você o programa.
  • UM é o pino que usa uma bateria de 3V para manter a hora precisa quando a alimentação principal está desligada.

2. Como fazer interface entre RTC DS1307 e display OLED com ESP32

Para fazer a interface do ESP32 com DS1307 e display OLED, você pode usar os pinos I2C integrados da placa ESP32. Tanto o display DS1307 quanto o OLED são dispositivos baseados em I2C. Em seguida, pode se comunicar usando o protocolo mestre-escravo I2C através do barramento I2C.

Antes de avançarmos para a interface do ESP32 com DS1307 e display OLED, primeiro você precisa instalar algumas bibliotecas necessárias.

Instalando as bibliotecas necessárias

Você precisará de duas bibliotecas, uma para o módulo RTC e outra para o display OLED. Usando OLED com um módulo RTC, você pode criar visualizações de relógio incríveis e interativas. Se você não planeja exibir a hora na tela, pode pular a instalação da biblioteca.

A seguir estão as duas bibliotecas que você precisará:

  • RTClib (da Adafruit) é uma biblioteca IDE do Arduino para definir e obter tempo de um RTC. Ele também fornece classes para manipulação de datas, horários e durações. Usando esta biblioteca, você pode fazer interface e programar módulos de relógio em tempo real (RTC), como DS1307 e DS3231.
  • S SD1306 (da Adafruit) é uma biblioteca para Arduino, com a qual você pode interagir e programar os displays OLED com Arduino ou qualquer outra placa microcontroladora.

Para baixar e instalar essas duas bibliotecas no Arduino IDE, primeiro abra o Gerente de Biblioteca procure a biblioteca RTClib e clique em Instalar :

Você terá a opção de instalar apenas a biblioteca ou suas dependências. Clique no Instalar tudo botão para instalar completamente a biblioteca. Desta forma você não receberá nenhum erro se modificar o código que depende das dependências desta biblioteca.

Da mesma forma, procure a biblioteca SSD1306. Esta biblioteca é necessária para um display OLED. Clique Instalar para prosseguir.

Desta vez você também receberá a mesma mensagem de confirmação. Clique no Instalar tudo opção.

Agora ambas as bibliotecas para OLED e DS1307 estão instaladas e prontas para uso. Mas antes disso, primeiro descubra o endereço I2C do display OLED.

3. Encontrando o endereço I2C do display OLED

O endereço I2C é um identificador exclusivo para cada dispositivo no barramento I2C. Permite que o dispositivo mestre se comunique com um dispositivo escravo específico, enviando dados para o seu endereço. O objetivo do endereço I2C é evitar conflitos e confusão entre vários dispositivos no mesmo barramento.

Para obter o endereço de um dispositivo I2C, você pode usar um esboço simples que escaneia o ônibus e imprime os endereços dos dispositivos que encontra. Alternativamente, você pode verificar a folha de dados do dispositivo para ver seu endereço padrão ou configurável.

Aqui, em nosso caso, após executar o código do scanner I2C, o seguinte endereço I2C da tela OLED é exibido no terminal IDE do Arduino.

Na maioria das vezes, há uma grande chance de você também obter o mesmo 0x3C endereço para sua tela OLED.

4. Interface do módulo OLED e RTC DS1307 com ESP32

1. Conecte os pinos SDA e SCL do módulo DS1307 e do Display OLED para os pinos I2C do ESP32. Geralmente, estes são GPIO 21 e GPIO 22 , mas você pode atribuir quaisquer outros pinos também no código, se necessário.

2. Conecte o VCC e o GND do DS1307 e o display OLED aos pinos 3,3V e GND do ESP32.

3. Insira uma bateria de célula tipo moeda CR2032 no módulo DS1307 para fornecer energia de reserva para o relógio em tempo real.

4. Carregue o código de exemplo deste tutorial em sua placa ESP32. Modifique o código para saídas personalizadas.

Após o upload, um relógio começará a partir da hora definida e exibirá a hora na tela OLED.

5. Diagrama de Circuito

O diagrama de circuito do ESP32 com DS1307 é simples, com apenas quatro fios que precisam ser conectados. Você pode encurtar os fios I2C SDA e SCL dos sensores OLED e DS1307. Da mesma forma, para alimentar ambos os sensores, podem ser utilizados os pinos 3V3 e GND da placa ESP32. Você também pode alimentar de uma fonte separada, se necessário.

Observação : É seguro alimentar o RTC DS1307 a partir de um pino de 3,3 V do ESP32 se o limite de corrente do ESP32 não for excedido. Mas se quiser estar em um local seguro, você pode usar uma fonte de alimentação separada para o módulo RTC ou experimentar o sensor DS3231 de baixa potência, cuja faixa operacional está entre 3,3 e 5,5 VCC.

A imagem abaixo ilustra a conexão do ESP32 com o sensor RTC DS1307.

Da mesma forma, se você deseja conectar a tela OLED para exibir a hora, você pode usar os mesmos pinos I2C e os pinos de alimentação da placa ESP32.

6. Código

Usando o código abaixo, definiremos a data e hora atuais no RTC. Após definir a hora, o código exibirá a hora no terminal IDE do Arduino. Antes de fazer upload do código, você precisa atualizá-lo com a data e hora atuais.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Dias_da_semana [ 7 ] [ 12 ] = { 'Domingo' , 'Segunda-feira' , 'Terça-feira' , 'Quarta-feira' , 'Quinta-feira' , 'Sexta-feira' , 'Sábado' } ;
configuração nula ( ) {
Serial.begin ( 115200 ) ;
#ifndef ESP8266
enquanto ( ! Serial ) ;
#fim se
se ( ! DS1307_RTC.begin ( ) ) {
Serial.println ( 'Não foi possível encontrar o RTC' ) ;
enquanto ( 1 ) ;
}
DS1307_RTC.ajustar ( Data hora ( F ( __DATA__ ) , F ( __TEMPO__ ) ) ) ;
}
ciclo vazio ( ) {
DataHora agora = DS1307_RTC.now ( ) ;
Serial.print ( agora.ano ( ) , dezembro ) ;
Serial.print ( '/' ) ;
Serial.print ( agora.mês ( ) , dezembro ) ;
Serial.print ( '/' ) ;
Serial.print ( agora.dia ( ) , dezembro ) ;
Serial.print ( '(' ) ;
Serial.print ( Dias da semana [ agora.diaDaSemana ( ) ] ) ;
Serial.print ( ')' ) ;
Serial.print ( agora.hora ( ) , dezembro ) ;
Serial.print ( ':' ) ;
Serial.print ( agora.minuto ( ) , dezembro ) ;
Serial.print ( ':' ) ;
Serial.print ( agora.segundo ( ) , dezembro ) ;
Serial.println ( ) ;
atraso ( 1000 ) ;
}

Este código usa o Biblioteca RTClib para fazer interface com um módulo de relógio em tempo real DS1307 que monitora a data e a hora.

O configurar função começou com a inicialização da taxa de transmissão. Em seguida, dentro desta seção, definimos a função de sincronização de data e hora do computador com o sensor DS1307. Isto irá carregar o tempo de compilação do código para o sensor RTC.

Você pode usar o laço função para obter a data e hora do RTC. Então, você pode exibi-lo no monitor serial assim: ano/mês/dia (dia da semana) hora:minuto:segundo. Lembre-se de adicionar um atraso de um segundo após cada loop, para que o código não seja executado muito rápido.

Exibir a hora atual no display OLED

Para exibir a mesma hora na tela OLED, temos que adicionar uma parte de código extra para a tela OLED. Basta fazer upload do código fornecido. Este código exibirá a hora atual na tela OLED.

Lembre-se, aqui usamos o módulo de exibição OLED SSD I2C 128 × 64 de 0,96 polegadas. Se você estiver usando qualquer outro tamanho, modifique o código de acordo. Além disso, verifique o endereço I2C e modifique-o no código fornecido. No nosso caso, temos um endereço I2C 0x3C para a tela OLED.

#include
#incluir
#incluir
#include 'RTClib.h'
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Tela Adafruit_SSD1306 ( TELA_WIDTH, TELA_HEIGHT, & Arame, - 1 ) ;
RTC_DS1307 RTC;
dias de caracteres [ 7 ] [ 12 ] = { 'Domingo' , 'Segunda-feira' , 'Terça-feira' , 'Quarta-feira' , 'Quinta-feira' , 'Sexta-feira' , 'Sábado' } ;
configuração nula ( ) {
Serial.begin ( 115200 ) ;
se ( ! RTC.begin ( ) ) {
Serial.println ( 'Não foi possível encontrar o RTC' ) ;
enquanto ( 1 ) ;
}
RTC.ajustar ( Data hora ( F ( __DATA__ ) , F ( __TEMPO__ ) ) ) ;
se ( ! display.begin ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'Falha na alocação do SSD1306' ) ) ;
para ( ;; ) ;
}
atraso ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( BRANCO ) ;
display.setCursor ( 30 , vinte ) ;
display.println ( 'Linux' ) ;
display.display ( ) ;
atraso ( 3.000 ) ;
display.clearDisplay ( ) ;
}
ciclo vazio ( ) {
DateTime agora = RTC.agora ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
exibir.imprimir ( agora.dia ( ) ) ;
exibir.imprimir ( '/' ) ;
exibir.imprimir ( agora.mês ( ) ) ;
exibir.imprimir ( '/' ) ;
exibir.imprimir ( agora.ano ( ) ) ;
display.println ( dias [ agora.diaDaSemana ( ) ] ) ;
display.println ( ' ' ) ;
display.setCursor ( 0 , 40 ) ;
se ( agora.hora ( ) < 10 )
exibir.imprimir ( '0' ) ;
exibir.imprimir ( agora.hora ( ) ) ;
exibir.imprimir ( ':' ) ;
se ( agora.minuto ( ) < 10 )
exibir.imprimir ( '0' ) ;
exibir.imprimir ( agora.minuto ( ) ) ;
exibir.imprimir ( ':' ) ;
se ( agora.segundo ( ) < 10 )
exibir.imprimir ( '0' ) ;
display.println ( agora.segundo ( ) ) ;
display.display ( ) ;
}

O código começou com as bibliotecas que instalamos para o RTC e o display. Depois disso, define o tamanho da tela e o endereço de exibição. Ele inicializa o array com nomes de dias da semana.

O configurar parte começa com comunicação serial. Verifica se o RTC e o display estão funcionando ou não. Depois disso, definimos uma string de texto “Linuxhint” que será exibida por 3 segundos. Esta é apenas uma mensagem de abertura ou inicialização, você também pode modificar esta mensagem com seu texto personalizado.

O laço função obtém a data e hora do módulo DS1307. Depois disso, limpa o display e imprime a data e a hora de forma formatada. O código também adiciona zeros à esquerda às horas, minutos e segundos, caso seus valores sejam menores que 10.

7. Ferragens

Após enviar o código para a placa ESP32, você verá a seguinte saída na tela OLED. Para hardware, usamos a tela OLED e um módulo I2C RTC DS1307. É utilizada placa ESP32 com 30 pinos. Você também pode experimentar qualquer outra placa ESP32, mas certifique-se de conectar os pinos I2C corretamente.

Conclusão

O RTC DS1307 possui uma SRAM de 56 bytes com suporte para bateria reserva. É um dispositivo de 8 pinos que utiliza um protocolo de comunicação I2C. Para fazer a interface do módulo DS1307 RTC com o ESP32, você pode usar os pinos I2C (GPIO 22 (SCL) e GPIO 21 (SDA)) da placa ESP32. Você pode imprimir a hora em um console Arduino IDE ou usar qualquer tela como OLED ou I2C LCD para exibir a hora. O módulo DS1307 RTC é um dispositivo útil para controlar a hora e a data em diversas aplicações. Algumas aplicações principais incluem registradores de dados, relógios digitais e smartwatches.