Arduino - Relógio Digital

Neste artigo demonstro como fazer um relógio Digital com o Arduíno e um módulo LCD 1602 para exibir o horário.

Cristal base de tempo

Importante: Cuidado com os 'módulos similares' do Arduino. Uma vez peguei num lote que comprei os Arduinos com o cristal de 12MHZ. Como todas as bibliotecas do Arduino foram feitas para o Arduino trabalhando com um cristal de 16 MHZ sua base de tempo estará comprometida. Como a contagem de tempo é feita por hardware é complicado tentar fazer o concerto no software.

Como disse acima, a frequência oficial do Arduíno é 16MHZ e a frequência é dividida até gerar a base de tempo do Arduino - Timer 0 e função millis. Timer 0 é o timer com maior prioridade do controlador Arduino e isso é bom porque tem a máxima prioridade de execução e ninguém pode interromper o código de tratamento dessa interrupção dando prioridade máxima a contagem de tempo.

A função millis conta há quantos milisegundos o arduino esta funcionando, desde que foi ligado e é incrementado pela frequência do cristal dividida por circuitos internos ao chip. Isto dá uma boa precisão para o relógio porque o estouro do contador divisor de frequência do cristal gera uma interrupção que faz o processador processar imediatamente essa solicitação ( interrupção ) não importando o quanto ele esteja ocupado processando outra coisa, ou seja, ele para o que está fazendo para processar a rotina de tratamento da interrupção.

Dependendo da qualidade do fabricante do Arduino, com um cristal de 16MHZ o Arduíno dá um erro menor que 2 segundos por dia. E esse erro ocorre basicamente porque os bons cristais são 'calibrados' ( espessura ) a laser e por isso custam mais caro e a variação de temperatura também afeta a frequência do cristal.
Apesar da precisão ser boa no passar de semana ou mês a coisa pode pegar...para isso existe o RTC ( Real time clock - módulo de relógio ).

Dados deste projeto

Faremos um relógio de 24 horas inicialmente e usando o 1602 o relógio fica muito bonito.

Este projeto pode ser café com leite para muitos mas é por baixo que se começa...muita gente tem dúvidas sobre programação e tem muita dificuldade em elaborar um projeto relativamente simples como este.

Sendo assim, este exemplo mostra como fazer um relógio digital baseando-se no contador Timer0 utilizado pela função millis como referencia de tempo.

Primeiramente - Módulo LCD 1602.

Como disse acima o relógio vai ficar bonito se o seu módulo de LCD for bonito.
Este módulo de LCD 1602 é o mais simples, chamamos de paralelo porque ele usa 4 bits para se comunicar com o Arduíno...o serial usa uns 3 pinos apenas e quando o projeto é complexo economizar pinos do Arduino é fundamental e por isso o serial leva vantagem ao paralelo.

Circuito :

É o mesmo do projeto 09-LCD 1602


Cuidados

O display de LCD parece robusto mas é delicado...é um waffer de 2 vidros finos com um líquido no meio que fica visível quando recebe um sinal elétrico. Trate ele com carinho especialmente na fase de montagem porque ele quebra fácil, risca fácil.

Detalhes da conexão do módulo LCD 1602 com o Arduíno

/*
Projeto 11 : Relógio Digital com display LED 1602

Conexão do Arduino e o modo de LCD
    LCD        Arduino
    RS            D7
    Enable        D6
    D4            D5
    D5             D4
    D6            D3
    D7            D2
    R/W         GND-Terra
    VSS        GND-Terra
    VCC        Fonte +5V - Pode ser a do arduino
    
Nota : No pino 3 do LCD(VO) temos um trimpot de 10K
    Uma extremidade ligada a terra
    Outra extremidade ligada a 5V(VCC)
    O pino central ligado ao Pino 3 do LCD - VO
  
*/

Programa :

Pode copiar da linha abaixo em diante e colar que funciona...testei.


#include <LiquidCrystal.h>    //biblioteca do display de LCD    

int segs = 0;                //segundos do horario corrente
int mins = 0;                //minutos do horario corrente
int hrs = 0;                    // horas do horario corrente
unsigned long ini;     // horario inicial
unsigned long atual; // horario atual

 LiquidCrystal lcd(7, 6, 5, 4, 3, 2);    // RS, E, D4,D5,D6,D7

void setup() {
    lcd.begin(16, 2);                                //setando o modo que o LCD opera -16 linhas, 2 colunas

    lcd.clear();

//setando o horario inicial
    hrs = 8;
    mins = 30;
    segs = 00;
}

void loop() {
  //computando o tempo
  atual = millis();
  if (( atual - ini) > 1000){
    ini = ini +1000;
  
    segs +=1;
    if (segs > 59){
      mins +=1;
      segs = 0;
    }
    if (mins > 59){
      hrs += 1;
      mins = 0;
    }
    if (hrs > 23){
      hrs = 0;
    }
  }

  //exibindo o tempo
    lcd.setCursor(0, 0); //col,lin
    if(hrs < 10){
      lcd.print ("0");
    }
    lcd.print (hrs);
    lcd.print (":");

    if(mins < 10){
      lcd.print ("0");
    }
    lcd.print (mins);
    lcd.print (":");

    if(segs < 10){
      lcd.print ("0");
    }
    lcd.print (segs);

    //sem pressa : O Timer0 do Arduino cuida do tempo
    delay(100);
}


Funcionamento :

No programa temos 3 variáveis que armazenam o horário corrente : hrs, mins e segs ( horas, minutos e segundos).

Elas são setadas para um horário default inicialmente : 08:30:00 ( veja comentário //setando o horario inicial) , mas você pode alterar o programa para começar a contar num horário futuro e quando chegar lá você bota este projeto para funcionar.

Temos uma variável chamada atual que quando ligamos o arduino é carregada com o valor da função millis e ela armazenará a contagem de tempo em milisegundos ( milisegundos = segundo / 1000 ).

Contagem de segundos

A contagem será feita subtraindo o valor da função millis da variável atual.
Ou seja, o programa conta o tempo transcorrido subtraindo de millis da variável atual e quando dá mais de 1000 ele soma 1 na variável segundos e coloca o valor da variável atual com o valor da função millis.

Quando a diferença da contagem do millis e da variável atual for maior ou igual a 1000 milisegundos entre as duas variáveis significa que passou 1 segundo e o programa soma 1 em segundos.

É somado 1000 a variável atual para indicar que estamos um segundo depois do que era antes.

É feita a verificação se segundo são maiores que 59 e se for zera os segundos e soma um em minutos.

É feita uma verificação se minutos é maior que 59 e se for zeramos os minutos e somamos um a variável horas.

É feita uma verificação em horas e se for maior que 23 zeramos as horas. Note que para mudar o relógio de 24 horas para 12 horas basta alterar esta comparação mas sugiro que coloque uma indicação de antes do meio dia e depois do meio dia.

Se você entendeu a explicação acima adicione a função de despertador ao relógio. Para isto basta criar as variáveis com o horário a despertar e quando chegar o horário fazer uma saída do arduino acender um led ou disparar uma campainha ou buzzer.

Projeto Futuro

Na sequencia desse projeto mostrarei como ajustar o horário.