Relógio Arduino com Alarme e Módulo TM1637

relogio-arduino-com-alarme
Font Size

No Artigo anterior, criamos um relógio utilizando o módulo TM1637 e a única funcionalidade implementada foi a apresentação das horas. Entretanto, uma característica bastante comum nos relógios digitais é o alarme programado. Ou seja, por meio disso, podemos gerar um alarme para alertar um usuário ou acionar uma carga por meio de um relógio Arduino com alarme.

Portanto, nesse artigo apresentaremos o processo de implementação de um alarme programável a partir do artigo: Relógio com o Módulo TM1637 e Arduino

Através desse artigo, você será capaz de aprender:

Agora, iniciaremos a apresentação completa da nova funcionalidade desenvolvida.

Desenvolvimento do Projeto

Primeiramente, apresentamos o circuito desenvolvido para a criação do sistema de alarme.

Figura 1 – Circuito do Relógio Alarme com Arduino.

Para o desenvolvimento e montagem desse projeto, você irá utilizar os seguintes componentes, que são encontrados em nossa Loja Autocore Robótica.

Lista de Materiais

Funcionamento do Relógio Arduino com Alarme

De acordo com o circuito da Figura 1, implementamos mais dois botões, um buzzer e um LED sinalizador.

O Botão A será utilizado para configurar o alarme. Após o usuário pressioná-lo, o LED Vermelho sinalizador será acionado. E por meio dos botões H e M, o usuário irá ajustar o tempo e hora de alarme em que o Buzzer será acionado.

Logo após a finalização do ajuste, o usuário deverá pressionar o botão F, para finalizar o processo de configuração do alarme e o LED será desligado.

Baseado nesse princípio de funcionamento, foi implementada a função a seguir, a fim de criar o sistema de configuração do alarme.

<code>#include &lt;TM1637Display.h&gt;
#include &lt;DS1307.h&gt;
#include &lt;Wire.h&gt;
#include &lt;EEPROM.h&gt;

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, AlarmeHora = 0, AlarmeMinuto = 0;

void ConfigAlarme();

#define HORAMEM 0
#define MINMEM 1
#define Buzzer 7
#define Alarme 8
#define Enter 9
#define PinoHora 10
#define PinoMinuto 12
#define LED 13

void setup()
{
  display.setBrightness(0x0f);

  DS1307.begin();

  pinMode(Enter, INPUT);
  pinMode(PinoHora, INPUT);
  pinMode(PinoMinuto, INPUT);
  pinMode(LED, OUTPUT);
  pinMode(Buzzer, OUTPUT);

  AlarmeHora = EEPROM.read(HORAMEM);
  AlarmeMinuto = EEPROM.read(MINMEM);
  
}

void loop()
{
  DS1307.getDate(DataTime);
  hora = DataTime[4];
  minuto = DataTime[5];

  display.showNumberDecEx((hora * 100) + minuto, 0x40, 1, 4, 0);   //Apresenta o valor da hora e do display

  BotaoHora = digitalRead(PinoHora);
  BotaoMinuto = digitalRead(PinoMinuto);

  if (BotaoHora == 1 &amp;&amp; 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 &gt; 23)
    {
      hora = 0;
    }
  }

  if (BotaoHora == 0 &amp;&amp; EstadoBotaoHoraAnt == 1)
  {
    EstadoBotaoHoraAnt = 0;
  }

  if (BotaoMinuto == 1 &amp;&amp; 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 &gt; 59)
    {
      minuto = 0;
    }
  }

  if (BotaoMinuto == 0 &amp;&amp; EstadoBotaoMinutoAnt == 1)
  {
    EstadoBotaoMinutoAnt = 0;
  }

  bool BotaoAlarme = digitalRead(Alarme);

  if(BotaoAlarme == 1)
  {
    ConfigAlarme();  
  }

  if((hora == AlarmeHora) &amp;&amp; (minuto == AlarmeMinuto))
  {
    digitalWrite(Buzzer, HIGH);
  }
    else
  {
    digitalWrite(Buzzer, LOW);  
  }
}

