domingo, 20 de janeiro de 2013

Cronômetro Regressivo com Shift register e Display de 7 segmentos (common anode)

Nova versão do cronômetro regressivo, agora com o uso de dois Shift registers (74HC595), a grande vantagem em utilizar shift registers é a economia no uso de pino do Arduino, agora são utilizados apenas três e não mais doze pinos.

Equipamento utilizado:

Arduino Mega 2560 (indiferente)
2 Shift registers 74HC595
4 Resistores 100ohms
7 Resistores de 300ohms
1 Display de sete segmentos quatro dígitos TOF-5461BH-N common anode

Os resistores de 100ohms devem ser conectados nos pinos que controlam os dígitos do display (segundo shift register da esquerda para a direita).

Os resistores de 300ohms são conectados com os segmentos do display.






/*
 projeto: Cronometro regresivo com shift register
 autor: Ilderado Idriis - seja bacana! Mantenha os créditos!
 site: http://ardoit.blogspot.com - Visite, comente, contribua com suas idéias!
 data: 20/jan/2013
 */ 

// biblioteca para controlar eventos automaticamente com intervalo de tempo
// http://www.pjrc.com/teensy/arduino_libraries/MsTimer2.zip
#include <MsTimer2.h>

const short latchPin = 4;  // Pino 12 do 74HC595 (Latch) Vermelho
const short dataPin  = 2;  // Pino 14 do 74HC595 (Data) Azul
const short clockPin = 3;  // Pino 11 do 74HC595 (Clock) Amarelo

/* Valores que acendem os segmentos que exibem os números do display
   é utilizado o B na frente dos números para informar que é um número binário
   1 = apagar segmento
   0 = ligar segmento
   lembrando que está sendo utilizado um anodo comum, então 1 apaga e 0 liga  */
 
const byte numeros[10] = {
  B00000001, // 0
  B01001111, // 1
  B00010010, // 2
  B00000110, // 3
  B01001100, // 4
  B00100100, // 5
  B01100000, // 6
  B00001111, // 7
  B00000000, // 8
  B00000100  // 9
};

const byte digitos[4]= { // Valores que acendem os digitos do display
  B01000000, // 1
  B00100000, // 2
  B00010000, // 3
  B00001000  // 4
};

// Contagem do cronômetro em Minutos:Segundos ex: d0d1:d02d3 / 05:00
short d0 = 0;
short d1 = 5;
short d2 = 0;
short d3 = 0;

// protótipo das funções
void countdown(void);
void ligar(byte, byte);


void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  MsTimer2::set(1000, countdown); // define intervalo para chamada da função de contragem regressiva  
  MsTimer2::start(); // inicia chamada da função de contagem regressiva  
}

void loop() { // Exibe os dígitos
  ligar(0,d0);
  ligar(1,d1);
  ligar(2,d2);  
  ligar(3,d3);    
}

// exibe digitos
void ligar(byte digito, byte numero){
  delay(3); // pausa para refresh do display
  digitalWrite(latchPin, LOW); // Shift registers em estado de recebimento de dados
  shiftOut(dataPin, clockPin, LSBFIRST, digitos[digito]); // digito a ser alterado
  shiftOut(dataPin, clockPin, LSBFIRST, numeros[numero]); // número que será exibido no dígito acima
  digitalWrite(latchPin, HIGH); // Fecha recebimento de dados dos shift registers
}

void countdown(){ // função da contagem regressiva, d0d1:d02d03 ex: 15:45
  if(d3 > 0){ 
    d3--;          
  }
  else{
    if(d2 > 0){
      d2--;
      d3 = 9;
    }
    else{
      if(d1 > 0){
        d1--;
        d2 = 5;
        d3 = 9;
      }
      else{
        if(d0 > 0){
          d0--;
          d1 = 9;
          d2 = 5;
          d3 = 9;
        }
      }
    }
  }
}

2 comentários:

  1. Boa noite Ilderaldo!
    Esse 74HC595 que você utilizou, pode ser usado como um Demux de 3 entradas (8 saídas)??
    Caso não, vc conhece algum componente que possa fazer essa função? Talvez o CD4051?!?
    Valeu!

    ResponderExcluir
  2. Thiago!

    É exatamente assim que estou utilizando ele, apenas três entradas e sete saídas, assim economizo as saídas do arduino, mas cada um dos shift registers 74HC595 tem sete saídas e não oitos, porém você pode conectar um 74HC595 em outro, em quantidade infinita, ou seja, com 3 entradas de um você tem sete saídas nele mesmo e esse conectado em um segundo com mais sete saídas e se quiser esse segundo em um terceiro e assim vai.

    ResponderExcluir