domingo, 30 de dezembro de 2012

Cronometro regressivo (common anode 4 digits seven segment)


Este é o primeiro tutorial que escrevo, um cronometro regressivo, este tutorial é parte de um projeto maior um alarme ativado por sensor de presença, em breve publicarei-o.

Tentei descrever o máximo possível cada parte do código, qualquer dúvida é só deixar nos comentários.

O código está disponível para download neste link

Utilizei a lib MsTimer2 após baixa-la descompacte-a no diretório \libraries da IDE do seu arduino,

ex:
c:\arduino-1.0.3-windows\arduino-1.0.3\libraries\MsTimer2

Recomendo o hábito de ler os datasheets dos componentes, o do display utilizado está nesse link

A visão da protoboard foi feita com 4 unidades de display (uma para cada dígito), porém a utilizada é uma única com 4 dígitos.

Material utilizado
- (1) 4 Digits 7 segment display 12 pins  mod TOF 5461BH (common anode )
- (12) Resistores de 300 ohms


























  
/*
  projeto: Cronometro regressivo
  autor: Ilderado Idriis - seja bacana! Mantenha os créditos!
  site: http://ardoit.blogspot.com - Visite, comente, contribua com suas idéias!
  data: 29/dez/2012
  
  hardware:(1) four digits seven segment display - mod: TOF-5461BH - common anode
           (12) resistores de 300 ohms
  
*/

/*
  digitPins[]: pinos que controlam os digitos
  segmentPins[]:  pinos que controlam cada segmento que forma os números, segmentos vão de A-G mais o ponto
  numbers[10][8]: matriz bidimensional 10 números (0-9) e 8 segmentos,
                 como cada número é formado por até 8 segmentos (ligados ou desligados)
                 por isso a necessidade desta matriz, cada 1 e 0 corresponde a um segmento
                 ligado ou desligado (depende do tipo do seu display se é anodo ou cathodo).
                 Os segmentos são nomeados de A-G mais o ponto (consulte o datasheet em anexo).
*/

// bibliotecas
#include <MsTimer2.h>

// configuração I/O e variaveis globais
byte pinosDigitos[] = {
// 12, 9, 8, 6 // pinos dos digitos no display de sete segmentos
   13, 10, 8, 7};
byte pinosSegmentos[] = {
// 11, 7, 4, 2 , 1, 10, 5, 3 pinos dos segmentos no display de sete segmentos
   12, 9, 5, 3 , 2, 11, 6, 4}; // pinos no arduino
boolean algarismos[10][8]={
  // a b c d e f g .
  { 1, 1, 1, 1, 1, 1, 0, 0}, // 0
  { 0, 1, 1, 0, 0, 0, 0, 0}, // 1
  { 1, 1, 0, 1, 1, 0, 1, 0}, // 2
  { 1, 1, 1, 1, 0, 0, 1, 0}, // 3
  { 0, 1, 1, 0, 0, 1, 1, 0}, // 4
  { 1, 0, 1, 1, 0, 1, 1, 0}, // 5
  { 1, 0, 1, 1, 1, 1, 1, 0}, // 6
  { 1, 1, 1, 0, 0, 0, 0, 0}, // 7
  { 1, 1, 1, 1, 1, 1, 1, 0}, // 8
  { 1, 1, 1, 1, 0, 1, 1, 0}  // 9
};

// Minutos:Segundos ex: d0d1:d02d3 / 11:15
int d0 = 6;
int d1 = 0;
int d2 = 0;
int d3 = 0;

void setup() {                  
  for (int x = 0; x < 4; x++){ // uso de loops para evitar repetir linha por linha
    pinMode(pinosDigitos[x], OUTPUT);
  }
  
  for(int y = 0; y < 9; y++){  // uso de loops para evitar repetir linha por linha
    pinMode(pinosSegmentos[y], 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(){
  // chama função que mostra os digitos
  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
  apaga(); // chama função desativa todos os pinos de display para poder atualizar os segmentos dos outros digitos
  digitalWrite(pinosDigitos[digito], HIGH); // ativa o digito que terá o número atualizado
   for(int coluna = 0; coluna < 8; coluna++){ // ativa os segmentos
     digitalWrite(pinosSegmentos[coluna],!algarismos[numero][coluna]);
   }
}

void apaga(){ // desativa todos os digitos, esse procedimento é necessário pois todos os digitos utilizam os mesmos pinos
  for (int x = 0; x < 4; x++){
    digitalWrite(pinosDigitos[x], LOW);
  }  
}

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;
        }
      }
    }
  }       
} 

Um comentário:

  1. Lembro-me do tempo em que para fazer um desse utilizei somente portas lógias, dei 2 protos desse com um contador de segundos utilizando um 555 para o circuito de flip-flop.
    Hoje, com essas placas programáveis, fica tudo mais simples!!! Ficou ótimo o POST!

    ResponderExcluir