Translate

sexta-feira, 4 de abril de 2014

Display 7 segmentos com Arduino


Começaremos através deste artigo, nosso primeiro post com soluções para Arduino. 

Neste rápido tutorial, mostraremos como acionar um display de 7 segmentos utilizando a plataforma Arduino. 

Nosso projeto difere-se dos demais, pois utiliza o circuito integrado CD 4511 (datasheet disponível aqui).

O objetivo de se utilizar este CI, é economizar portas de saída do Arduino, pois com  o CD 4511, necessitamos apenas de 4 portas do Arduino, para acionar os 7 segmentos deste display.

Abaixo vídeo demonstrando o circuito em funcionamento:



Note que foi adicionado o efeito de fader para desvanecimento do digito. Para isso, apenas ligamos no pino 10  o anodo comum do display, e variamos a intensidade do brilho, baseado no tempo.

No código, geramos o BCD (para entrada do 4511) usando um array bidimensional onde colocamos todos os dígitos a serem exibidos (de 0 a 9) e  o valor a ser colocado nos 4 pinos de saída do Arduino (1 ou 0) . 

O código ainda exibe na saída serial, a tabela verdade do dígito exibido.

Abaixo o código: 





/*

 Display de 7 segmentos ligado atravs do circuito integrado
 CD 4511
 
 */



const int pinA = 6;   //LSB bit MENOS significativo
const int pinB = 7; 
const int pinC = 8; 
const int pinD = 9;   //MDB bit MAIS significativo

                       //  D C B A
byte digitos[10][4] ={   { 0,0,0,0 },  // = 0
                         { 0,0,0,1 },  // = 1
                         { 0,0,1,0 },  // = 2
                         { 0,0,1,1 },  // = 3
                         { 0,1,0,0 },  // = 4
                         { 0,1,0,1 },  // = 5
                         { 0,1,1,0 },  // = 6
                         { 0,1,1,1 },  // = 7
                         { 1,0,0,0 },  // = 8
                         { 1,0,0,1 }   // = 9
                         };

const int faderPin = 10;



void setup(){

  pinMode(pinA, OUTPUT);   
  pinMode(pinB, OUTPUT);   
  pinMode(pinC, OUTPUT);   
  pinMode(pinD, OUTPUT);  
  
  pinMode(faderPin, OUTPUT);  
  
  Serial.begin(9600);
}  

void loop(){

     
//  CONTAGEM CRESCENTE
//
    for (byte count = 0; count < 10; ++count) {
    
     imprimeBCD(count);
     fadeOut(); 
     delay(500); 
    
   
  }
 
 
  Serial.print("*****************\n\n");
  delay(2000);


}

void imprimeBCD(byte digit) {
  
  byte pin = 9; // pino do MSB bit mais significativo 
  
  Serial.print(digit);Serial.print(",\n ");
                Serial.print("D  C  B  A \n");
  for (byte segCount = 0; segCount < 4; ++segCount) {


    imprimeTabelaVerdade(pin,  digitos[digit][segCount]);
    
    digitalWrite(pin, digitos[digit][segCount]); //envia BCD para 4511
    --pin; // decrementa pino do bit

  }   
   fadeIn(); 


  Serial.print("\n\n");
  
}

void imprimeTabelaVerdade(int p, int estado){

  switch (p) {

  case 6: 

    Serial.print(" ");

    Serial.print(estado);
    Serial.print(" ");
    break;
  case 7: 
    Serial.print(" ");

    Serial.print(estado);
    Serial.print(" ");
    break;
  case 8: 

  
    Serial.print(" ");

    Serial.print(estado);
    Serial.print(" ");
    break;
  case 9: 

   
    Serial.print(" ");

    Serial.print(estado);  
    Serial.print(" ");  
    break;

  }
}


void fadeOut(){

  for(int i = 0; i < 255; ++i)
  {
    analogWrite(faderPin, i);
    delay(5);
  }
  
  digitalWrite(faderPin, HIGH); 

}


void fadeIn(){


   for(int i = 255; i > 0; --i)
  {
    analogWrite(faderPin, i);
    delay(5);
  }
  
    digitalWrite(faderPin, LOW); 
}


Nenhum comentário:

Postar um comentário