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