Projeto 49 - Relógio Digital Arduino com módulo I2C para display LCD

Básico - Projeto 49

Relógio Digital com display LCD + I2C

Objetivo

Neste projeto vamos criar um relógio digital Arduino utilizando apenas um display LCD, um módulo I2C e 2 botões para controle de minutos e horas. Para reduzir o consumo de energia, o backlight do display se apaga após 60 segundos em operação. Para acender o backlight novamente, basta pressionar um dos botões de controle.

Observações:

1) Este projeto possui uma precisão bastante razoável. Entretanto, para obter uma precisão de um relógio digital real, é necessário a utilização do módulo RTC (Real Time Clock).

2) Este projeto foi desenvolvido para um display LCD com controlador HD44780 em conjunto com o módulo serial I2C, que poderá ser separado ou soldado diretamente no display.

3) Se você não tiver um módulo I2C, poderá adequar 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).

Aplicação

Para fins didáticos e projetos com display de cristal líquido.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

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

Módulo I2C com CI PCF8574

1 Módulo I2C display LCD Arduino

O módulo I2C poderá vir separado ou já soldado no display LCD

(datasheet)

 Push Button  Push button 6X6X5mm 2  
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.

Módulo I2C separado do display


Atenção

1. 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. com 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.

2. Para a montagem, entenda a estrutura do adaptador I2C para display LCD 16x2 e display LCD 20X4:

Módulo I2C - Detalhes

2.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.

2.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.

 

2.3. A seleção de endereço I2C, 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 está configurado, com o display LCD e o módulo conectado no Arduino, baixe o seguinte "sketch":

DOWNLOAD - I2C_scanner.ino

2.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 está configurado:

 

2.5. 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.

2.6. Para saber mais sobro 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.

3. Monte o botão (push button) sem o resistor, pois através da programação vamos habilitar o resistor 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 os artigos: Projeto 04a - Push Button como interruptor - liga e desliga (padrão para pull-down ou pull-up) e Como usar push button com Arduino (programação).

4. Veja abaixo como realizamos a montagem do nosso projeto utilizando um protoboard:

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. Veja a tabela Coletânea de bibliotecas para módulos.

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.

Sketch do projeto

1. Faça o dowload e abra o arquivo projeto49.ino no IDE do Arduino:  DOWNLOAD - projeto49.ino

Ou se preferir, copie e cole o código abaixo no IDE do Arduino:

Obs. 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.

Obs. 2: Se estiver utilizando um display de LCD 20 X 4, altere o comando da linha 36 para lcd.begin (20,4);

Obs. 3: Se desejar, altere o tempo para desligar o backlight, que no projeto está configurado para 60 segundos. Para isso altere o valor da variável setLight_ini (linha 30).

/*******************************************************************************
*
*          Projeto 49: Relógio Digital com Arduino
*               http://squids.com.br/arduino
*
*******************************************************************************/
#include <LiquidCrystal_I2C.h>

// Inicializa o display no endereco 0x27 com MÓDULO I2C
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);

// inicializa Time display em 12:59:45 PM (altere se desejar)
int h=12;
int m=59;
int s=45;
int flag=1; //PM

// Botões de ajuste de hora e minutos
int button1;
int button2;

// Definição dos botões de ajuste
int hs=0;// pin 0 para Horas (for Hours Setting)
int ms=1;// pin 1 para Minutos (for Minutes Setting)

// Para maior precisão, utilize Arduino Real Time Clock e não apenas delay()
static uint32_t tempo_corrido, now = 0; // Real Timae Control

//Definições para o backlight
int setLight_ini = 60; 
int setLight = setLight_ini;
int backlight = 1;

void setup()
{
  pinMode(hs,INPUT_PULLUP); // botão 1 (hora)
  pinMode(ms,INPUT_PULLUP);// botão 2 (minutos)
  now=millis(); // lê hora atual
  lcd.begin(16,2);
  lcd.setBacklight(HIGH);
}

void loop(){ 
// Mostra TIME em horas, minuto e segundo + AM/PM
 lcd.setCursor(0,0);
 lcd.print("Time ");
 if(h<10)lcd.print("0");// sempre 2 dígitos
 lcd.print(h);
 lcd.print(":");
 if(m<10)lcd.print("0");
 lcd.print(m);
 lcd.print(":");
 if(s<10)lcd.print("0");
 lcd.print(s);

 if(flag==0) lcd.print(" AM");
 if(flag==1) lcd.print(" PM");
 
 lcd.setCursor(1,1);// linha 2
 lcd.print("Digital Clock");

for (int i=0;i<5;i++) {
  while (now - tempo_corrido < 200) {
    now = millis();
  }

  tempo_corrido = now;

  //le botões se estão acionados ou não
  button1=digitalRead(hs);// lê botões se estão acionados
  button2=digitalRead(ms);

// ajusta hora e minutos
if ((!button1 && backlight == 1) || (!button2 && backlight == 1)) {
    setLight = setLight_ini;
    setTimer();
  }
  
// acende o backlight
  if ((!button1 && backlight == 0) || (!button2 && backlight == 0)) {
    lcd.setBacklight(HIGH);
    setLight = setLight_ini;
    backlight = 1;  
  }

 } // fim do for

  bakclight(); 
  //soma segundos
  s=s+1; 
  makeTimer();
  
} // fim do loop


void setTimer() {
  
if(!button1){
   h=h+1;
   makeTimer();
   displaySetTimer();
  }

 if(!button2){
  s=0;
  m=m+1;
  makeTimer();
  displaySetTimer();
  }
}

void makeTimer() {
  // ---- cria segundos, minutos, hora e flag ----
 if(s==60){
  s=0;
  m=m+1;
 }
 if(m==60)
 {
  m=0;
  h=h+1;
 }
 if(h==13)
 {
  h=1;
  flag=flag+1;
  if(flag==2)flag=0;
 } 
}

void displaySetTimer() {
// Mostra TIME em horas, minuto e segundo + AM/PM
 lcd.setCursor(0,0);
 lcd.print("Time ");
 if(h<10)lcd.print("0");// sempre 2 dígitos
 lcd.print(h);
 lcd.print(":");
 if(m<10)lcd.print("0");
 lcd.print(m);
 lcd.print(":");
 if(s<10)lcd.print("0");
 lcd.print(s);

 if(flag==0) lcd.print(" AM");
 if(flag==1) lcd.print(" PM");
 
 lcd.setCursor(1,1);// linha 2
 lcd.print("Digital Clock");
}

void bakclight() {
  setLight--;
  if (setLight == 0) {
    lcd.setBacklight(LOW);
    backlight = 0;
  }
} 

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. Ao iniciar o programa, você irá visualizar no display a hora, minutos e segundos (12: 59: 45 PM) definidos no início do sketch (você poderá alterar estes valores se desejar).

2. Clicando nos botões de controle, ajuste a hora e/ou minutos de acordo com o horário atual. O botão direito irá incrementar os minutos e o esquerdo as horas.

3. Lembre-se AM é o período com início à meia-noite (00:00) e término às 11:59; PM é o período com início ao meio-dia (12:00) e término às 23:59.

4. Depois de ajustado o nosso relógio, você irá obter a hora atual com uma precisão bastante razoável.

5. Após 60 segundos em operação, o a luz de fundo do display (bakclight) irá se apagar automaticamente. Clique em qualquer um dos botões de controle para acende a luz do backlight, que se apagará novamente após 60s.

Desafios

Com base neste projeto, resolva o seguinte desafio:  Desafio 35

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores