terça-feira, 9 de junho de 2015

Utilizando o módulo Display 7 Segmentos para Relógio

Hoje falaremos sobre como realizar a interface entre o Módulo Display 7 Segmentos para Relógio e o
Modulo DS1302 relógio em tempo real para arduino que em conjunto possibilitam a elaboração de um relógio bastante simples de construir, que com os ajustes adequados, pode realizar diversas tarefas, que podem ser iniciadas em uma determinada hora, a ser programada previamente.
Na demonstração abaixo, o Arduino está também conectado a um Módulo Relé 5V 1 canal, que será utilizado para acionar uma lâmpada do tipo "Olho de Boi", bastante utilizada para indicar se um sistema está energizado pela rede CA convencional.
Na montagem, o Arduino irá acionar o Relé, acendendo a lâmpada em um determinado horário, e apagando-a após um determinado intervalo de tempo.
Para a montagem, serão necessários os seguintes itens:

- Arduino Uno
- Shield Placa Expansora para Arduino UNO
- Modulo DS1302 relógio em tempo real para arduino
- Módulo Display 7 Segmentos para Relógio
- Módulo Relé 5V 1 canal
- Cabo de força rabicho 2 pinos paralelo c/1,5M
- Lâmpada tipo "Olho de Boi"
- Fios para ligação (Sugestão: Cabo Jumper MACHO/FÊMEA 20cm 40 vias)


Arduino Uno


Shield Placa Expansora para Arduino UNO

Modulo DS1302 relógio em tempo real para arduino



Módulo Display 7 Segmentos para Relógio


Módulo Relé 5V 1 canal


As Conexões devem ser feitas da seguinte forma:
Módulo RTC     |     Arduino
      GND            |      GND
      VCC            |       5v
      SCK             |      D6
      I/O               |       D7
      RST             |       D8

Módulo 7Seg     |     Arduino
      GND            |       D2
      VCC             |       D3
      DIO              |       D4
      CLK             |       D5

Módulo Relé      |     Arduino
      IN                 |       D12
      GND            |       GND
      VCC             |       5v


Diagrama de Conexão


O cabo de força deve ser conectado à rede elétrica, sendo que um dos fios deve ser diretamente conectado à lampada e o outro deve passar pelo terminal C do Relé. O outro fio da lâmpada deve ser conectado ao terminal NO do Relé.
Confira um vídeo mostrando o funcionamento do projeto.
Foi configurado para ativar o relé as 17:40 e permanecer aceso por um minuto.



Baixe aqui o sketch com a programação do Arduino para esse projeto.
Segue abaixo o código fonte utilizado nesse projeto.

 //############### ELETRODEX ELETRÔNICA ###############  
 // Programa de interface entre o Módulo RTC   
 // e o Módulo Display 7 Segmentos para Relógio  
 //   
 // As Conexões devem ser feitas da seguinte forma:  
 // Módulo RTC  |  Arduino  
 //   GND   |   GND  
 //   VCC   |   5v  
 //   SCK   |   D6  
 //   I/O   |   D7  
 //   RST   |   D8  
 //  
 // Módulo 7Seg | Arduino  
 //   GND   |   D2  
 //   VCC   |   D3  
 //   DIO   |   D4  
 //   CLK   |   D5  
 //  
 // Módulo Relé | Arduino  
 //   IN    |   D12  
 //   GND   |   GND  
 //   VCC   |   5v  
 #include <virtuabotixRTC.h> // Carrega a biblioteca virtuabotixRTC  
 #include <TimerOne.h>    // Carrega a biblioteca TimerOne  
 #include "TM1637.h"     // Carrega a biblioteca TM1637  
 #define ON 1  
 #define OFF 0  
 virtuabotixRTC myRTC(6, 7, 8);        // Determina os pinos ligados ao modulo myRTC(clock, data, rst)  
 int8_t TimeDisp[] = {0x00, 0x00, 0x00, 0x00}; // Define a forma como serão mostrados os numeros no 7seg  
 unsigned char ClockPoint = 1;         // Inicializa a variavel que controla o ":" do Relógio  
 unsigned char Update;  
 unsigned char halfsecond = 0;  
 unsigned char second;  
 unsigned char minute;  
 unsigned char hour;  
 #define CLK 5                 // Determina os pinos de clock e dados do módulo Display 7seg (pode ser alterado)    
 #define DIO 4  
 TM1637 tm1637(CLK, DIO);           // Inicializa o módulo Display 7seg  
 void setup()  
 {  
  Serial.begin(9600);  
  pinMode(2, OUTPUT);             // Inicializa pino Digital 2 como saída  
  pinMode(3, OUTPUT);             // Inicializa pino Digital 3 como saída  
  pinMode(12, OUTPUT);            // Inicializa pino Digital 12 como saída  
  digitalWrite(2, LOW);            // Configura o pino 2 em 0v (necessário para alimentação do Módulo 7seg, mas pode ser alterado)  
  digitalWrite(3, HIGH);           // Configura o pino 3 em 5v (necessário para alimentação do Módulo 7seg, mas pode ser alterado)  
  tm1637.set();  
  tm1637.init();  
  Timer1.initialize(500000);//timing for 500ms  
  Timer1.attachInterrupt(TimingISR); //declare the interrupt serve routine:TimingISR  
 // Informacoes iniciais de data e hora  
 // Apos setar as informacoes, comente a linha abaixo  
 // (segundos, minutos, hora, dia da semana, dia do mes, mes, ano)  
 // myRTC.setDS1302Time(30, 11, 16, 2, 8, 6, 2015);  
 }  
 void loop()  
 {  
  myRTC.updateTime();            // Le as informacoes do CI  
  TimeUpdate();               // Atualiza as variáveis que controlam o Display 7seg  
  tm1637.display(TimeDisp);         // Comanda o módulo 7seg para mostrar as variaveus atualizadas acima.  
  Serial.print("Data : ");          // Imprime as informacoes no serial monitor  
  imprime_dia_da_semana(myRTC.dayofweek);  // Chama a rotina que imprime o dia da semana  
  Serial.print(", ");  
  Serial.print(myRTC.dayofmonth);  
  Serial.print("/");  
  Serial.print(myRTC.month);  
  Serial.print("/");  
  Serial.print(myRTC.year);  
  Serial.print(" ");  
  Serial.print("Hora : ");  
  if (myRTC.hours < 10)           // Adiciona um 0 caso o valor da hora seja <10  
  {  
   Serial.print("0");  
  }  
  Serial.print(myRTC.hours);  
  Serial.print(":");            // Adiciona um 0 caso o valor dos minutos seja <10  
  if (myRTC.minutes < 10)  
  {  
   Serial.print("0");  
  }  
  Serial.print(myRTC.minutes);  
  Serial.print(":");  
  if (myRTC.seconds < 10)         // Adiciona um 0 caso o valor dos segundos seja <10  
  {  
   Serial.print("0");  
  }  
  Serial.println(myRTC.seconds);  
  ClockPoint = (~ClockPoint) & 0x01;    // Inverte o estado do ":" do relógio  
  despertador();  
  delay( 1000);  
 }  
 void despertador()  
 {  
 if (hour==17 && minute==19)  
 {  
  digitalWrite(12, LOW);   
 }  
 else  
 {  
  digitalWrite(12, HIGH);   
 }  
 }  
 void imprime_dia_da_semana(int dia)  
 {  
  switch (dia)  
  {  
   case 1:  
    Serial.print("Domingo");  
    break;  
   case 2:  
    Serial.print("Segunda");  
    break;  
   case 3:  
    Serial.print("Terca");  
    break;  
   case 4:  
    Serial.print("Quarta");  
    break;  
   case 5:  
    Serial.print("Quinta");  
    break;  
   case 6:  
    Serial.print("Sexta");  
    break;  
   case 7:  
    Serial.print("Sabado");  
    break;  
  }  
 }  
 void TimingISR()  
 {  
  halfsecond ++;  
  Update = ON;  
  if (halfsecond == 2) {  
   second = (myRTC.seconds);    // Sincroniza as variáveis dos segundos, no RTC e no 7seg  
   minute = (myRTC.minutes);    // Sincroniza as variáveis dos minutos, no RTC e no 7seg  
   hour = (myRTC.hours);      // Sincroniza as variáveis das horas, no RTC e no 7seg  
   halfsecond = 0;  
  }  
  // Serial.println(second);  
 }  
 void TimeUpdate(void)        // Rotina de comando do Display 7seg  
 {  
  if (ClockPoint)tm1637.point(POINT_ON);  
  else tm1637.point(POINT_OFF);  
  TimeDisp[0] = hour / 10;  
  TimeDisp[1] = hour % 10;  
  TimeDisp[2] = minute / 10;  
  TimeDisp[3] = minute % 10;  
  Update = OFF;  
 }  

Conte-nos suas experiências utilizando os produtos adquiridos em  nossa loja!
Até o próximo artigo!

6 comentários:

  1. Olá Amigos da Eletrodex, utilizei este código em um projeto e funcionou tudo como descrito, parabéns. Agora gostaria de saber se vocês podem me ajudar a acionar um relé com uma contagem regressiva utilizando os mesmos componentes deste projeto. Tipo contagem de 10 segundos e quando o cronometro zerar o led acende.

    ResponderExcluir
  2. Olá Amigos da Eletrodex, utilizei este código em um projeto e funcionou tudo como descrito, parabéns. Agora gostaria de saber se vocês podem me ajudar a acionar um relé com uma contagem regressiva utilizando os mesmos componentes deste projeto. Tipo contagem de 10 segundos e quando o cronometro zerar o led acende.

    ResponderExcluir
  3. GND DO DISPLAY NO D2 ISSO QUEIMA DISPLAY?

    ResponderExcluir
  4. boa noite.
    onde consigo essas bibliotecas?


    ResponderExcluir
  5. Este comentário foi removido pelo autor.

    ResponderExcluir
  6. Essa biblioteca do TM1637 vc tirou de onde ? do cu ?

    ResponderExcluir