void ConfigAlarme()
{
  bool BotaoEnter = 0;
  digitalWrite(13, HIGH);

  delay(1000);
  
  do
  {

      BotaoHora = digitalRead(PinoHora);
      BotaoMinuto = digitalRead(PinoMinuto);
      
      if (BotaoHora == 1 &amp;&amp; EstadoBotaoHoraAnt == 0)
      {
        AlarmeHora++;
        EstadoBotaoHoraAnt = 1;
    
        if (AlarmeHora &gt; 23)
        {
          AlarmeHora = 0;
        }
      }
    
      if (BotaoHora == 0 &amp;&amp; EstadoBotaoHoraAnt == 1)
      {
        EstadoBotaoHoraAnt = 0;
      }
    
      if (BotaoMinuto == 1 &amp;&amp; EstadoBotaoMinutoAnt == 0)
      {
        AlarmeMinuto++;
        EstadoBotaoMinutoAnt = 1;
    
        if (AlarmeMinuto &gt; 59)
        {
          AlarmeMinuto = 0;
        }
      }
    
      if (BotaoMinuto == 0 &amp;&amp; EstadoBotaoMinutoAnt == 1)
      {
        EstadoBotaoMinutoAnt = 0;
      }

    BotaoEnter = digitalRead(Enter);
    display.showNumberDecEx((AlarmeHora * 100) + AlarmeMinuto, 0x40, 1, 4, 0);   //Apresentacao do Tempo
    
  }while(BotaoEnter == 0);

    EEPROM.write(HORAMEM, AlarmeHora);
    EEPROM.write(MINMEM, AlarmeMinuto);
    delay(1000);
    
    digitalWrite(LED, LOW);
}</code>

A seguir, apresentaremos a discussão do código acima. Ele é similar ao apresentado no artigo anterior, porém, possui a implementação da função de alarme.

Primeiramente, realizamos a implementação da função ConfigAlarme. Esta função foi implementada, a fim de criar a configuração do alarme.

Função de Configuração do Alarme

A função de configuração será chamada quando o botão Configurar for pressionado. Isto é apresentado no trecho de código apresentado a seguir.

<code>  if(BotaoAlarme == 1)
  {
    ConfigAlarme();  
  }</code>

Quando o botão for pressionado, a função será chamada e será executado o seguinte bloco de código.

<code>void ConfigAlarme()
{
  bool BotaoEnter = 0;
  digitalWrite(13, HIGH);

  delay(1000);
  
  do
  {

      BotaoHora = digitalRead(PinoHora);
      BotaoMinuto = digitalRead(PinoMinuto);
      
      if (BotaoHora == 1 &amp;&amp; EstadoBotaoHoraAnt == 0)
      {
        AlarmeHora++;
        EstadoBotaoHoraAnt = 1;
    
        if (AlarmeHora &gt; 23)
        {
          AlarmeHora = 0;
        }
      }
    
      if (BotaoHora == 0 &amp;&amp; EstadoBotaoHoraAnt == 1)
      {
        EstadoBotaoHoraAnt = 0;
      }
    
      if (BotaoMinuto == 1 &amp;&amp; EstadoBotaoMinutoAnt == 0)
      {
        AlarmeMinuto++;
        EstadoBotaoMinutoAnt = 1;
    
        if (AlarmeMinuto &gt; 59)
        {
          AlarmeMinuto = 0;
        }
      }
    
      if (BotaoMinuto == 0 &amp;&amp; EstadoBotaoMinutoAnt == 1)
      {
        EstadoBotaoMinutoAnt = 0;
      }

    BotaoEnter = digitalRead(Enter);
    display.showNumberDecEx((AlarmeHora * 100) + AlarmeMinuto, 0x40, 1, 4, 0);   //   dispaying value of hour and minutes on display
    
  }while(BotaoEnter == 0);

    EEPROM.write(HORAMEM, AlarmeHora);
    EEPROM.write(MINMEM, AlarmeMinuto);
    delay(1000);
    
    digitalWrite(LED, LOW);
}</code>

