Display 7 Segmentos Arduino

Pretende-se com este artigo demonstrar como o arduino pode funcionar com display de 7 segmentos. Utilizou-se um SA56-11GWA que é um display único com ânodo comum, isto significa que o ânodo é comum a todos os digitos e ao ponto.
Um display é composto por 8 leds, 7 formam o algarismo e 1 o ponto decimal.A conversão entre decimal o que pretendemos mostrar e a informação binária que o recebe designa-se por BCD (Binary Coded Decimal).

display de sete segmentos

Em termos de hardware, cada led funciona de forma individual, por isso, cada uma dos segmentos tem de levar uma resistência limitadora, neste caso concreto, cada digito tem uma tensão de funcionamento de 2.2V e um consumo de 20mA. Se a tensão é 5volts, necessitamos que no resistor caia 5-2.2=3.8V, pela lei de ohm podemos calcular, R=Vres/Iled R=3.8/0.020= 190 Ω +/-20% (vamos usar um resistor com 220Ω). Isto aplica-se a este display usado como exemplo SA56-11GWA, outros podem ter valores diferentes, será útil calcular o valor da resistência necessária.

4511 e digito 7 segmentos
DecimalAA3A2A1
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001

A primeira coisa que teremos de fazer é converter o nosso número decimal em binário, vamos usar apenas exemplos de 0 a 9 nesta primeira fase


byte decToBcd(byte val)
{
  return ( (val/10*8) + (val%10) );
}

Isto converte o nosso valor decimal para binário, por exemplo, supondo que temos números com mais de 2 digitos, 27 será 0010 0111 (2 - 7 em BCD). Se tivermos apenas um algarismo o 2 por exemplo, teremos 0010.
Isto permite-nos atuar sobre um ci decoder(4511) e usar o código BCD de apenas 4 saídas do arduino, podemos assim converter um valor resultado de uma contagem, ou de qualquer entrada para o digito.



/*
Exemplo de um contador de 0 a 9 que soma cada 
vez que existe uma entrada em A0
  
author: Arturo Guadalupi 
 */
 
//Declaração dos pinos usadas nas entradas do 4511
const int A=2;
const int B=3;
const int C=4;
const int D=5;
 
void setup() {
  pinMode(A0, INPUT);
  pinMode(A, OUTPUT); //LSB
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT); //MSB
 
}
 
int count = 0; //variavel usada para o número
 
void loop() {
  if (digitalRead(A0) == LOW) //se o botão for premido na entrada A0
    {
    count++;
    delay(200); //o delay impede multiplas contagens
    if (count == 10) //contador de 0 a 9
      count = 0;
    to_BCD(); //converter para binário
    }
    
  if (count == 10)
    count = 0;
   
}
 
void to_BCD()
{
    if (count == 0) //write 0000
    {
      digitalWrite(A, LOW);
      digitalWrite(B, LOW);
      digitalWrite(C, LOW);
      digitalWrite(D, LOW);
    }
     
    if (count == 1) //write 0001
    {
      digitalWrite(A, HIGH);
      digitalWrite(B, LOW);
      digitalWrite(C, LOW);
      digitalWrite(D, LOW);
    }
     
    if (count == 2) //write 0010
    {
      digitalWrite(A, LOW);
      digitalWrite(B, HIGH);
      digitalWrite(C, LOW);
      digitalWrite(D, LOW);
    }
     
    if (count == 3) //write 0011
    {
      digitalWrite(A, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(C, LOW);
      digitalWrite(D, LOW);
    }
     
    if (count == 4) //write 0100
    {
      digitalWrite(A, LOW);
      digitalWrite(B, LOW);
      digitalWrite(C, HIGH);
      digitalWrite(D, LOW);
    }
     
    if (count == 5) //write 0101
    {
      digitalWrite(A, HIGH);
      digitalWrite(B, LOW);
      digitalWrite(C, HIGH);
      digitalWrite(D, LOW);
    }
     
    if (count == 6) //write 0110
    {
      digitalWrite(A, LOW);
      digitalWrite(B, HIGH);
      digitalWrite(C, HIGH);
      digitalWrite(D, LOW);
    }
     
    if (count == 7) //write 0111
    {
      digitalWrite(A, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(C, HIGH);
      digitalWrite(D, LOW);
    }
     
    if (count == 8) //write 1000
    {
      digitalWrite(A, LOW);
      digitalWrite(B, LOW);
      digitalWrite(C, LOW);
      digitalWrite(D, HIGH);
    }
     
    if (count == 9) //write 1001
    {
      digitalWrite(A, HIGH);
      digitalWrite(B, LOW);
      digitalWrite(C, LOW);
      digitalWrite(D, HIGH);
    }
} 

Converter decimal para binário (8bits)

saidas arduino para digito 7 segmentos

Existe a possibilidade de transferir diretamente o valor binário para as saídas, aqui fica um exemplo de contador cíclico de zero a nove


int ledpins[] = {4,5,6,7,8,9,10,11};
byte digits[] = {B11111100,B01100000,B11011010, B11110010,B01100110,B10110110,
B10111110,B11100000,B11111110,B11110110};

void setup()
{
  for (int i =0;i<8;i++)
  {
    pinMode(ledpins[i],OUTPUT);
    digitalWrite(ledpins[i], HIGH);
  } 
}


void loop()
{
  for (int i =0;i<10;i++)
  {
    displayDigit(i);
    delay(1000);
    alloff();
    delay(500);
  }   
}

void displayDigit(int digit)
{
  for (int i =0;i<8;i++)
  {
    digitalWrite(ledpins[i],!bitRead(digits[digit],7-i));
  } 
}

void alloff()
{
  for (int i =0;i<8;i++)
  {
    digitalWrite(ledpins[i], HIGH);
  }  
}

Neste caso não se usaram as saídas BCD mas sim um código binário direto nos 8 bits (um por cada led ligado)

Foi usado um nível 1(HIGH) quando o segmento acende e 0 (LOW) quando apagado. O último dígito é sempre um 0 representa o ponto decimal que não está a ser usado.

O procedimento AllOff () desliga todos os dígitos invertendo o pino comum.

displayDigit () liga o segmento certo para cada dígito. A função bitread lê os bits do número binário, começando com o bit mais à direita. É por isso que o 7-i é usado. Quando utilizar a instrução digitalWrite (), podemos escrever 1 quando queremos ALTA e um 0 quando queremos LOW. Este é o oposto de como os nossos números binários estão a funcionar. O operador ! inverte o valor.

Ligar vários Led 7 segmentos

Se pretendermos ligar LED de 7 segmentos individualmente não temos saídas no arduino. O processo usado é, no caso de múltiplos dígitos, acender um de cada vez mas a uma velocidade tão grande que os nossos olhos nem percebem que um digito apagou e acendeu outro.

multiplexing
Atuando 3 dígitos - Multiplexing

Ligam-se os leds em paralelo e uma porta de saída atuará em cada um deles individualmente, como mostram as ligações na figura.

arduino controlando 5 leds 7 segmentos
Atuando 3 dígitos com o arduino

Cada display pode potencialmente ligar oito LEDs de uma só vez, o que pode levar a um consumo de 160 mA (a 20 mA por LED) muito mais do que um pino de saída digital pode suportar. Por esta razão, usamos um transistor que é ligado por uma saída digital. O tipo de transistor que estamos a usar é chamado de transistor bipolar que tem três pinos: emissor, base e coletor. Quando uma corrente flui através da base do transistor o led acende.
Os transistores de silício têm uma propriedade interessante, ligados em emissor comum (emissor liga a massa), a tensão entre base e emissor é de aproximadamente 0,7 Volt não importando que a corrente seja maior ou menor. Assim, se o arduino tem 5V na saída, 0,7V entre a base e emissor e a corrente de base (usando um transistor BC548) é de aproximadamente 4mA para que conduza, usamos a lei de ohm
RT=V/I
RT= (5-0.7)/0.004= 1100 =1.1K

Podemos usar um resistor de 1K que se encontra dentro da tolerância aceitável.
Usamos o mesmo processo para calcular o resistor que liga diretamente ao led, se cada led precisa de 1,8V e consome 15mA (varia com a cor e tipo de led, ver Funcionamento LED) teremos:
RD=V/I
V=5-1.8V=3.2V
RD=3.2/0.015=213.3

podemos usar um resistor de 220 Ω

Contador Mostrador

Este contador pode ser usado para contar ou simplesmente para mostrar valores diretamente nos leds de 7 segmentos, pode ser usado, por exemplo, para contar objetos, dar a leitura de temperatura. Neste caso utiliza-se uma lib externa (Multiplex7Seg.h) que se pode baixar aqui.

Arduino Counter Sketch


#include <Multiplex7Seg.h>

byte digitPins[] = {10, 11, 12};         // LSB to MSB
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8}; // Segmento A a G
unsigned int adc;

void setup() {
  Multiplex7Seg::set(1, 3, digitPins, segmentPins);   // Inicia
  // ver exemplos no ficheiro da lib Multiplex7Seg de exemplos de inicialização
}

void loop() {
  Multiplex7Seg::loadValue(millis() / 10);  //Mostra valor com o incremento 
  delay(247);
}

Artigos Relacionados