Segment Dual Digit

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

Segundo a referência e de acordo com o datasheet, estamos perante um display de Cátodo Comum, ou seja, ambos os displays partilham os mesmos pinos cátodos (-).

Os pinos identificados como positivos em ambos os displays, têm de ser ligados com uma resistência ao (+) positivo, neste caso cada um vai para um pino do Arduino (através de um transístor), os outros pinos (cátodos) são ligados ao (-) negativo, também a pinos do Arduino. 

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

 

Datasheet deste display:

Segundo a imagem, os pinos identificados como Ânodos em cada display são o 10 para o primeiro e o 5 para o segundo.

Os restantes pinos são os Cátodos e são partilhados entre ambos os displays (3, 9, 8, 6, 7, 4, 1, 2).

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 3

Segmento B -> Pino 9

Segmento C -> Pino 8

Segmento D -> Pino 6

Segmento E -> Pino 7

Segmento F -> Pino 4

Segmento G -> Pino 1

Segmento DP -> Pino 2  (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 cátodo 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 'LOW' os seguintes pinos do Arduino: 

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

Os pinos identificados como Ânodos em ambos os displays são ligados a uma resistência de 220R e a um transistor (neste caso o BD137), que por sua vez está ligado ao Arduino:

>> Pino Ânodo do primeiro display (pino 10) liga assim à resistência e que pelo transistor está ligado ao pino 10 do Arduino.

>> Pino Ânodo do segundo display (pino 5) liga assim à resistência e que pelo transístor está ligado ao pino 11 do Arduino.

O transístor BD137:

Esquema de ligações utilizado:

Na parte do código de programação a utilizar existem vários exemplos, este que utilizei é muito básico e apenas acende um display de cada vez:

// Seven-segment LED Display

// Common CATHODE pins 5 and 10

// 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

// Common CATHODE;

// OFF when pin is high

// and ON when pin is LOW

#define ON LOW

#define OFF HIGH

int ms = 800;

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);

  digitalWrite(T1, LOW); 

  digitalWrite(T2, LOW); 

}

void loop() {

  

for (int digit1=0; digit1 < 100; digit1++) {

  digitalWrite(T2, LOW); 

  digitalWrite(T1, HIGH); 

  zero();

  one();

  two();

  three();

  four();

  five();

  six();

  seven();

  eight();

  nine();

  digitalWrite(T1, LOW); 

  digitalWrite(T2, HIGH); 

  zero();

  one();

  two();

  three();

  four();

  five();

  six();

  seven();

  eight();

  nine();

}

// 0 => ABCDEF

void zero() {

  digitalWrite(A, ON);

  digitalWrite(B, ON);

  digitalWrite(C, ON);

  digitalWrite(D, ON);

  digitalWrite(E, ON);

  digitalWrite(F, ON);

  digitalWrite(G, OFF);

  delay(ms);

}

// 1 => BC

void one() {

  digitalWrite(A, OFF);

  digitalWrite(B, ON);

  digitalWrite(C, ON);

  digitalWrite(D, OFF);

  digitalWrite(E, OFF);

  digitalWrite(F, OFF);

  digitalWrite(G, OFF);

  delay(ms);

}

// 2 => ABDEG

void two() {

  digitalWrite(A, ON);

  digitalWrite(B, ON);

  digitalWrite(C, OFF);

  digitalWrite(D, ON);

  digitalWrite(E, ON);

  digitalWrite(F, OFF);

  digitalWrite(G, ON);

  delay(ms);

}

// 3 => ABCDG

void three() {

  digitalWrite(A, ON);

  digitalWrite(B, ON);

  digitalWrite(C, ON);

  digitalWrite(D, ON);

  digitalWrite(E, OFF);

  digitalWrite(F, OFF);

  digitalWrite(G, ON);

  delay(ms);

}

// 4 => BCFG

void four() {

  digitalWrite(A, OFF);

  digitalWrite(B, ON);

  digitalWrite(C, ON);

  digitalWrite(D, OFF);

  digitalWrite(E, OFF);

  digitalWrite(F, ON);

  digitalWrite(G, ON);

  delay(ms);

}

// 5 => ACDFG

void five() {

  digitalWrite(A, ON);

  digitalWrite(B, OFF);

  digitalWrite(C, ON);

  digitalWrite(D, ON);

  digitalWrite(E, OFF);

  digitalWrite(F, ON);

  digitalWrite(G, ON);

  delay(ms);

}

// 6 => ACDEFG

void six() {

  digitalWrite(A, ON);

  digitalWrite(B, OFF);

  digitalWrite(C, ON);

  digitalWrite(D, ON);

  digitalWrite(E, ON);

  digitalWrite(F, ON);

  digitalWrite(G, ON);

  delay(ms);

}

// 7 => ABC

void seven() {

  digitalWrite(A, ON);

  digitalWrite(B, ON);

  digitalWrite(C, ON);

  digitalWrite(D, OFF);

  digitalWrite(E, OFF);

  digitalWrite(F, OFF);

  digitalWrite(G, OFF);

  delay(ms);

}

// 8 => ABCDEFG

void eight() {

  digitalWrite(A, ON);

  digitalWrite(B, ON);

  digitalWrite(C, ON);

  digitalWrite(D, ON);

  digitalWrite(E, ON);

  digitalWrite(F, ON);

  digitalWrite(G, ON);

  delay(ms);

}

// 9 => ABCDFG

void nine() {

  digitalWrite(A, ON);

  digitalWrite(B, ON);

  digitalWrite(C, ON);

  digitalWrite(D, ON);

  digitalWrite(E, OFF);

  digitalWrite(F, ON);

  digitalWrite(G, ON);

  delay(ms);

}

Para simplificar o código e usar ambos os displays em simultâneo, usei o seguinte:

//Refª http://www.theelectronicshobbyist.com/blog/2010/06/arduino-2-digit-7-segment-display-counter/

// Seven-segment LED Display

// Common CATHODE pins 5 and 10

// 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

// 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] = { 0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0010010,

0b0000010, 0b1111000, 0b0000000, 0b0010000 };

// Common CATHODE;

// OFF when pin is high

// and ON when pin is LOW

//#define ON LOW

//#define OFF HIGH

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);

  digitalWrite(T1, LOW); 

  digitalWrite(T2, LOW); 

}

void loop() {

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

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

      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);

        lightDigit2(numbers[digit2]);

        delay(5);

      }

    }

  }

}

void lightDigit1(byte number) {

  digitalWrite(T1, HIGH);

  digitalWrite(T2, LOW);

  lightSegments(number);

}

void lightDigit2(byte number) {

  digitalWrite(T1, LOW);

  digitalWrite(T2, 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 T2 10 //Transistor 2

#define T1 11 //Transistor 1

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

Definimos ainda os pinos 10 e 11 para os transístores (para os ânodos 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] = { 0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0010010,

0b0000010, 0b1111000, 0b0000000, 0b0010000 };

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= LIGA o 1= Desliga (isto porque o display é de Cátodo comum).

Exemplo:  Para o segmento 0b0010000 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.