Inicialmente, realizamos o acionamento do LED, para sinalizar que o sistema entrou na opção de ajuste de alarme, conforme apresentado na Figura 2.

Figura 2 – Configuração do Alarme.

Logo após, o fluxo de código entrará no laço do while, a fim de realizar a leitura dos botões de ajuste da hora do alarme.

A lógica de ajuste é similar à configuração das horas e minutos, inclusive, são utilizados os mesmos botões a fim de criar uma simples interface de configuração.

Logo após a configuração do alarme, o usuário necessita pressionar o botão F, para finalizar e sair do laço.

Posteriormente, o valor de hora e minuto serão salvos na memória EEPROM, de acordo com o código abaixo.

<code>    EEPROM.write(HORAMEM, AlarmeHora);
    EEPROM.write(MINMEM, AlarmeMinuto);
    delay(1000);
    
    digitalWrite(LED, LOW);</code>

A seguir, apresentaremos o processo de armazenamento do tempo de alarme na memória EEPROM e sua aplicação neste projeto.

Armazenando as Horas na Memória EEPROM

Os dados de Hora e Minuto são salvos na memória, de modo a garantir que quando o CHIP seja desligado, os dados possam permanecer salvos no sistema.

Baseado nisso, implementamos as seguintes linhas de programação na função void setup().

<code>  AlarmeHora = EEPROM.read(HORAMEM);
  AlarmeMinuto = EEPROM.read(MINMEM);</code>

Assim, ao energizar o Arduino, os dados serão lidos da posição HORAMEM e MINMEM da memória EEPROM.

Portanto, jamais perderemos os dados configurados pelo usuário.

Logo após a configuração do alarme, o fluxo sairá da função e retornará para o código principal na função loop.

Execução do Alarme do relógio Arduino

No loop principal, o usuário poderá ajustar as horas e minutos, conforme já apresentado no artigo anterior. Além disso, foi inserida a condição para verificar se a hora atual é igual à hora de alarme ajustada pelo usuário.

A seguir, é possível ver a porção de código, que representa esta condição.

<code>  if((hora == AlarmeHora) &amp;&amp; (minuto == AlarmeMinuto))
  {
    digitalWrite(Buzzer, HIGH);
  }
    else
  {
    digitalWrite(Buzzer, LOW);  
  }</code>

Portanto, caso a hora e minuto sejam iguais ao tempo ajustado pelo usuário, o Buzzer será acionado. Caso contrário, o Buzzer permanecerá desligado.

Após isto, o código ficará em loop apresentando as horas, conforme apresentado na Figura 3.

Figura 3 – Apresentação das Horas no Display TM1637.

Por fim, o usuário poderá realizar a configuração de um novo alarme ou ajuste em tempo real das horas, conforme apresentado no artigo citado no início deste projeto.

Conclusão

Os alarmes programados são de grande interesse na área de automação industrial e residencial. Através deles, podemos realizar diversos acionamentos de cargas e atividades em horários específicos.

Assim, por meio desse artigo, foi possível implementar o alarme e compreender o processo de manipulação da memória EEPROM. Dessa forma, o usuário poderá manter o valor ajustado salvo e recuperá-lo posteriormente, caso ocorra o desligamento do CHIP.

Portanto, sugerimos utilizar este projeto e utilizá-lo para a criação de um novo sistema para acionamento programado de dispositivos. Para isso, conheça todos os nossos artigos do blog e cadastre-se em nossa lista de e-mail, a fim de receber novos projetos.

 

Posts relacionados

Aprenda a utilizar o Sensor de Distância Ultrassônico HC-SR04 com Arduino

por autocore
7 anos ago

Introdução ao uso do display Nextion em IHM´s parte 1: Instruções básicas

por Fábio Timbó
2 anos ago

Conhecendo o Watchdog no Arduino

por Danilo Nogueira
5 anos ago
Sair da versão mobile