Relógio com o Módulo TM1637 e Arduino
Nesse artigo, você aprenderá a criar um relógio com o Módulo TM1637 com Arduino e o módulo RTC DS1307. O relógio é um dos dispositivos mais utilizados em muitos equipamentos em nossa volta e seu principal objetivo é contar o tempo.
Assim, somos capazes de calcular outros parâmetros importantes em nosso dia a dia, como: velocidade média, alarmes e entre outros e outros dados importantes em nossa rotina.
Agora, iniciaremos a discussão e apresentamos o processo construtivo do relógio – Baixe o Projeto.
Desenvolvimento do Relógio com o Módulo TM1637 com Arduino
O projeto consiste em utilizar dois botões a fim de ajustar a hora e o minuto. Após a configuração, as informações serão enviadas para o RTC DS1307 e serão apresentadas, posteriormente, no display TM1637.
A seguir, apresentamos o circuito do projeto na Figura 1.
Desse modo, para o desenvolvimento desse projeto necessitaremos da seguinte lista de componentes eletrônicos:
Lista de Componentes Eletrônicos
01 x Arduino Nano
01 x Relógio de Tempo Real DS1307
01 x Módulo TM1637
02 x Botões de Toque 6x6x5 mm
02 x Resistores de 10k
01 x Jumpers
Portanto, por meio desse circuito implementamos a lógica para realizar o controle e o apresentaremos a seguir.
Desenvolvimento da Lógica de Controle
Primeiramente, apresentamos a programação completa do relógio e, a seguir, iniciaremos a discussão passo a passo do projeto.
<code>#include <TM1637Display.h> #include <DS1307.h> TM1637Display display(2,3); bool BotaoHora = 0, BotaoMinuto = 0; bool EstadoBotaoHoraAnt = 0, EstadoBotaoMinutoAnt = 0; int valorfinal; int DataTime[7]; byte segto = 0x80, hora = 0, minuto = 0; #define PinoHora 10 #define PinoMinuto 12 void setup() { display.setBrightness(0x0f); DS1307.begin(); pinMode(5, INPUT); pinMode(6, INPUT); } void loop() { DS1307.getDate(DataTime); hora = DataTime[4]; minuto = DataTime[5]; display.showNumberDecEx((hora * 100) + minuto, 0x40, 1, 4, 0); // dispaying value of hour and minutes on display BotaoHora = digitalRead(PinoHora); BotaoMinuto = digitalRead(PinoMinuto); if(BotaoHora == 1 && EstadoBotaoHoraAnt == 0) { hora++; DS1307.setDate(0,0,0,0,hora,minuto,0);//Ano, Mes, Data do Mes, Dia da Semana, hora, minuto, segundo EstadoBotaoHoraAnt = 1; if(hora > 23) { hora = 0; } } if(BotaoHora == 0 && EstadoBotaoHoraAnt == 1) { EstadoBotaoHoraAnt = 0; } if(BotaoMinuto == 1 && EstadoBotaoMinutoAnt == 0) { minuto++; DS1307.setDate(0,0,0,0,hora,minuto,0);//Ano, Mes, Data do Mes, Dia da Semana, hora, minuto, segundo EstadoBotaoMinutoAnt = 1; if(minuto > 59) { minuto = 0; } } if(BotaoMinuto == 0 && EstadoBotaoMinutoAnt == 1) { EstadoBotaoMinutoAnt = 0; } }</code>
Inicialmente, realizamos a declaração das bibliotecas dos módulos utilizados e declaramos as variáveis do projeto, conforme apresentado no código a seguir.
<code>#include <TM1637Display.h> #include <DS1307.h> TM1637Display display(2,3); bool BotaoHora = 0, BotaoMinuto = 0; bool EstadoBotaoHoraAnt = 0, EstadoBotaoMinutoAnt = 0; int valorfinal; int DataTime[7]; byte segto = 0x80, hora = 0, minuto = 0; #define PinoHora 10 #define PinoMinuto 12</code>
Em seguida, configuramos o brilho do display, inicializamos o relógio de tempo real e foi realizada a configuração dos pinos de I/O dos botões de hora e minuto.
<code>void setup() { display.setBrightness(0x0f); DS1307.begin(); pinMode(5, INPUT); pinMode(6, INPUT); }</code>
Posteriormente, iniciamos a lógica principal na função loop. Primeiramente, realizamos a aquisição da hora e data do relógio de tempo real e salvamos no vetor tempo, conforme apresentado abaixo. A função retorna 7 parâmetros de data e hora: segundos, minutos, horas, dia da semana, data, mês e ano.
<code>DS1307.getDate(DataTime); hora = DataTime[4]; minuto = DataTime[5];</code>
Portanto, os parâmetros de data e hora são retornados na posição 4 e 5 do vetor DataTime e apresentados no Display TM1637.
Apresentando as Horas no Display TM1637
Após a leitura dos valores de hora e minuto, necessitamos apresentar esses valores no módulo display TM1637. Para isto, utilizamos o comando a seguir:
<code>display.showNumberDecEx((hora * 100) + minuto, 0x40, 1, 4, 0);</code>
Logo, esse comando tem a finalidade de exibir um número decimal e realizar o controle de ponto. Para este modelo de display, utilizamos o valor 0x40, para realizar o acionamento dos dois pontos centrais.
Desse modo, transformamos o valor de data e hora em um único valor de 4 dígitos. Por fim, enviamos para o display por meio do comando apresentado e acionamos os dois pontos do relógio através do endereço 0x40, conforme apresentado na Figura 2.
Após este comando, realizamos a leitura dos botões de ajuste de hora e minuto.
Portanto, toda vez que qualquer um desses botões forem pressionados, o valor da hora e minuto serão incrementados . Além disso, o sistema permite incremento de hora até 23 e os minutos até 59.
Caso tenha dúvidas, acesse esse artigo e aprenda a implementar a contagem com botões.
Desse modo, caso o valor seja maior, o sistema reinicia a contagem do 0 novamente.
Finalmente, esses valores serão enviados para o relógio RTC, a fim de ajustar uma nova hora estabelecida pelo usuário, conforme apresentado a seguir.
<code>BotaoHora = digitalRead(PinoHora); BotaoMinuto = digitalRead(PinoMinuto); if(BotaoHora == 1 && EstadoBotaoHoraAnt == 0) { hora++; DS1307.setDate(0,0,0,0,hora,minuto,0); //Ano, Mes, Data do Mes, Dia da Semana, hora, minuto, segundo EstadoBotaoHoraAnt = 1; if(hora > 23) { hora = 0; } } if(BotaoHora == 0 && EstadoBotaoHoraAnt == 1) { EstadoBotaoHoraAnt = 0; } if(BotaoMinuto == 1 && EstadoBotaoMinutoAnt == 0) { minuto++; DS1307.setDate(0,0,0,0,hora,minuto,0);//Ano, Mes, Data do Mes, Dia da Semana, hora, minuto, segundo EstadoBotaoMinutoAnt = 1; if(minuto > 59) { minuto = 0; } } if(BotaoMinuto == 0 && EstadoBotaoMinutoAnt == 1) { EstadoBotaoMinutoAnt = 0; }</code>
Por fim, o valor de hora e minuto serão apresentados no display após um novo ciclo de execução.
Conclusão
Finalmente, por meio desse circuito implementamos um simples relógio com dois botões, que permitem realizar o ajuste de hora e minuto. Além disso, é possível aumentar a aplicabilidade desse projeto e inserir novas funcionalidades.
Portanto, por meio desse projeto é possível inserir apresentação de data, criação de alarme e entre outros projetos que envolvem o uso do tempo.
Excelente tutorial
Gostaria de saber como substituir os 2 botões por um controle remoto IR simples, com protocolo NEC; Obrigado
No site do Larios tem um protocolo NEC que usei e funcionou muito bem. Com pequenas adaptações você pode aplicá-lo ao circuito. Link:
http://blog.larios.tecnologia.ws/iBlog/archives/3962