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.