Segment 4 Digit

Ligação do Arduino a um display de 7 segmentos de 4 dígitos:

Segundo a referência e de acordo com o datasheet, estamos perante um display de Ânodo Comum, ou seja, ambos os displays partilham os mesmos pinos ânodos (+).

Os pinos identificados como negativos em ambos os displays, têm de ser ligados um a um a pinos do Arduino (através de um transístor), os outros pinos (ânodos) são ligados ao (+) positivo, também a pinos do Arduino. 

Imagens de exemplo de Ânodo e Cátodo comum:

 

Datasheet deste display:

Segundo a imagem, os pinos identificados como Cátodos em cada display são o 12 para o primeiro display, 9 para o segundo, 8 para o terceiro e o 6 para o quarto.

Os restantes pinos são os Ânodos e são partilhados entre ambos os displays (11, 7, 4, 2, 1, 10, 5, 3).

Começamos por identificar os pinos associados às letras, de acordo com o datasheet acima e com a imagem 'universal' dos displays de segmentos:

Temos então a seguinte correspondência (segmentos/pinos do nosso display):

Segmento A -> Pino 11

Segmento B -> Pino 7

Segmento C -> Pino 4

Segmento D -> Pino 2

Segmento E -> Pino 1

Segmento F -> Pino 10

Segmento G -> Pino 5

Segmento DP -> Pino 3  (não vai ser usado neste projecto)

Temos também como indicação 'universal' os segmentos que temos de utilizar consoante os números a apresentar, pois basta olhar para a imagem dos 7 segmentos:

Número 0 => ABCDEF

Número 1 => BC

Número 2 => ABDEG

Número 3 => ABCDG

Número 4 => BCFG

Número 5 => ACDFG

Número 6 => ACDEFG

Número 7 => ABC

Número 8 => ABCDEFG

Número 9 => ABCDFG

De seguida ligamos os pinos ânodo do display ao Arduino, neste caso os pinos do Arduino escolhidos foram:

Temos de ter em atenção que para acender por exemplo o número Zero, precisamos de colocar em 'HIGH' os seguintes pinos do Arduino: 

Pino4, Pino9, Pino8, Pino6, Pino7, Pino4 (0=ABCDEF)

Os pinos identificados como Cátodos em ambos os displays são ligados a um transistor (neste caso o BD137), que por sua vez está ligado ao Arduino:

>> Pino Cátodo do primeiro display (pino 12) liga assim ao transistor que está ligado ao pino 10 do Arduino.

>> Pino Cátodo do segundo display (pino 9) liga assim ao transístor está ligado ao pino 11 do Arduino.

>> Pino Cátodo do terceiro display (pino 8) liga assim ao transístor está ligado ao pino 12 do Arduino.

>> Pino Cátodo do quarto display (pino 6) liga assim ao transístor está ligado ao pino 3 do Arduino.

O transístor BD137:

Esquema de ligações utilizado:

Código utilizado no Arduino para testar display:

// Seven-segment LED Display

// Common ANODE pins 6, 8, 9, 12

// Segments that make each number when lit:

// 0 => ABCDEF

// 1 => BC

// 2 => ABDEG

// 3 => ABCDG

// 4 => BCFG

// 5 => ACDFG

// 6 => ACDEFG

// 7 => ABC

// 8 => ABCDEFG

// 9 => ABCDFG

// Arduino digital pins used to light up

// corresponding segments on the LED display

#define A 4

#define B 9

#define C 8

#define D 6

#define E 7

#define F 5

#define G 2

#define T1 10 //Transistor 1

#define T2 11 //Transistor 2

#define T3 12 //Transistor 3

#define T4 3  //Transistor 4

// Pins for A B C D E F G, in sequence

const int segs[7] = {4, 9, 8, 6, 7, 5, 2};

// Segments that make each number

const byte numbers[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101,

0b1111101, 0b0000111, 0b1111111, 0b1101111 };

// Common ANODE;

// ON when pin is high

// and OFF when pin is LOW

//#define ON HIGH

//#define OFF LOW

void setup() {

  pinMode(A, OUTPUT);

  pinMode(B, OUTPUT);

  pinMode(C, OUTPUT);

  pinMode(D, OUTPUT);

  pinMode(E, OUTPUT);

  pinMode(F, OUTPUT);

  pinMode(G, OUTPUT);

  pinMode(T1, OUTPUT);

  pinMode(T2, OUTPUT);

  pinMode(T3, OUTPUT);

  pinMode(T4, OUTPUT);

  digitalWrite(T1, LOW); 

  digitalWrite(T2, LOW); 

  digitalWrite(T3, LOW); 

  digitalWrite(T4, LOW); 

}

