Para obter informações do Arduino sem precisar ligá-lo a um computador, é comum utilizar interfaces como o display de 4×7 segmentos. Veremos neste tutorial como conectar e programar o Arduino para exibir informações no display.
É possível conectar o display de 7 segmentos diretamente aos pinos do Arduino. Para manter os pinos livres para outras funcionalidades, utilizamos um registrador de deslocamento 74HC595.
Material
- Computador
- Arduino UNO
- Display de 4×7 segmentos
- Registrador de deslocamento 74HC595
- Cabo Dupont
- Placa de ensaio (breadboard)
Princípio de funcionamento
O display de 7 segmentos consiste numa série de LEDs posicionados para formar números. Os LEDs são controlados por meio dos pinos do display (1 – 12).

Os conjuntos de LEDs ou dígitos são ativados através dos pinos D1, D2, D3 e D4. Os LEDs são acesos através dos pinos A, B, C, D, E, F e G, e DP para o ponto decimal.

Existem dois tipos de displays, com cátodo comum (série A para alto) ou com anodo comum (série B para baixo). Para a série com anodos, é necessário ligar o comum ao pino 5V para ativar o dígito e passar o pino para o estado BAIXO para acender um LED. No caso de um cátodo comum, é necessário ligar o comum à terra e mudar o pino para o estado ALTO para ligar o LED.

Verifique bem o modelo que tem em mãos. Neste tutorial, utilizamos o display de 4×7 segmentos 5461BS com anodo comum.
Esquema
Utilizamos um registrador de deslocamento 74HC595, cujas saídas Q0-6 e Q7 estão ligadas, respectivamente, às entradas A-F e DP do display,

Código
#define NUM_OF_DIGITS 4
int latch = 4; //74HC595 pin 9 STCP
int cs = 5; //74HC595 pin 10 SHCP
int data = 3; //74HC595 pin 8 DS
int dPins[4] = {11, 10, 9, 8};
// DP G F E D C B A
//0: 1 1 0 0 0 0 0 0 0xc0
//1: 1 1 1 1 1 0 0 1 0xf9
//2: 1 0 1 0 0 1 0 0 0xa4
//3: 1 0 1 1 0 0 0 0 0xb0
//4: 1 0 0 1 1 0 0 1 0x99
//5: 1 0 0 1 0 0 1 0 0x92
//6: 1 0 0 0 0 0 1 0 0x82
//7: 1 1 1 1 1 0 0 0 0xf8
//8: 1 0 0 0 0 0 0 0 0x80
//9: 1 0 0 1 0 0 0 0 0x90
unsigned char table[] =
{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
void setup() {
Serial.begin(115200);
pinMode(latch, OUTPUT);
pinMode(cs, OUTPUT);
pinMode(data, OUTPUT);
for (int j = 0; j < NUM_OF_DIGITS; j++) pinMode(dPins[j], OUTPUT);
}
void loop() {
//Count from 0 to 9 on each digit
for (int i = 0; i < NUM_OF_DIGITS; i++) {
for (int j = 0; j < 10; j++) {
Display(i, j);
delay(500);
Serial.println(j);
}
delay(500);
}
}
void Display(int id, unsigned char num)
{
digitalWrite(latch, LOW);
shiftOut(data, cs, MSBFIRST, table[num]);
digitalWrite(latch, HIGH);
for (int j = 0; j < NUM_OF_DIGITS; j++) digitalWrite(dPins[j], LOW);
digitalWrite(dPins[id], HIGH);
}
Uma vez carregado o código, o display deve contar de 0 a 9 em cada dígito.
Bônus: exibição em 4 dígitos
A fim de exibir um número com 4 dígitos, iremos converter este número em 4 dígitos da base 10 usando as seguintes instruções:
number = k;
for (int i = 0; i < NUM_OF_DIGITS; i++)
{
digit_data[i] = number % 10;
number /= 10;
}
Também utilizaremos a função millis() para assegurar que a exibição se atualize corretamente.
#define NUM_OF_DIGITS 4
int latch = 4; //74HC595 pin 9 STCP
int cs = 5; //74HC595 pin 10 SHCP
int data = 3; //74HC595 pin 8 DS
int dPins[4] = {11, 10, 9, 8};
// DP G F E D C B A
//0: 1 1 0 0 0 0 0 0 0xc0
//1: 1 1 1 1 1 0 0 1 0xf9
//2: 1 0 1 0 0 1 0 0 0xa4
//3: 1 0 1 1 0 0 0 0 0xb0
//4: 1 0 0 1 1 0 0 1 0x99
//5: 1 0 0 1 0 0 1 0 0x92
//6: 1 0 0 0 0 0 1 0 0x82
//7: 1 1 1 1 1 0 0 0 0xf8
//8: 1 0 0 0 0 0 0 0 0x80
//9: 1 0 0 1 0 0 0 0 0x90
unsigned char table[] =
{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
int digit_data[NUM_OF_DIGITS] = {0};
unsigned int number = 0;
unsigned long previousUpdate = 0, updateTime = 200;
void setup() {
Serial.begin(115200);
pinMode(latch, OUTPUT);
pinMode(cs, OUTPUT);
pinMode(data, OUTPUT);
for (int j = 0; j < NUM_OF_DIGITS; j++) pinMode(dPins[j], OUTPUT);
}
void loop() {
//Count from 0 to 999 on each digit
unsigned int k = 0;
while (k < 1000) {
updateDigits();
if (millis() - previousUpdate > updateTime) {
k++;
previousUpdate = millis();
number = k;
Serial.print(k); Serial.print(" (");
for (int i = 0; i < NUM_OF_DIGITS; i++)
{
digit_data[i] = number % 10;
number /= 10;
Serial.print(digit_data[i]);
}
Serial.println(")");
}
}
}
void Display(int id, unsigned char num)
{
digitalWrite(latch, LOW);
shiftOut(data, cs, MSBFIRST, table[num]);
digitalWrite(latch, HIGH);
for (int j = 0; j < NUM_OF_DIGITS; j++) digitalWrite(dPins[j], LOW);
digitalWrite(dPins[id], HIGH);
}
void updateDigits() {
for (int j = 0; j < NUM_OF_DIGITS; j++)
{
Display(j, digit_data[j]);
delay(5);
}
}
O número deve aumentar a cada 200 milissegundos e ser afixado em todos os 4 dígitos.
Fontes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie