Relógio RTC com o ESP8266

Relógio RTC com o ESP8266

05/02/2016 Alexandre Vicenzi 4 min de leitura

No artigo de hoje veremos como utilizar um RTC (Real Time Clock) com o dispositivo ESP8266. Este módulo incorpora funções Wi-Fi e foi pensado para projetos de baixo custo para mobilidade, eletrônicos vestíveis, Internet das Coisas (IoT), e o que sua criatividade permitir.

Este artigo pode ser um tanto quanto simples, mas utilizar um RTC (Real Time Clock) em um projeto é de grande importância as vezes. Principalmente quando desejamos monitorar algo em determinados horários. Vamos pegar um exemplo básico, supondo que você esteja monitorando a temperatura do ambiente, é interessante saber a hora da medição para calcular a variação de temperatura durante um determinado período. Sim, este é um exemplo simples, mas exemplifica claramente o uso de um RTC.

Antes de começar vamos a lista de materias necessários.

Material

Posso utilizar outro ESP?

Sim e não, o ESP8266 possui interface I2C, porém não são todos os modelos de ESP que disponibilizam estes pinos. No caso do ESP-01 estes pinos não estão disponíveis no módulo, apesar de estarem no componente pricipal. Já o ESP-07 é basicamente o ESP-12 com antena externa, sendo assim é possível utilizá-lo.

DS3231

O DS3231 é um relógio de tempo real (Real Time Clock) de alta precisão e baixo consumo de energia com interface de comunicação I2C.

Código

O código abaixo esta escrito na linguagem de programação Lua, e para tal, você deve utilizar o firmware NodeMCU no seu ESP. Se você tem dúvidas de como alterar o firmware do seu ESP, eu recomento a leitura do NodeMCU: Lua para o ESP8266.

Na tabela abaixo são explicadas as constantes necessárias:

I2C_ADDRESS Endereço I2C do DS3231.
I2C_REG Endereço iniciar de leitura
I2C_ID ID do I2C
SDA_PIN Pino onde esta o SDA (1-12)
SCL_PIN Pino onde esta o SCL (1-12)

Como o DS3231 utiliza utiliza o sistema de numeração BCD (Binary-coded decimal), necessitamos das funções to_decimal e to_bcd para converter um número inteiro para BCD.

O método get_time é responsável por obter a data/hora atual. Inicialmente enviamos para o I2C qual endereço e posição vamos ler. Depois, solicitamos 7 bytes, pois sabemos quantos bytes ler e o que cada posição contém. Como cada parte da data/hora consome 1 byte e sabendo que o endereço inicial é 00h, a última porção da data/hora estará no endereço 06h. Conforme datasheet do DS3231, segue abaixo os endereços de cada parte:

00h Segundos (00-59)
01h Minutos (00-59)
02h Horas (00-23)
03h Dia da Semana (1-7)
04h Dia do Mês (01-31)
05h Mês (01-12)
06h Ano (00-99)

O método get_time_iso_8601 retorna a data/hora no formato ISO 8601, que é uma representação internacional de data e hora.

Por fim, o método set_time é similar ao get_time. A ordem de gravação é a mesma ordem de leitura, assim como na leitura é necessário converter de inteiro para BCD.

Exemplo de uso

No exemplo abaixo, inicialmente alteramos a hora com a função set_time, para ajustar o relógio. Em seguida solicitamos a hora atual com a função get_time, esta função retorna uma tabela de inteiros. Por fim, solicitamos a hora atual no formato ISO 8601 com a função get_time_iso_8601, que retornará uma string.

> =set_time(0, 11, 0, 3, 3, 2, 16) > =get_time() 06 11 00 03 03 02 16 > =get_time_iso_8601() 2016-02-03-T00:11:37

Para ajudar um pouco a quem está começando, a imagem abaixo demonstra como utilizar o ESPlorer para fazer o upload do arquivo e a execução dos comandos.

ESPlorer

Clique na imagem para ampliá-la

Consideração final

Este é o primeiro projeto com o ESP de muitos que ainda estão por vir. Como o NodeMCU utiliza Lua, esta é uma  linguagem de programação que iremos aprender ao longo dos artigos. Mesmo que você não conheça Lua, não precisa se preocupar, eu também não conhecia antes de utilizar o NodeMCU.

Gostaria de agradecer a FILIPEFLOP pelo material fornecido para a realização deste artigo.

Se ficou alguma dúvida, com o ESP, NodeMCU ou o ESPlorer, deixe um comentário que iremos ajudá-lo. :)