Em diversos dispositivos como computador, microondas, televisão e entre outros, utiliza-se a data e a hora para realização de alguns eventos. Logo, por meio dessas variáveis, é possível acionar e desligar cargas, monitorar variáveis dentro de um intervalo de tempo e realizar diversas outras atividades. O post de hoje é “Relógio Arduino: Construa o Seu”.
Assim, para a realização dessas atividades, necessitamos implementar uma função temporizadora ou utilizar um chip que funcione como um relógio. Portanto, para solucionar essa necessidade, é possível utilizar um CHIP Relógio de Tempo Real (Real Time Clock – RTC) e construir um relógio digital. Desse modo, poderemos aplicá-lo em qualquer dispositivo que necessite contar data e hora.
Trata-se de um relógio digital utilizando o chip RTC DS1307, para contar hora e data e apresentar as informações no display LCD 16×2. Além disso, o teclado matricial será utilizado para configurar data e hora e o controle será desenvolvido por meio do Arduino. O relógio desenvolvido é apresentado na Figura 1.
Para o desenvolvimento do Relógio Digital, utilizaremos diversos periféricos conectados ao Arduino, conforme apresentados no esquema eletrônico da Figura 2.
- Compreender o funcionamento do relógio de tempo real;
- Implementar uma função para ajuste de data e hora do relógio de tempo real;
- Implementar funcionalidade para exigir que o usuário configure a data e hora na primeira vez que o dispositivo é ligado.
A seguir, juntamente com o circuito eletrônico, disponibilizamos a lista completa dos componentes eletrônicos utilizados nesse projeto.
Materiais para o Projeto Relógio Arduino
Todos os materiais apresentados a seguir estão disponíveis em nosso site. Em caso de dúvidas, clique em Saiba mais e verifique os dados técnicos de cada componente utilizado.
- 01 x Relógio de Tempo Real DS1307
- 01 x Teclado Matricial 4 x 4
- 01 x Display LCD 16 x 2
- 01 x Arduino UNO R3
- 01 x Protoboard 830 furos
- 01 x Jumpers Rígidos
- 01 x Jumpers Flexíveis
- 04 x Resistor 10kR
- 01 x Potenciômetro 10kR
Lógica Principal do Relógio Digital Arduino
- Ser obrigatório ajustar data e hora na primeira vez que o relógio é inicializado;
- Capacidade de ajuste de data e hora;
- Apresentação em tempo real da data e hora na tela do display LCD 16 x 2.
De acordo com os pontos acima, temos a seguinte solução apresentada no código abaixo.
Primeiramente, foram realizadas todas as inclusões de bibliotecas, definição de objeto LCD e declaração de variáveis. Agora, observe a definição do valor 120 como MEMORIA. Esse valor será utilizado para manipulação de infomação na memória EEPROM. Esse processo de manipulação será apresentado durante a explicação da lógica na função loop.
Em seguida, declaramos o protótipo de duas funções: LerTeclado(void) e AjustarHora(void). Em suma, essas duas funções serão utilizadas para rastrear a tecla digitada e ajustar a data e hora, respectivamente.
Logo após, realizamos as configurações na função void setup(). Primeiramente, inicializamos o nosso Relógio de Tempo Real e, em seguida, configuramos os pinos de conexão do Teclado Matricial.
Ajuste Obrigatório na Primeira Inicialização do Relógio
Por fim, entramos na função loop e realizamos o primeiro teste de inicialização. De acordo com a condição, verifica-se a posição 120 (MEMORIA) da memória EEPROM, a fim de saber se seu valor é igual a 73.
Se o valor for diferente, significa que é a primeira vez que o usuário liga o sistema. Logo, a função AjustarHora será chamada, para que o usário possa configurar data e hora, conforme apresentado na Figura 3.
Desse modo, antes de gravar o código do projeto, execute o código para zerar todas as posições da memória EEPROM. Portanto, por meio dessa limpeza, ele irá entrar automaticamente na função, quando o usuário ligar o relógio pela primeira vez.
Portanto, após a apresentação desta tela, o usuário é obrigado a ajustar hora, a data e o dia da semana. Por fim, após esse processo, o sistema escreve o valor 73 na posição 120 (MEMORIA). Desse modo, o sistema saberá que os parâmetros de tempo foram configurados na inicialização.
Em seguida, o sistema realiza a leitura dos dados de tempo do Relógio de Tempo Real e salva no vetor DataTime.
Este vetor possui um total de 7 posições. Portanto, podemos armazenar o Ano, Mês, Data, Dia da Semana, Horas, Minutos e Segundos, respectivamente, da posição 0 à posição 6.
Logo, os valores são impressos nas strings tempo e data e, em seguida, são apresentados no LCD a cada 1 segundo.
Por fim, realiza-se a leitura do teclado, a fim de verificar se o usuário pressionou a letra A. Caso a letra A esteja pressionada, o sistema chamará a função AjustarHora(). Desta forma, permitirá o usuário ajustar a data e hora em qualquer momento.
Agora, será apresentada toda a estrutura interna da função AjustarHora() e sua comunicação com o relógio de tempo real.
Função de Ajuste de Hora e Data do Relógio de Tempo Real
A função de ajuste de hora e data é a parte principal do projeto. Logo, por meio dela, o sistema realiza o processo de leitura dos dados do usuário e a comunicação com o relógio de tempo real. Portanto, nossa função é dividida em 3 partes:
- Ajuste da Hora;
- Ajuste da Data;
- Ajuste do Dia da Semana.
Primeiramente, foram declaradas todas as variáveis utilizadas na função. Cada variável será apresentada ao longo da explicação da função.
Após isto, o próximo passo foi realizar a aquisição dos dados do CHIP. Portanto, esses dados serão armazenados no vetor DadosTempo de 7 posições e serão impressos nas strings tempo e data. Por meio dessas strings, os dados serão apresentados no LCD (Linha 018 a 021).
Nas linhas 023 a 030 os dados do vetor DadosTempo serão copiados para o vetor auxiliar Times. Através deste vetor, será possível manipular os dados lidos. Por fim, o sistema separa os dados de horas e minutos em dezenas e unidades. Dessa forma, cada dígito poderá ser manipulado na etapa de configuração das horas.
Portanto, o sistema entrará no loop do while(), apresentará a mensagem “Ajustar Horas” (Linha 040 a 043). Em seguida, apresentará a hora instantânea no LCD, conforme apresentado na Figura 4.
A seguir, você aprenderá o processo de leitura do teclado matricial.
Processo de Leitura do Teclado Matricial 4 x 4
Após a apresentação da mensagem, o fluxo entrará no laço do while() e iniciará o processo de leitura do teclado.
A leitura é realizada por meio da função LerTeclado(). Esta função é responsável por realizar a varredura do teclado matricial e retornar um valor para cada tecla digitada. Caso nenhuma tecla esteja pressionada, a função retorna o valor 16.
Na Tabela a seguir, é apresentado o valor retornado por cada tecla utilizada.
Caso queira compreender o processo de uso e implementação da função, acesse o Artigo de Teclado Matricial de Membrana 4 x 4.
Logo, após a leitura e atribuição do valor à variável number, o sistema verifica a condição da linha 057. Por meio desta condição, avalia-se 3 pontos:
- Verifica se o valor retornado é um número entre 0 e 9;
- Verifica se a variável controle é igual a 1. Esta variável é utilizada para controlar o acesso do fluxo de código internamente à condição. Ela permite que o fluxo entre apenas uma vez, quando o usuário pressiona um número.
- Verifica se o valor de cont é igual a 4. Essa variável é utilizada para controlar a quantidade de dígitos inseridos pelo usuário. Pois são 2 dígitos para horas e 2 dígitos para minutos. Desse modo, evita-se que o usuário digite mais do que 4 valores.
Portanto, caso a condição seja verdadeira, o valor digitado será armazenado no vetor digitos. Dessa maneira, observa-se que a variável cont aponta sempre para as posições do vetor. Logo, após o incremento da variável cont, atribui-se 1 à variável controle.
Já que a variável controle possui valor igual a 1, o fluxo de código não entrará na condição. Desse modo, o sistema irá ler o número pressionado uma única vez.
Opção para reiniciar o processo de entrada de novos números no sistema
Em seguida, há uma condição na Linha 074. Esta condição é utilizada para verificar quando nenhuma tecla está sendo pressionada pelo usuário.
Portanto, será atribuído valor 0 à variável controle, para indicar que o sistema poderá entrar na condição novamente. Ou seja, o sistema está habilitado a receber um novo valor numérico na condição de leitura de números.
Em seguida, temos a condição para limpar os valores de hora digitados pelo usuário, caso o usuário pressione a tecla C. Isto serve para casos em que o usuário digitou algum valor errado ou deseja limpar a tela. O resultado é apresentado na Figura 5. Analisando a condição, é possível ver que o vetor digitos e a tela terão seus valores zerados.
Finamente, há a condição de verificação do laço do while, para verificar se o usuário pressionou a tecla D (Valor 13). Caso a tecla D esteja pressionada, o fluxo sairá do laço, formará os valores de hora e minuto. Em seguida, armazenará os valores nas posições 4 e 5 do vetor times, respectivamente.
Validação da Hora e Minuto inseridos pelo Usuário
Após a formação dos dígitos inseridos em hora e minutos, é importante validar os valores digitados. Isto evita que o usuário insira um valor errado no sistema, conforme apresentado na Figura 6.
Após o usuário inserir uma hora válida ou inválida, o sistema irá validar a hora e minuto inseridos. Caso a hora seja inválida, o sistema apresenta a mensagem Hora Inválida, conforme apresentado na Figura 7.
Em seguida, atribuirá o valor 1 à variável Validate. Esta variável é utilizada para sinalizar que a hora digitada foi inválida. Portanto, o sistema irá zerar as 4 posições iniciais do vetor dígitos e voltará para o início. Desse modo, o usuário será obrigado a digitar valores válidos para hora e minuto.
Configuração da Data do Sistema
O processo de configuração da data é semelhante à configuração da hora. A única diferença é que o usuário precisará digitar 6 dígitos: dias, mês e ano.
Agora, observe a Figura 8, onde será apresentada a data atual e permitirá o usuário inserir novos valores de ajuste.
Caso for necessário, o usuário poderá pressionar a tecla C e zerar os valores da data, conforme apresentado na Figura 9.
Por fim, após digitar a nova data do sistema, será feita uma validação. Caso seja inválida, o sistema apresentará a seguinte mensagem conforme apresentada na Figura 10.
Portanto, o usuário é forçado a digitar uma nova data válida. Após inserir uma data válida, o sistema sairá do loop do while e iniciará a etapa de configuração do dia da semana.
Configurando o dia da semana do Relógio Arduino
Os dias da semana são configurados utilizando as teclas A e B. A tecla A é utilizada para avançar de domingo a sábado e a B é utilizada para retornar no sentido contrário. A seguir, temos a porção de código que é utilizada para configurar o dia da semana.
A variável ContDias será incrementada ou decrementada com base nas teclas A e B. Seu valor será utilizado para apontar para as posições do vetor DiaSemana. Portanto, os valores aparecerão na tela e o usuário poderá selecionar o dia correto da semana.
A seguir temos a tela de configuração do dia da semana apresentada na Figura 11.
Conclusão
Por meio desse relógio arduino foram implementadas diversas funções, que permitem aprender e implementar recursos inteligentes. Entre esses recursos, destacamos: sistema de validação de horas, de data e sistema de ajuste de hora e data em tempo real de execução.
Além desses recursos, é possível extender a aplicação do relógio arduino para sistemas de automação. Entre esses sistemas que utilizam data e hora, temos: irrigador automático, alerta de uso para fogão, alarme escolar e muitos outros.
O Código desenvolvido encontra-se nesse link e você pode usá-lo para criar novos projetos.
Conheça toda Linha de Produtos Arduino no Site da UsinaInfo.
ual que sketch grande pra um relogim em! rsrs gostaria de saber se teria como fazer isso com o ds1302 e usar apenas 2 botoes um para mode e o outro para set, desde já agradeço pelo post
Oi, Davidson! Sim, ficou bem extenso. Esse sketch ficou grande, pois implementei várias funcionalidades nesse relógio.
Sobre sua dúvida… Sim. Você pode utilizar o DS1302, porém, você precisa ajustar a sua biblioteca e as funções para esse chip.
Quanto ao uso de botões, eu acredito que possa ser possível, sim, utilizar dois botões. Porém, você precisa trabalhar bem a lógica de programação.
Mas toma cuidado para não ocorrer conflito quanto ao uso de botões. Se eu fosse você, utilizaria 3 botões.
Um para modo – Ele servirá para entrar no modo de ajuste de data e hora;
Um para ajuste – Ele irá configurar os valores de data e hora;
Um para Enter – Com esse botão, você apertará para finalizar e salvar os dados de data e hora no seu RTC.
Espero que eu tenha te ajudado.
Abraço.
eu quero entender esse comando
Bom minha dúvida e esse ele e uma shild específica ou essa memória e interna no próprio controlador ,pois não vi na lista falando nada sobre EEPROM
Bom Dia Manoel! A EEPROM citada já está inclusa no módulo do RTC, para o desenvolvimento deste projeto são necessários apenas os produtos citados na lista.
Olá Sr. Diego Moreira, estou tentando montar o teu projeto “Desenvolvimento do Relógio Arduino”
De onde posso baixar a biblioteca DS1307.h
Eu baixei do endereço: http://www.rinkydinkelectronics.com/library.php?id=34
Todavia, parece que não tem acesso, pois, ao compilar, apresenta a msg.:
“error: expected unqualified-id before ‘.’ token” para:
DS1307.getDate(DataTime);
ou para
DS1307.begin();
Não consegue buscar essas rotinas dentro da biblioteca.
Tudo de bom!
Maximo dos Santos