void loop() {

  for (int digit1=0; digit1 < 10; digit1++) { // DISPLAY 1

       unsigned long startTime = millis();

      for (unsigned long elapsed=0; elapsed < 400; elapsed = millis() - startTime) {   //rapidez na passagem dos números/ incremento

        lightDigit1(numbers[digit1]);

        delay(5);

        }

    }

    

     for (int digit2=0; digit2 < 10; digit2++) {  // DISPLAY 2

      unsigned long startTime = millis();

      for (unsigned long elapsed=0; elapsed < 400; elapsed = millis() - startTime) {   //rapidez na passagem dos números/ incremento

          lightDigit2(numbers[digit2]);

        delay(5);

      }

     }

     

       for (int digit3=0; digit3 < 10; digit3++) {  // DISPLAY 3

      unsigned long startTime = millis();

      for (unsigned long elapsed=0; elapsed < 400; elapsed = millis() - startTime) {   //rapidez na passagem dos números/ incremento

          lightDigit3(numbers[digit3]);

        delay(5);

      }

     }

     

       for (int digit4=0; digit4 < 10; digit4++) { // DISPLAY 4

      unsigned long startTime = millis();

      for (unsigned long elapsed=0; elapsed < 400; elapsed = millis() - startTime) {   //rapidez na passagem dos números/ incremento

          lightDigit4(numbers[digit4]);

        delay(5);

      }

     }

     

     

     

       for (int digit=0; digit < 10; digit++) {  // DISPLAY 1 + 2 + 3 + 4

      unsigned long startTime = millis();

      for (unsigned long elapsed=0; elapsed < 500; elapsed = millis() - startTime) {   //rapidez na passagem dos números/ incremento

         lightDigit1(numbers[digit]);

        delay(5);

          lightDigit2(numbers[digit]);

        delay(5);

        lightDigit3(numbers[digit]);

        delay(5);

        lightDigit4(numbers[digit]);

        delay(5);

      }       

        }

        

        

}

void lightDigit1(byte number) {

  digitalWrite(T1, HIGH);

  digitalWrite(T2, LOW);

  digitalWrite(T3, LOW);

  digitalWrite(T4, LOW);

  lightSegments(number);

}

void lightDigit2(byte number) {

  digitalWrite(T1, LOW);

  digitalWrite(T2, HIGH);

  digitalWrite(T3, LOW);

  digitalWrite(T4, LOW);

  lightSegments(number);

}

void lightDigit3(byte number) {

  digitalWrite(T1, LOW);

  digitalWrite(T2, LOW);

  digitalWrite(T3, HIGH);

  digitalWrite(T4, LOW);

  lightSegments(number);

}

void lightDigit4(byte number) {

  digitalWrite(T1, LOW);

  digitalWrite(T2, LOW);

  digitalWrite(T3, LOW);

  digitalWrite(T4, HIGH);

  lightSegments(number);

}

void lightSegments(byte number) {

  for (int i = 0; i < 7; i++) {

    int bit = bitRead(number, i);

    digitalWrite(segs[i], bit);

  }

}

Explicação de algumas partes deste último código:

#define A 4

#define B 9

#define C 8

#define D 6

#define E 7

#define F 5

#define G 2

#define T1 10 //Transistor 1

#define T2 11 //Transistor 2

#define T3 12 //Transistor 3

#define T4 3  //Transistor 4

Associar variáveis (correspondentes aos segmentos do display) aos pinos utilizados no Arduino. 

Definimos ainda os pinos 10, 11, 12 e 3 para os transístores (para os cátodos dos displays).

// Pins for A B C D E F G, in sequence

const int segs[7] = {4, 9, 8, 6, 7, 5, 2};

Criamos um array de 7 elementos com os pinos identificados anteriormente seguindo a sequência A B C D E F G

// Segments that make each number

const byte numbers[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101,

0b1111101, 0b0000111, 0b1111111, 0b1101111 };

Pode parecer complicado mas não é, criamos um array de 10 elementos e cada um associado a um número de 0 a 9, para enviar em código binário temos de colocar 0b e de seguida colocamos a sequência pretendida de 0´s e 1´s (sequência de 7 elementos associada aos pinos que precisamos de ligar/desligar). Neste caso caso 0= DESLIGA o 1= LIGA (isto porque o display é de Ânodo comum).

Exemplo:  Para o segmento 0b1101111 e de acordo com a seguinte correspondência 0bGFEDCBA, os pinos que se vão ligar são o ABCDFG, ou seja, os pinos 4,9,8,6,5,2 do Arduino e que resulta no número 9.