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.