Relógio Arduíno com LCD i2C

Fala ai pessoal, este post é uma continuação do post “Relógio com Arduíno e Modulo RTC
Vamos aprender a fazer um relógio funcional onde será exibido hora e data num visor LCD ligado a um modulo serial i2C.
Se você quiser mais informações sobre o módulo RTC acesse o post anterior, aqui vamos focar num projeto onde as informações serão exibidas no visor LCD.

 

 

 

 

PARA TUTORIAIS EM VÍDEO, INSCREVE-SE NO CANAL DO YOUTUBE, BASTA CLICAR NO BOTÃO ABAIXO:

inscreva-se

Agora sem enrolação vamos começar nosso tutorial:

Primeiramente se você não sabe ou nunca ouviu falar sobre o que é um modulo serial i2C acesse o vídeo do canal logo abaixo que explica e ensina sobre ele:

Tenha em mãos, uma placa Arduíno;

Um visor LCD 16 colunas por duas linhas (16×2);

Um modulo serial que será acoplado ao visor;

Fios conforme sua necessidade;

O projeto será montado em uma protoboard e o esquema de ligação segue conforme a imagem abaixo:

Esquema de ligação Arduíno RTC LCD i2C

Depois de montar conforme o esquema vamos a programação, copie e cole abaixo o código abaixo para a IDE do seu Arduíno e logo em seguida faça o upload do programa:

#include "Wire.h"
#include <LiquidCrystal_I2C.h> //Biblioteca do visor LCD i2C

#define DS1307_ADDRESS 0x68 // Modulo RTC no endereco 0x68

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); // Modulo I2C display no endereco 0x27
byte zero = 0x00; 

void setup(){
 Wire.begin(); 
 lcd.backlight(); //Inicia o visor LCD com a luz ligada
 lcd.begin (16,2); 
 Serial.begin(9600); //Inicia a porta serial
 
 //A linha de comando abaixo serve para que você possa confirar a hora e data do seu modulo RTC
 // SelecionaDataeHora(); 
}

void loop()
{
 // Le os valores (data e hora) do modulo DS1307
 Wire.beginTransmission(DS1307_ADDRESS);
 Wire.write(zero);
 Wire.endTransmission();
 Wire.requestFrom(DS1307_ADDRESS, 7);
 int segundos = ConverteparaDecimal(Wire.read());
 int minutos = ConverteparaDecimal(Wire.read());
 int horas = ConverteparaDecimal(Wire.read() & 0b111111);
 int diadasemana = ConverteparaDecimal(Wire.read()); 
 int diadomes = ConverteparaDecimal(Wire.read());
 int mes = ConverteparaDecimal(Wire.read());
 int ano = ConverteparaDecimal(Wire.read());

 // Mostra os dados no display
 lcd.setCursor(0,0);
 lcd.print(" ");
 // Acrescenta o 0 (zero) se a hora for menor do que 10
 if (horas <10)
 lcd.print("0");
 lcd.print(horas);
 lcd.print(":");
 // Acrescenta o 0 (zero) se minutos for menor do que 10
 if (minutos < 10)
 lcd.print("0");
 lcd.print(minutos);
 lcd.print(":");
 // Acrescenta o 0 (zero) se minutos for menor do que 10
 if (segundos < 10)
 lcd.print("0");
 lcd.print(segundos);
 lcd.setCursor(2,1);
 // Mostra o dia da semana
 switch(diadasemana)
 {
 case 0:lcd.print("Dom");
 break;
 case 1:lcd.print("Seg");
 break;
 case 2:lcd.print("Ter");
 break;
 case 3:lcd.print("Qua");
 break;
 case 4:lcd.print("Qui");
 break;
 case 5:lcd.print("Sex");
 break;
 case 6:lcd.print("Sab");
 }
 lcd.setCursor(6,1);
 // Acrescenta o 0 (zero) se dia do mes for menor do que 10
 if (diadomes < 10)
 lcd.print("0");
 lcd.print(diadomes);
 lcd.print("/");
 // Acrescenta o 0 (zero) se mes for menor do que 10
 if (mes < 10)
 lcd.print("0");
 lcd.print(mes);
 lcd.print("/");
 lcd.print(ano);
}

void SelecionaDataeHora() //Seta a data e a hora do DS1307
{
 byte segundos = 10; // Valores de 0 a 59
 byte minutos = 05; //Valores de 0 a 59
 byte horas = 22; //Valores de 0 a 23
 byte diadasemana = 2; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
 byte diadomes = 25; //Valores de 1 a 31
 byte mes = 10; //Valores de 1 a 12
 byte ano = 16; //Valores de 0 a 99
 Wire.beginTransmission(DS1307_ADDRESS);
 Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

 //As linhas abaixo escrevem no CI os valores de 
 //data e hora que foram colocados nas variaveis acima
 Wire.write(ConverteParaBCD(segundos));
 Wire.write(ConverteParaBCD(minutos));
 Wire.write(ConverteParaBCD(horas));
 Wire.write(ConverteParaBCD(diadasemana));
 Wire.write(ConverteParaBCD(diadomes));
 Wire.write(ConverteParaBCD(mes));
 Wire.write(ConverteParaBCD(ano));
 Wire.write(zero);
 Wire.endTransmission(); 
}

byte ConverteParaBCD(byte val)
{ 
 //Converte o número de decimal para BCD
 return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val) 
{ 
 //Converte de BCD para decimal
 return ( (val/16*10) + (val%16) );
}

Importante !!

Observe que a linha 18 do código esta comentada e para que você possa atualizar a data e hora do RTC você precisa ativar esta linha de comando e alterar conforme sua data e horário atuais nas linhas 87 a 93, depois de atualizar a data e hora desative a linha de comando 18 e faça novamente o upload do programa pois se não fizer isso toda vez que resetar o Arduíno a data e hora vão ser aquelas que você configurou da primeira vez !!!

Para fazer o download dos códigos, bibliotecas e esquemas usados nesse tutorial clique no botão abaixo:
nk-logo-2
Se tudo correr bem seu projeto ficará que nem na imagem abaixo:

Projeto terminado NK relógio arduino

Assista o vídeo tutorial no canal NerdKing e aproveite para se inscrever no canal:

Um comentário em “Relógio Arduíno com LCD i2C

  • junho 11, 2017 em 12:33 am
    Permalink

    It2;1&87#s so tempting to leave cold Toronto and go down to enjoy all that Florida has to offer including the Disney World and Disney food. Lingering memories from my childhood …. It’s a little too late to plan the big trip now… maybe next year. On the other side, it’s really beautiful here in Canada with that typical winter scenery and white Christmas.

    Resposta

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *