sexta-feira, 14 de outubro de 2016

Como comandar um display 7 segmentos de 4 digitos.

Bom dia pessoal , como vão voces? tudo em riba?

Nesse post irei ensinar como comandar um display de 7 segmentos do tipo cathodo comum, lembrando que voce pode usar o anodo comum, bastando inverter a polaridade(o que é high ppassa a ser LOW e vice-versa).

Para isso precisariamos ter um arduino(dããã) e um display 7 segmentos 4 digitos, que é o bixao da foto:


Bom pessoal antes de eu explicar a voces tenho que te falar como funciona um display, cada barrinha que faz um numero é na verdade um led que vai ser aceso por um pino especifico do arduino. Como num display são 8 barrinhas, como podem ver na imagem:
Então cada saída aciona um led e voce vai controlando entre os pinos high e low para formar o seu numero.

Por exemplo: vamos supor que voce quer fazer o "1" e voce colocou os pinos de 1 ate o 7 devidamente setados na função void setup.
então no void loop voce coloca:
digitalWrite(1,LOW);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
Esse é o espirito, e ah partir dahe voce bola suas maracutaias pra formar os numeros, usando função case, if numa variavel que vai se mudando e formando o valor, o céu é o limite.

Agora voces me perguntam: Tá mas e num display de 4 digitos? o arduino não tem tantas saídas para 4 displays.
É agora que entra um fenomeno interessante: A persistencia da visão
O display de 4 segmentos tem as mesmas saidas pros leds, mas uma saída em especifica para cada coluna. Então o que fazemos? ligamos a coluna um, escrevemos o que queremos lah, desligamos ela, ligamos a 2, escrevemos e assim vai sucessivamente, só que bastante rápido e o olho não percebe este efeito.
veja um exemplo:

Então terminada as explicações vai a prática:
Antes de tudo pessoal gostaria de falar que esse código em especifico foi escrito 100% por mim, não tirei de nenhum lugar, apenas estudei bastante e com base nele escrevi essa graçinha. Nm sequer tem partes de outros códigos, então, se forem copiar, por favor mantenham a fonte^^

Nesse código eu leio os dados de um sensor qualquer e mostro os valores no display.É util pra quase qualquer coisa, desde mostrar valores de voltimetro a sensores comuns de tomada analógica.

Segue o código comentado:
------------------
//Criado por Luciano Cristiano de Oliveira Braun
//dia 13/10/2016
//Podem copiar,alterar,desde de que preservem a fonte
int a=0;
int b=0;
int sensor=A1;
int valor=0;
int valor1=0;
int valor2=0;
int valor3=0;
int valor4=0; //Os valores de 0 a 4 serão usados para conversão do sensor
int dg1=8;
int dg2=9;
int dg3=10;
int dg4=11;
unsigned long tempo;
int referencia=0;
int contar=0;

void setup() {

  pinMode(sensor,INPUT);
 DDRD = B11111110; //aqui declarei as saídas de 1 a 7 direto na porta registradora ganhando tempo
 pinMode(dg1,OUTPUT);
 pinMode(dg2,OUTPUT);
 pinMode(dg3,OUTPUT);
 pinMode(dg4,OUTPUT);
  

}

void loop() {
  
  switch (b){
  case 0:
  
 PORTD = B01111110; 
  break;
  case 1:
  
 PORTD = B00001100;
  break;
  case 2:
   
 PORTD = B10110110;
  break;
  case  3:
   
  PORTD =B10011110;
  break;
  case  4:
   
 PORTD = B11001100;
  break;
  case  5:
  
PORTD = B11011010;
  break;
  case  6:
   
PORTD = B11111010;
  break;
  case  7:
   
PORTD =  B00001110;
  break;
  case  8:
   
PORTD =B11111110;
  break;
  case  9:
  PORTD = B11001110;
  break;
 //mesma coisa na função case,declarei o pinos como HIGH e LOW como 1 e 0 direto, 
 //pra ganhar tempo, mas voces podem declarar um por um se julgarem mais facil 
 }
 tempo=millis();

  valor= analogRead(sensor);
  valor=map(valor,0,1023,0,1000);
  
  valor1= valor/10;
  valor1=valor1*10;
  valor1=valor-valor1;
  
  
  valor2=valor/100;
  valor2=valor2*100;
  valor2=(valor -valor2)/10;
  valor3=valor/1000;
  valor3=valor3*1000;
  valor3=(valor-valor3)/100;
  valor4=valor/1000;
  //uma formula complicada para converter os valores em centena,dezena e milhar
  

 if(tempo - referencia>5){
  referencia=tempo;
  contar++;
//funcao millis que incrementa o refresh das variaveis
 }
 if(contar==1){

  digitalWrite(dg1,HIGH);
    digitalWrite(dg3,HIGH);
     digitalWrite(dg2,HIGH);
     digitalWrite(dg4,HIGH);
 }
 if (contar==2){
  b=valor1;
   digitalWrite(dg2,HIGH);
     digitalWrite(dg1,HIGH);
    digitalWrite(dg3,LOW);
    digitalWrite(dg4,HIGH);
 }
  if (contar==3){
    
   digitalWrite(dg2,HIGH);
    digitalWrite(dg3,HIGH);
     digitalWrite(dg1,HIGH);
     digitalWrite(dg4,HIGH);
  }
  if(contar==4){
      b=valor3;
    digitalWrite(dg2,HIGH);
     
    digitalWrite(dg1,LOW);
   digitalWrite(dg3,HIGH);
   digitalWrite(dg4,HIGH);
    
  }
  if(contar==5){
  
     digitalWrite(dg2,HIGH);
    digitalWrite(dg1,HIGH);
     digitalWrite(dg3,HIGH);
     digitalWrite(dg4,HIGH);
  }
   if (contar==6){
    b=valor2;
   digitalWrite(dg2,LOW);
    digitalWrite(dg3,HIGH);
     digitalWrite(dg1,HIGH);
     digitalWrite(dg4,HIGH);
       
  }
 if(contar==7){
  
     digitalWrite(dg2,HIGH);
    digitalWrite(dg1,HIGH);
     digitalWrite(dg3,HIGH);
     digitalWrite(dg4,HIGH);
  }
  if(contar==8){
  b=valor4;
   digitalWrite(dg4,LOW);
     digitalWrite(dg2,HIGH);
    digitalWrite(dg1,HIGH);
     digitalWrite(dg3,HIGH);
    
  }
if(contar==9){
 contar=1;
}
 //o contar liga e desliga em cada numero os "pinos guias"notem que vai do dg1 ao dg4
//quando contar chega a 9 ele volta pro 1, para "contar" de novo 

}

E é isso ahe pessoal,espero que tenham gostado. Em breve postarei o vídeo.
E como prometido eis o video

Nenhum comentário: