Experimento 35 (extra) – Usando displays de 7 segmentos

Material:

  • 2 displays de 7 segmentos de catodo comum (HS 5101A). Pode-se usar displays de anodo comum também (HS5101B), neste caso é preciso inverter a lógica dos pinos no Arduino e ligar o anodo comum no positivo (5V).
  • 14 resistores de 220 ohms
  • 1 Arduino Nano
  • Protoboard, fios e jumpers

Podemos exibir as informações numéricas obtidas por sensores usando um display LCD ou de LEDs. Existem vários tipos. Entre os mais populares em projetos Arduino estão displays OLED (exibem desenhos e cores) displays Nokia 5110, displays LCD com 2 ou 4 linhas e 16 colunas, e displays de LED com 7 segmentos (foto).

Para os displays mais simples, como o de 7 segmentos, a conexão ao Arduino é geralmente feita em paralelo, individualmente para cada LED e requer muitos fios (usa quase todos os pinos digitais). A solução é usar um circuito intermediário (multiplexador, registrador de deslocamento, etc.) para codificar os dados de forma serial, diminuindo o uso dos pinos.

Neste experimento vamos simplesmente conectar dois displays de LED de sete segmentos ao Arduino e fazê-los exibir números. Para isto, acessaremos cada LED do display individualmente e usaremos 14 pinos. O Arduino possui 14 pinos digitais, mas três deles devem ser evitados:

  • O pino 0, porque é também usado para receber dados (RX). Ele pode ser usado, mas para que o upload seja possível ele precisa ser desligado (apenas durante o upload). Este pino também possui um LED ligado diretamente a ele, que irá roubar parte da corrente que alimenta o LED do display.
  • O pino 1, porque é usado para transmitir dados (TX). Ele pode ser usado, mas se houver transmissão de dados (por exemplo, uso do monitor Serial) ele também irá roubar corrente do display (fazendo o LED acender mais fraco ou piscar durante a transmissão). Ele também tem um LED na placa que acende durante a transmissão.
  • O pino 13, porque ele tem um LED na placa diretamente ligado a ele que precisará compartilhar corrente com o LED do display.

Uma vez programado o Arduino, e desligado do computador, os pinos 0 e 1 podem ser usados normalmente, mas para simplificar este projeto, iremos usar outros pinos.

O Arduino Nano possui 8 pinos analógicos (A0 a A7), 6 dos quais podem ser usados como pinos digitais (A0 a A5) referenciados pelos números 14 a 19. Portanto, neste projeto, em vez de usar os pinos 0 e 1, usaremos 14 e 15, respectivamente, e trocaremos o pino 13 pelo pino 16.

Os pinos a-g do display correspondem ao anodo de cada LED, que é ligado ao positivo (ligamos aos pinos de saída do Arduino, que acenderão cada LED com um nível lógico HIGH). O último pino do display é o ponto decimal. Os catodos de todos os LEDs estão interligados e podem ser ligados ao negativo através do pino central em qualquer um dos lados do display. Experimente acender LEDs individuais ligando uma mini bateria CR2032 (3V) entre o catodo comum e outro terminal do display.

Neste experimento não usaremos o LED do ponto decimal. O esquema das conexões está ilustrado abaixo, usando resistores de 220 ohms para ligar cada LED.

O display usado (HS-5101) consome no máximo 80mA (isto varia bastante e depende do tamanho do display – displays gigantes consomem vários amperes), mas consideramos os valores nominais de cada LED para calcular os resistores (a corrente recomendada é de 12mA, e máxima de 20mA). Assim, para displays de LEDs vermelhos ou amarelos (HS5101AS ou AY), a tensão direta em cada LED é de 2,0V e valor seria 250 ohms. Para displays de LEDs verdes ou azuis (HS5101AG ou AB) a tensão é 3,0V e usaríamos 170 ohms. Usamos um valor médio (220 ohms) que garante uma corrente abaixo da máxima e próxima da recomendada independente do modelo usado.

Pode-se calcular apenas um resistor para o catodo comum, mas isto irá fazer causar alterações de brilho entre dígitos diferentes (1, que usa apenas 2 LEDs e 8 que usa 2 LEDs, por exemplo). Isto foi feito no experimento 23.

Uma possível implementação com o protoboard está ilustrada abaixo. A maior complexidade deste circuito são a grande quantidade de fios. Verifique as conexões com cuidado, e se preferir, posicione os displays mais afastados. Use o esquema para verificar as ligações.

Teste das conexões

