Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto 52 - Relógio digital Arduino com despertador - RTC DS3231
Projeto 52 - Relógio digital Arduino com despertador - RTC DS3231
Angelo Luis Ferreira | 04/02/2019
Acessos: 24.133
Básico - Projeto 52
Relógio Digital com despertador - LCD + I2C + RTC DS3231
Objetivo
Neste projeto mostraremos como utilizar o o módulo RTC DS3231 para criar um relógio digital com monitoramento da temperatura ambiente e alarme. O relógio exibirá no display a hora, minutos e segundos e a cada 3 segundos exibe a data e a temperatura. Ao setarmos a hora de disparo do alarme, o relógio funcionará como um despertador ou como um controlador de tempo para processos eletrônicos.
Observações:
1) Utilizamos o módulo RTC DS3231 como um temporizador alta precisão e controle de temperatura ambiente.
2) Este projeto foi desenvolvido para um display LCD com controlador HD44780 em conjunto com o módulo serial I2C (opcional), que poderá ser separado ou soldado diretamente no display.
3) Se você não tem um módulo I2C para display LCD, poderá adaptar o projeto para o display LCD sem o adaptador. Veja como montar o display no projeto Projeto 38 - Controlando um display LCD (instalação e comandos básicos).
4) Este projeto utiliza uma biblioteca específica para o módulo RTC DS1397 e portanto não funciona com outros módulos RTC.
Módulo RTC DS3231 de alta precisão: O Real Time Clock (RTC) DS3231 é um relógio de tempo real de alta precisão e baixo consumo de energia. Em sua placa vem embutido um sensor de temperatura, um gravador de dados EPROM e um cristal oscilador para melhorar sua exatidão.
Observações sobre o módulo RTC DS3231:
1) Utiliza o protocolo de comunicação I2C. O I2C é um protocolo de baixa velocidade de comunicação criado pela Philips para comunicação entre placa mãe e dispositivos, Sistemas Embarcados e circuitos de celulares.
2) É capaz de fornecer informações como segundo, minutos, dia, data, mês e ano (de 2000 a 2099). Correções como meses com menos de 31 dias e anos bissextos são corrigidos automaticamente e pode operar tanto no formato 12 horas como 24 horas.
3) Em caso de falha de energia o DS3231 automaticamente aciona a bateria para evitar perda de dados.
4) Possui um sensor de temperatura com precisão de 3ºC.
Aplicação
Para fins didáticos e projetos para controle de tempo e temperatura com exibição em display de cristal líquido.
Componentes necessários
Referência
|
Componente
|
Quantidade
|
Imagem
|
Observação
|
Protoboard |
Protoboard 830 pontos |
1 |
|
No mínimo utilizar protoboard com 830 pontos
|
Jumpers |
Kit cabos ligação macho / macho |
1 |
|
|
Display LCD |
Display LCD 16 X 2 com pinos soldados |
1 |
|
LCD que utilize o controlador HD44780 (veja na descrição ou datasheet do componente)
O display poderá ser de qualquer cor (fundo verde, azul ou vermelho)
|
Módulo I2C para display LCD |
Módulo I2C com CI PCF8574
(opcional)
|
1 |
|
O módulo I2C poderá vir separado ou já soldado no display LCD
(datasheet)
|
Módulo RTC |
Módulo RTC DS3231 |
1 |
|
Módulo de alta precisão com comunicação I2C.
Tensão de operação: 3,3V - 5,0V
Chip de memória: AT24C32 de 32K bytes
Computa segundos, minutos, horas, dias da semana, dias do mês, meses e anos (de 2000 a 2099)
Consumo menor que 500nA no modo bateria
(datasheet)
|
Push Button |
Push button 6X6X5mm |
1 |
|
|
Buzzer |
Buzzer ativo 5V 12mm |
1 |
|
Utilize um buzzer, um disco piezoelétrico ou um mini autofalante |
Arduino UNO R3 |
Arduino UNO |
1 |
|
Você poderá utilizar uma placa Arduino UNO original ou similar
|
Montagem do Circuito
Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.
Atenção
1. Utilizamos neste projeto o módulo RTC DS3231 que permite um controle completo e preciso de tempo. Para conectar o módulo é necessário conhecer um pouco a estrutura do componente:
1.1. Observe na imagem acima que em uma extremidade do módulo existem 6 pinos de conexão, sendo:
1.1.1. O par de pinos 1 e 2 se refere à alimentação 3.3V ou 5V (Vcc e GND).
1.1.2. O par de pinos 2 e 3 deve ser utilizado para a comunicação I2C (SDA e SCL) que deverão estar conectados nos pinos analógicos A4 (SDA) e A5 (SCL) do Arduino Uno ou nos pinos A20 (SDA) e A21 (SCL) do Arduino Mega 2560.
1.1.2. Os pinos 5 e 6 não são utilizados neste projeto, sendo que o pino 5 (SQW) é usado para disparo de alarmes e o pino 6 (32K) para saída de onda do cristal e é raramente utilizado.
2. Neste projeto poderão ser utilizados display LCD 16x2 ou display LCD 20X4 que possuem controlador HD44780. Estes displays se adaptam aos mais diversos projetos com vários modelos de placas e microcontroladores. Podem ter luz de fundo (backlight) verde, azul ou vermelha e possuem 16 pinos para a conexão. No nosso exemplo vamos utilizar o display LCD 16x2 que possui 16 colunas por 2 linhas. Atenção: Utilize um display LCD com os pinos soldados.
3. Para a montagem do display com adaptador, entenda a estrutura do módulo I2C para display LCD 16x2 e display LCD 20X4:
3.1. Na lateral do adaptador encontramos 4 pinos, sendo: 2 pinos para alimentação (Vcc e GND) e 2 pinos para conexão com a interface I2C (SDA e SCL) que deverão estar conectados nos pinos analógicos A4 (SDA) e A5 (SCL) do Arduino Uno ou nos pinos A20 (SDA) e A21 (SCL) do Arduino Mega 2560. Veja a tabela abaixo com onde temos as principais placas Arduino e suas conexões com o I2C.
3.2. Para controlar o contraste do display, utilize o potenciômetro de ajuste de contraste. O jumper lateral, quando utilizado, permite que a luz do fundo (backlight) seja controlada pelo programa ou permaneça apagada.
3.3. A seleção de endereço do adaptador I2C para display LCD, na maioria dos módulos fornecidos no mercado já vêm configurados com o com o endereço 0x27.
Se você não sabe qual endereço que o seu módulo I2C e/ou módulo RTC DS3231 está configurado, baixe o seguinte "sketch":
DOWNLOAD - I2C_scanner.ino
3.3.1 Após instalar e rodar o sketch acima, abra o monitor serial que mostrará qual é o endereço que o seu módulo I2C e o módulo RTC DS3231 está configurado:
3.3.1.1 Nos casos em que módulo I2C estiver configurado com uma faixa de endereços diferente do endereço 0X27 altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto.
3.5. Para saber mais sobre a montagem e utilização de display LCD com módulo I2C leia: Projeto 48 - Como controlar um display LCD com o módulo I2C.
4. O buzzer tem polaridade. Portando, cuidado para não ligar o buzzer invertido. Se você retirar o adesivo superior do buzzzer poderá ver um sinal de positivo (+). Este sinal mostra onde está o pino positivo do componente que deverá estar conectado ao potenciômetro (neste projeto) ou a uma porta digital do Arduino e o polo negativo ao GND.
5. Monte o botão (push button) sem o resistor, pois através da programação vamos habilitar o resistor de pull up interno do Arduino. Desta forma, quando o botão estiver pressionado, o Arduino retornará "LOW" ou "0". Para saber mais sobre botões, assista o vídeo Arduino: Botão e Resistor de Pull Up Interno ou leia o artigo: Como usar push button com Arduino (programação).
6. Veja abaixo como realizamos a montagem do nosso projeto utilizando protoboards:
Incluindo biblioteca LiquidCrystal_I2C no IDE do Arduino
Para que o módulo I2C funcione corretamente é necessário adicionarmos a biblioteca LiquidCrystal_I2C no IDE do Arduino. Uma das grandes vantagens das placas Arduino é a diversidade de bibliotecas disponíveis que podem ser utilizadas em seus programas. Estas bibliotecas podem ser criadas para a linguagem "C" ou especificamente para o Arduino, reduzindo drasticamente o tempo gasto com programação.
Download dos arquivos da biblioteca LiquidCrystal_I2C
DOWNLOAD - NewliquidCrystal_1.3.4.zip
Para saber detalhes desta biblioteca clique aqui.
Instalando a biblioteca pelo IDE do Arduino
Após fazer o download do arquivo NewliquidCrystal_1.3.4.zip com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial:Como incluir uma biblioteca no IDE do Arduino.
Incluindo biblioteca DS3231 no IDE do Arduino
Para obtermos os valores de temperatura ambiente lidos no sensor de temperatura do RC DS3231 é necessário adicionarmos a biblioteca DS3231.h no IDE do Arduino. Para conhecer todos comandos da biblioteca veja Manual DS3231.h
DOWNLOAD - DS3231.zip
Para saber detalhes desta biblioteca clique aqui.
Instalando a biblioteca pelo IDE do Arduino
Após fazer o download do arquivo DS3231.zip com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino.
Para conhecer outras bibliotecas para módulos veja a Coletânea de bibliotecas para módulos.
Sketch do projeto
1. Faça o dowload e abra o arquivo projeto52.ino no IDE do Arduino: DOWNLOAD - projeto52.ino
Obs. 1: Nos casos em que módulo I2C estiver configurado com um endereço diferente do endereço 0X27, altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto.
Obs. 3: Se estiver utilizando um display de LCD 20 X 4, altere o comando da linha 36 para lcd.begin (20,4);
Obs. 4: Utilizamos a biblioteca DS3231 para o controle de tempo e temperatura do módulo RTC.
Obs. 5: Ao utilizar o RTC pela primeira vez é necessário ajustar a hora e data com os valores atuais: retire as barras duplas das linhas 37, 38 e 39 para executar a função que vai ajustar a data e hora atual. do seu módulo. Depois de rodar o programa e ajustar a hora e data, desligue o Arduino da fonte e altere novamente o sktech, inserindo as duas barras nestas linhas.
Obs. 6: Se você já utilizou o seu módulo RTC em qualquer outro projeto e já ajustou a hora e data, não precisará mais fazer isto até substituir a bateria que deve durar em torno de 5 anos.
Ou se preferir, copie e cole o código abaixo no IDE do Arduino:
/*******************************************************************************
*
* Projeto 52: Usando o Módulo RTC DS3231 com despertador para Arduino
* http://squids.com.br/arduino
*
*******************************************************************************/
#include <DS3231.h>
#include <LiquidCrystal_I2C.h>
DS3231 rtc(SDA, SCL);
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);
uint32_t timer = 0;
uint32_t timerBuzz = 0;
int control = 0;
int controlBuzz = 0;
int estado = 1;
Time t;
int buzPin = 5;
int buttonPin = 2;
int Hor;
int Min;
int Sec;
void setup() {
rtc.begin();
lcd.begin(16,2);
Serial.begin(9600);
pinMode(buzPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
//rtc.setDOW(TUESDAY); // Altere o dia da semana SUNDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY e SATURDAY
//rtc.setTime(18, 23, 0); // Altere o tempo (formato de 24horas)
//rtc.setDate(24, 1, 2019); // Dia, mês, Ano
}
void loop() {
// pega valores individuais de hora, nin e sec
t = rtc.getTime();
Hor = t.hour;
Min = t.min;
Sec = t.sec;
// inicia a exibição
lcd.setCursor(4,0);
//lcd.print("Real Time Clock ");
lcd.print(rtc.getTimeStr());
if( Hor == 17 && (Min == 49 || Min == 50)) { // Altere a hora e minuto para acionar o buzzer
estado = digitalRead(buttonPin);
Buzzer();
} else {
estado = 1;
controlBuzz = 0;
}
switch(control) {
case 0: {
lcd.setCursor(0,1);
lcd.print("Data: ");
lcd.print(rtc.getDateStr());
temporizador(1);
break;
}
case 1: {
lcd.setCursor(0,1);
lcd.print("Dia : ");
lcd.print(rtc.getDOWStr());
lcd.print(" ");
temporizador(2);
break;
}
case 2: {
lcd.setCursor(0,1);
lcd.print("Temp: ");
lcd.print(rtc.getTemp());
lcd.print(" C");
lcd.print(" ");
temporizador(3);
break;
}
case 3: {
lcd.setCursor(0,1);
lcd.print(" Squids Arduino");
temporizador(0);
break;
}
}
}
void Buzzer() {
if (estado == 0) { // se o botão foi pressionado
digitalWrite(buzPin,LOW);
controlBuzz = 2;
}
switch(controlBuzz) {
case 0:
digitalWrite(buzPin,HIGH);
if (millis() - timer >=500) {
controlBuzz = 1;
timer = millis(); // Atualiza a referência
}
break;
case 1:
digitalWrite(buzPin,LOW);
if (millis() - timer >=500) {
controlBuzz = 0;
timer = millis(); // Atualiza a referência
}
break;
case 2:
digitalWrite(buzPin,LOW);
break;
}
}
void temporizador(int x) {
if (millis() - timer >=3000) {
control = x;
timer = millis(); // Atualiza a referência
}
}
ATENÇÃO: Se o display acender e não mostrar os caracteres provavelmente é em função do contraste. Gire o eixo do potenciômetro de ajuste de contraste no sentido horário. Se mesmo assim o display não mostrar os caracteres, então corrija a montagem do circuito e/ou o código.
Vídeo
Como o projeto deve funcionar
1. Se você vai utilizar o módulo RTC pela primeira vez, altere os sketch do projeto para configurar a hora e data atual: Retire as barras duplas de comentário das linhas 37, 38 e 39 para executar a função que vai ajustar a data e hora do seu módulo.
1.1. Após ajustar o programa, você não precisará mais realizar esta operação. Somente altere os dados novamente no caso de precisar substituir a bateria do módulo, que deve durar aproximadamente 5 anos.
2. Ao iniciar o programa, você irá visualizar na primeira linha do display a hora, minutos e segundos e na segunda linha a data e a temperatura a cada 3 segundos.
2. Se você realizou o ajuste para configurar a hora e data atuais, desligue o Arduino da fonte e altere novamente o sktech, inserindo as duas barras nas linhas de comando 37, 38 e 39.
3. Pronto, agora rode o programa para visualizar a hora, data e temperatura ambiente. Se acabar a energia elétrica ou se você desligar o Arduino, a hora e data estarão sempre atualizadas graças a bateria que vem acoplada ao módulo RTC.
4. Para setar o alarme, abra o editor IDE do Arduino e altere a hora em [ Hor == XX ] e (Min == YY || Min == YY + 1). Desta forma, o alarme tocará por 2 minutos se você não apertar o botão para desligá-lo.
Obs.: Se desejar que o alarme toque apenas por um minuto, repita o valor nos dois elementos, como no exemplo a seguir: (Min == 49 || Min == 49)
5. Quando o alarme é acionado, basta clicar no botão (push button) para interrompê-lo, ou aguarde o tempo de 1 ou 2 minutos, dependendo do valor que foi definido no IDE. O alarme se repetirá sempre neste mesmo horário até que você altere novamente o programa no IDE do Arduino.
Desafios
Com base neste projeto, resolva o seguinte desafio: Desafio 38
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários