Já fizemos um tutorial sobre DS1307 fazendo interface com o módulo ESP32 . Hoje discutiremos os fundamentos do sensor RTC DS3231 e verificaremos como interligá-lo com a placa ESP32.
Índice:
1. O que é o Módulo DS3231 RTC
2. Como fazer a interface do DS3231 com ESP32
6. Como exibir o tempo RTC DS3231 em uma tela OLED usando ESP32
1. O que é o Módulo RTC DS3231
O módulo DS3231 fornece cronometragem altamente precisa. Inclui um oscilador de cristal com compensação de temperatura integrado (TCXO) para nos dar o tempo com grande precisão. O módulo opera no protocolo I2C usando a configuração Master-Slave. Ele pode manter a hora e a data com uma bateria reserva, mesmo quando não há energia de entrada principal. É comumente usado em dispositivos que dependem de hora e data.
O DS3231 controla segundos, minutos e horas. Também pode manter um registro de datas e dias da semana. Ao lidar com anos bissextos, ele ajusta automaticamente o tempo de acordo. Além disso, ele pode exibir a hora no formato de 12 ou 24 horas, completo com um indicador AM/PM.
1.1. DS3231 versus DS1307
Tanto o DS3231 quanto o DS1307 são módulos de cronometragem com suporte de bateria reserva. No entanto, o DS3231 é mais preciso que o DS1307. A principal razão é que o DS1307 depende de um cristal externo de 32kHz para cronometragem.
No entanto, o RTC DS3231 possui um oscilador de cristal compensado por temperatura interno (TCXO). Isso o torna menos afetado pela temperatura externa e, como resultado, tem uma vantagem de precisão de alguns minutos por ano em relação ao DS1307.
1.2. Pinagem DS3231
DS3231 funciona usando o protocolo I2C. No centro deste módulo RTC, temos o chip RTC preciso projetado pela Maxim. Este chip lida com todas as funções de tempo e se comunica usando o I2C com ESP32 ou placa Arduino.
Os pinos principais dos módulos RTC DS3231 são:
- VCC: Conecte este pino ao terminal positivo da sua fonte de alimentação.
- GND: Conexão à terra.
- Normas de trânsito: Pino de dados seriais (usado para comunicação I2C).
- SCL: Pino Serial Clock (também parte da interface I2C).
- Perguntas frequentes: Pino de saída de onda quadrada (pode gerar um sinal periódico, por exemplo, para alarmes ou outros fins de temporização).
- 32K: Saída do oscilador de 32KHz (útil para aplicações de temporização precisas).
A seguir estão os principais componentes integrados do módulo RTC DS3231:
- Suporte da bateria: Permite que o módulo continue funcionando quando a alimentação externa estiver ausente.
- Chip RTC: Este chip mantém a hora e a data.
- EEPROM AT24C32: Ele fornece armazenamento não volátil para registro de dados e outras finalidades com 1.000.000 de ciclos de gravação.
- TCXO: Oscilador com compensação de temperatura para fornecer o tempo correto para uma faixa variável de temperaturas.
- Sensor de temperatura: Ele faz leituras de temperatura e as fornece como parte do recurso do módulo.
2. Como fazer interface entre DS3231 e ESP32
Para fazer a interface do DS3231 com o ESP32, você precisa instalar o Biblioteca RTClib primeiro. Depois de instalar esta biblioteca Adafruit RTC, você pode conectar sua placa ESP32 ao DS3231 usando o protocolo I2C. Para conectar o ESP32 I2C ao módulo RTC DS3231, você pode usar os pinos D21 e D22 do ESP32.
2.1. Diagrama de fiação do ESP32 com RTC DS3231
Primeiro, você deve conectar o ESP32 ao módulo I2C RTC DS3231. Siga a configuração de pinos fornecida abaixo para fiação:
Depois de conectar o ESP32 ao RTC DS3231, seu diagrama de fiação deverá ficar assim. Você também pode alimentar o DS3231 a partir do pino VIN do ESP32. As tensões operacionais do DS3231 são de 3,3 a 5,5 VCC.
2.2. Instalando as bibliotecas necessárias
Quando o circuito estiver pronto, o próximo passo é configure sua placa ESP32 com Arduino IDE . Para fazer a interface do DS3231, você precisará instalar o Biblioteca RTClib . Você pode instalá-lo usando o gerenciador de biblioteca Arduino IDE.
3. Ferragens
Você precisará do seguinte hardware para projetar o relógio RTC baseado em DS3231 com ESP32:
- Placa de desenvolvimento ESP32
- Módulo RTC DS3231
- Bateria CR2032
- Fios de ligação em ponte
- Tábua de ensaio
4. Código
Após instalar a biblioteca RTC, a próxima parte é escrever o código do DS3231 e carregá-lo na placa ESP32. Primeiro, você deve escrever o código para definir a hora atual. Depois de definir a hora no DS3231, ele lembrará a hora e continuará funcionando mesmo que a placa ESP32 seja desligada.
Agora abra o Arduino IDE, compile e grave o código na placa ESP32.
#include#include
RTC_DS3231 rtc ; // Inicializa uma instância da classe RTC_DS3231
vazio configurar ( ) {
Serial. começar ( 115200 ) ;
Arame. começar ( ) ;
se ( ! RTC. começar ( ) ) {
Serial. imprimir ( 'RTC não detectado' ) ;
enquanto ( 1 ) ; // Pendura indefinidamente se o RTC não for encontrado
}
// Remova o comentário da linha abaixo para definir a data e hora inicial
//rtc.adjust(DateTime(__DATE__, __TIME__));
}
vazio laço ( ) {
//Lê a hora atual do sensor (DS3231)
DataHora agora = RTC. agora ( ) ;
// Imprime a data e a hora na mesma linha com dois dígitos para horas, minutos e segundos
Serial. imprimir ( 'Data atual: ' ) ;
Serial. imprimir ( agora. ano ( ) , DEZEMBRO ) ;
Serial. imprimir ( '/' ) ;
imprimir dois dígitos ( agora. mês ( ) ) ;
Serial. imprimir ( '/' ) ;
imprimir dois dígitos ( agora. dia ( ) ) ;
Serial. imprimir ( ' Hora atual: ' ) ;
imprimir dois dígitos ( agora. hora ( ) ) ;
Serial. imprimir ( ':' ) ;
imprimir dois dígitos ( agora. minuto ( ) ) ;
Serial. imprimir ( ':' ) ;
imprimir dois dígitos ( agora. segundo ( ) ) ;
Serial. imprimir ( ) ;
atraso ( 1000 ) ; //Atualiza a cada 1 segundo
}
vazio imprimir dois dígitos ( interno número ) {
se ( número < 10 ) {
Serial. imprimir ( '0' ) ; // Adiciona um zero à esquerda para números de um único dígito
}
Serial. imprimir ( número ) ;
}
4.1. Explicação do código
O código começa inicializando a comunicação serial I2C com a ajuda de uma biblioteca de fios. Em seguida, incluímos a biblioteca RTC da Adafruit para interface com o módulo DS3231. Esta biblioteca fornece uma função para interagir com o módulo RTC DS3231.
No configurar parte, o barramento I2C é iniciado e verificado quanto aos dispositivos I2C disponíveis. Se não for encontrado, o programa trava indefinidamente. A taxa de transmissão também é definida para que você possa verificar a saída no monitor serial do Arduino IDE.
Acertando o relógio pela primeira vez
Ao programar o DS3231, você deve descomente esta linha . Isso obterá a hora do sistema e a armazenará na memória RTC. Ao fazer isso, o relógio do módulo RTC é sincronizado com o relógio do sistema.
//rtc.adjust(DateTime(__DATE__, __TIME__));
Depois que o tempo for definido, você deverá reenviar o código acima, mas desta vez você deverá comente a linha da função rtc.adjust() . Caso contrário, isso substituirá o tempo definido anteriormente e quando o ESP32 for desligado, o RTC iniciará novamente a partir do momento em que você carregou o código.
Ao fazer isso, seu tempo permanecerá presente no fundo do módulo RTC enquanto o módulo RTC tiver energia em sua célula CR2032.
No laço parte, a data e a hora atuais são lidas no módulo DS3231 usando a função rtc.now(). Os componentes de data e hora são extraídos e a data formatada é impressa no monitor serial Arduino IDE a cada segundo.
5. Saída
Após fazer o upload do código para a placa ESP32, você verá que a hora começará a ser impressa no monitor serial do Arduino IDE.
6. Como exibir o tempo RTC DS3231 na tela OLED usando ESP32
Você também pode dar um passo adiante e exibir a hora na tela OLED depois de lê-la no DS3231. Para isso, você precisa instalar o Biblioteca Adafruit GFX SSD1306 no IDE do Arduino.
Depois de instalado, conecte o ESP32 ao módulo OLED e RTC na seguinte configuração.
Depois de conectar seu sensor, você verá o circuito semelhante ao diagrama esquemático abaixo.
Agora carregue o seguinte código DS3231 na placa ESP32.
#include#incluir
#incluir
#include 'RTClib.h'
RTC_DS3231 rtc ;
Caracteres dias [ 7 ] [ 12 ] = { 'Domingo' , 'Segunda-feira' , 'Terça-feira' , 'Quarta-feira' , 'Quinta-feira' , 'Sexta-feira' , 'Sábado' } ;
Tela Adafruit_SSD1306 = Adafruit_SSD1306 ( 128 , 64 , & Arame , - 1 ) ;
vazio configurar ( ) {
Serial. começar ( 115200 ) ;
mostrar. começar ( SSD1306_SWITCHCAPVCC , 0x3C ) ;
se ( ! RTC. começar ( ) ) {
Serial. imprimir ( 'Não foi possível encontrar o RTC! Verifique o circuito.' ) ;
enquanto ( 1 ) ;
}
//descomente a linha abaixo ao definir o tempo pela primeira vez
//rtc.adjust(DateTime(__DATE__, __TIME__));
mostrar. limparDisplay ( ) ;
mostrar. definirTextColor ( BRANCO ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( 0 , vinte ) ;
mostrar. imprimir ( 'RELÓGIO RTC' ) ;
mostrar. mostrar ( ) ;
atraso ( 5.000 ) ;
}
vazio laço ( ) {
DataHora agora = RTC. agora ( ) ;
mostrar. limparDisplay ( ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( 75 , 0 ) ;
mostrar. imprimir ( agora. segundo ( ) , DEZEMBRO ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( 25 , 0 ) ;
mostrar. imprimir ( ':' ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( 65 , 0 ) ;
mostrar. imprimir ( ':' ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( 40 , 0 ) ;
mostrar. imprimir ( agora. minuto ( ) , DEZEMBRO ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( 0 , 0 ) ;
mostrar. imprimir ( agora. hora ( ) , DEZEMBRO ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( 0 , 25 ) ;
mostrar. imprimir ( agora. dia ( ) , DEZEMBRO ) ;
mostrar. imprimir ( dias [ agora. dia da semana ( ) ] ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( vinte , 25 ) ;
mostrar. imprimir ( '-' ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( 35 , 25 ) ;
mostrar. imprimir ( agora. mês ( ) , DEZEMBRO ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( 60 , 25 ) ;
mostrar. imprimir ( '-' ) ;
mostrar. setTextSize ( 2 ) ;
mostrar. definirCursor ( 75 , 25 ) ;
mostrar. imprimir ( agora. ano ( ) , DEZEMBRO ) ;
mostrar. mostrar ( ) ;
}
Explicação do código
O código começou com algumas bibliotecas importantes necessárias para telas RTC e OLED. O display OLED é configurado usando a biblioteca Adafruit SSD1306.
Na parte do loop, a data e hora atuais são obtidas usando rtc.now(). Depois disso, a tela OLED é limpa e os componentes da hora são exibidos em formato de relógio digital. Você também pode modificar o código para ajustar o formato de data e hora.
Assim que o código for carregado em sua placa, você obterá a hora atual na tela OLED.
Observação: O código acima usa o 0x3C Endereço I2C para OLED. Este é o endereço I2C mais comum disponível em monitores OLED SSD1306. Se quiser encontrar o endereço I2C da sua tela OLED, você pode executar o Código do scanner I2C .
Conclusão
DS3231 é um sensor RTC que pode ser usado para cronometragem. Ele possui uma bateria reserva que pode manter o tempo preciso mesmo se a placa do microcontrolador estiver desligada. Para fazer a interface do ESP2 com o DS3231, você deve instalar a biblioteca RTClib em seu Arduino IDE. Depois disso, é necessário conectar o módulo RTC através do protocolo I2C usando o pino digital do ESP32. Uma vez conectado, basta fazer upload do código e ajustar a hora. Agora o sensor RTC marcará o tempo e você poderá lê-lo em seu monitor serial em projetos baseados em tempo.