Para testar cada LED digite o programa abaixo no IDE do Arduino e faça upload. Ele configura 14 pinos como OUTPUT e depois faz com que cada LED acenda em sequência.

void setup() {
   // Define cada pino (2 a 16, exceto 13 )como saida
   for(int i = 2; i < 17; i++) {
      if(i != 13) {
          pinMode(i, OUTPUT);
      }
   }
   teste();  // roda o teste abaixo uma vez
}

// testa os leds acendendo-os e depois apagando-os
void teste() {
   for(int i = 2; i < 17; i++) {
       if(i != 13) {
           digitalWrite(i, HIGH);
           delay(500);
       }
   }
   for(int i = 2; i < 17; i++) {
       if(i != 13) {
           digitalWrite(i, LOW);
           delay(500);
       }
   }
}

void loop() {}

O próximo passo é configurar os LEDs de maneira a desenhar números.

Contando até 99

Para desenhar os números precisamos acender determinados LEDs ao mesmo tempo. O Arduino precisa fornecer nível HIGH para cada LED que deve acender. A tabela abaixo relaciona o estado (HIGH ou LOW) nos pinos a-g para desenhar cada dígito de 0-9:

dígito a b c d e f g
0 HIGH HIGH HIGH HIGH HIGH HIGH LOW
1 LOW HIGH HIGH LOW LOW LOW LOW
2 HIGH HIGH LOW HIGH HIGH LOW HIGH
3 HIGH HIGH HIGH HIGH LOW LOW HIGH
4 LOW HIGH HIGH LOW LOW HIGH HIGH
5 HIGH LOW HIGH HIGH LOW HIGH HIGH
6 HIGH LOW HIGH HIGH HIGH HIGH HIGH
7 HIGH HIGH HIGH LOW LOW LOW LOW
8 HIGH HIGH HIGH HIGH HIGH HIGH HIGH
9 HIGH HIGH HIGH HIGH LOW HIGH HIGH

O programa abaixo declara uma matriz 10 x 7 (vetor bidimensional) contendo cada um dos 10 dígitos associados a uma lista de segmentos contendo seu estado (HIGH ou LOW). Através dela poderemos mapear pinos do Arduino a cada LED individualmente. Contém também duas listas de 7 elementos (vetores) contendo os valores dos pinos Arduino usados em cada display.

int unidades[] = {14, 15, 2, 3, 4, 5, 6};
int dezenas[] = {7, 8, 9, 10, 11, 12, 16};

static int digito[10][7] = {
   {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,LOW},
   {LOW,HIGH,HIGH,LOW,LOW,LOW,LOW},
   {HIGH,HIGH,LOW,HIGH,HIGH,LOW,HIGH},
   {HIGH,HIGH,HIGH,HIGH,LOW,LOW,HIGH},
   {LOW,HIGH,HIGH,LOW,LOW,HIGH,HIGH},
   {HIGH,LOW,HIGH,HIGH,LOW,HIGH,HIGH},
   {HIGH,LOW,HIGH,HIGH,HIGH,HIGH,HIGH}, 
   {HIGH,HIGH,HIGH,LOW,LOW,LOW,LOW}, 
   {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH}, 
   {HIGH,HIGH,HIGH,HIGH,LOW,HIGH,HIGH}
};

const int DISPLAY_LEDS = 7;
const int DISPLAY_DIGITS = 10;
 
void setup() {
    for(int i = 0; i < DISPLAY_LEDS; i++) {
       pinMode(dezenas[i], OUTPUT);
       pinMode(unidades[i], OUTPUT);
    }
}

void acende(int* disp, int dig) {
    for(int i = 0; i < DISPLAY_LEDS; i++) {
       digitalWrite(disp[i], digito[dig][i]);
    }
}

void loop() {
    for(int j = 0; j < DISPLAY_DIGITS; j++) {
       acende(dezenas, j);
       for(int i = 0; i < DISPLAY_DIGITS; i++) {
          acende(unidades, i);
          delay(500);
       } 
    }
}

O setup() configura cada pino de cada display como OUTPUT, para que o Arduino possa fornecer saída de 0 a 5V.

A função acende() recebe como argumentos um display (array unidades ou dezenas) e um dígito e passa por cada LED gravando HIGH ou LOW, dependendo da linha da matriz 10×7 correspondente ao dígito a desenhar. O loop() chama acende para o display dezenas e unidades, contando de 00 a 99.

Para reiniciar a contagem, aperte o botão reset do Arduino.

Leave a Reply

Your email address will not be published. Required fields are marked *