Componentes · 6 min de leitura

Como usar um display de 7 segmentos: mostrando números com Arduino, ânodo comum vs cátodo comum

Como funciona um display de 7 segmentos? Letras dos segmentos (a–g, dp), cátodo comum vs ânodo comum, pinagem e resistores, código para contar de 0 a 9, displays de 4 dígitos e multiplexação, o módulo TM1637, ESP32 e Pico.

Um display de 7 segmentos é um indicador simples formado por sete LEDs em forma de barra, dispostos como o número "8", mais um pequeno ponto. Relógios digitais, timers de micro-ondas, placares e bombas de combustível usam esse display. Ele é barato, muito brilhante e fácil de ler mesmo de longe. Em projetos com Arduino, é uma das saídas clássicas para montar contadores, dados, cronômetros e relógios.

Display de 7 segmentos de um dígito
Display de 7 segmentos de um dígito: sete segmentos em barra e um ponto (dp); ele tem 10 pinos, cinco embaixo e cinco em cima.

Como funciona um display de 7 segmentos?

Os segmentos são identificados por letras: começando pelo a, em cima, e seguindo no sentido horário vêm o b (em cima à direita), o c (embaixo à direita), o d (embaixo), o e (embaixo à esquerda) e o f (em cima à esquerda); a barra do meio é o g e o ponto é o dp. Cada segmento é, na verdade, um LED separado, e dígitos diferentes se formam conforme os segmentos que estão acesos. Para o "1", por exemplo, só o b e o c acendem, enquanto o "8" acende os sete.

DígitoSegmentos acesos
0a, b, c, d, e, f
1b, c
2a, b, d, e, g
3a, b, c, d, g
4b, c, f, g
5a, c, d, f, g
6a, c, d, e, f, g
7a, b, c
8a, b, c, d, e, f, g
9a, b, c, d, f, g

Cátodo comum ou ânodo comum?

Assim como em um LED RGB, uma das pontas de todos os segmentos é unida em um pino comum. Em um display de cátodo comum, o pino comum vai no GND e um segmento acende quando você dá HIGH para ele. Em um display de ânodo comum, o pino comum vai no 5V e um segmento acende quando você dá LOW. Por fora eles parecem iguais; para descobrir qual é o seu, ligue o pino comum no GND e encoste um pino de segmento no 5V através de um resistor de 220 Ω. Se o segmento acender, é de cátodo comum; se não, inverta a ligação e tente de novo.

CaracterísticaCátodo comum (CC)Ânodo comum (CA)
Pino comum (3 e 8)GND5V
Para acender um segmentoHIGHLOW
No códigodigitalWrite(pino, aceso)digitalWrite(pino, !aceso)

Pinagem e ligação no Arduino

Nos displays comuns de um dígito com 10 pinos, os pinos são numerados no sentido anti-horário a partir do canto inferior esquerdo, com a frente do display virada para você. Os dois pinos do meio (3 e 8) são o terminal comum e estão ligados entre si por dentro. A tabela abaixo mostra os pinos do display e os pinos do Arduino usados pelo código deste post:

Pino do displaySegmentoPino do Arduino
7aD2
6bD3
4cD4
2dD5
1eD6
9fD7
10gD8
5dpD9
3 e 8ComumGND (cátodo comum) ou 5V (ânodo comum)
Dê a cada segmento o seu próprio resistor (220–330 Ω com 5 V). Se você colocar um único resistor no pino comum, a corrente é dividida entre os segmentos acesos: o "1" parece muito forte e o "8" parece fraco. Para calcular o valor do resistor, use a calculadora de resistor para LED.

Contando de 0 a 9 com o Arduino

Guardar em um array, como bits, quais segmentos cada dígito acende deixa o código curto. No exemplo abaixo, o bit mais à esquerda de cada byte é o segmento a e o bit mais à direita é o segmento g. A função showDigit() lê esses bits um por um e os escreve nos pinos; se você estiver usando um display de ânodo comum, basta definir COMMON_ANODE como true.

C++ (Arduino IDE)
1const int SEG_PINS[7] = {2, 3, 4, 5, 6, 7, 8};   // a, b, c, d, e, f, g
2const bool COMMON_ANODE = false;                 // ortak anotsa true / true for common anode
3
4// her rakam için a–g segmentleri (1 = yanar) / a–g segments per digit (1 = on)
5const byte DIGITS[10] = {
6  0b1111110, // 0
7  0b0110000, // 1
8  0b1101101, // 2
9  0b1111001, // 3
10  0b0110011, // 4
11  0b1011011, // 5
12  0b1011111, // 6
13  0b1110000, // 7
14  0b1111111, // 8
15  0b1111011  // 9
16};
17
18void showDigit(int n) {
19  for (int i = 0; i < 7; i++) {
20    bool on = DIGITS[n] & (1 << (6 - i));       // a en soldaki bit / a is the leftmost bit
21    digitalWrite(SEG_PINS[i], COMMON_ANODE ? !on : on);
22  }
23}
24
25void setup() {
26  for (int i = 0; i < 7; i++) pinMode(SEG_PINS[i], OUTPUT);
27}
28
29void loop() {
30  for (int n = 0; n <= 9; n++) {
31    showDigit(n);
32    delay(1000);
33  }
34}
Acrescente um botão a esse código e você pode montar um contador que sobe um a cada toque, ou um dado eletrônico que mostra um número aleatório. A ligação do botão e o efeito bounce são explicados em Como ligar um botão no Arduino.

Displays de 4 dígitos e multiplexação

Display de 7 segmentos de 4 dígitos
Display de 7 segmentos de 4 dígitos: as 8 linhas de segmento são compartilhadas pelos quatro dígitos, e cada dígito também tem o seu próprio pino de seleção; são 12 pinos no total.

Um display de quatro dígitos não tem 32 pinos de segmento separados; ele tem só 12 pinos: 8 linhas de segmento (a–g e dp) compartilhadas por todos os dígitos e 4 pinos que escolhem qual dígito acende. Como as linhas de segmento são compartilhadas, você não consegue mostrar números diferentes em dígitos diferentes no mesmo instante. A solução é a multiplexação: você acende só o 1º dígito por alguns milissegundos, depois o 2º, o 3º e o 4º. Quando esse ciclo se repete mais de 50 vezes por segundo, o olho vê os quatro dígitos acesos ao mesmo tempo. Em vez de escrever essa varredura à mão, é muito mais fácil usar a biblioteca SevSeg:

C++ (Arduino IDE)
1#include "SevSeg.h"
2
3SevSeg sevseg;
4
5void setup() {
6  byte digitPins[] = {2, 3, 4, 5};                    // hane seçme pinleri / digit select pins
7  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};  // a, b, c, d, e, f, g, dp
8  sevseg.begin(COMMON_CATHODE, 4, digitPins, segmentPins, true);  // dirençler segmentlerde / resistors on segments
9  sevseg.setBrightness(90);
10}
11
12void loop() {
13  sevseg.setNumber(millis() / 1000);   // geçen saniye / elapsed seconds
14  sevseg.refreshDisplay();             // sürekli çağrılmalı / must be called continuously
15}
Não use delay() dentro do loop() com um display multiplexado. A varredura para e só o último dígito fica aceso. Faça a temporização com millis() e garanta que refreshDisplay() seja chamado o tempo todo.

O módulo TM1637: 4 dígitos com apenas 2 fios

Módulo display de 7 segmentos de 4 dígitos TM1637
Módulo TM1637: o chip controlador interno faz a varredura; ele é ligado com apenas 4 pinos: CLK, DIO, VCC e GND.

Se 12 fios e uma varredura constante parecem trabalho demais, o módulo TM1637 é para você. O chip controlador dele faz a multiplexação sozinho; o Arduino só diz qual número mostrar pelos pinos CLK e DIO. A maioria das versões também tem dois-pontos (:) no meio, para montar relógios. Instale a biblioteca TM1637 de Avishay Orpaz pelo Gerenciador de Bibliotecas; o código abaixo mostra minutos e segundos com os dois-pontos:

C++ (Arduino IDE)
1#include <TM1637Display.h>
2
3TM1637Display display(2, 3);   // CLK, DIO
4
5void setup() {
6  display.setBrightness(5);    // 0–7
7}
8
9void loop() {
10  int minutes = (millis() / 60000) % 60;
11  int seconds = (millis() / 1000) % 60;
12  // ortadaki iki noktayla dakika:saniye / minutes:seconds with the colon
13  display.showNumberDecEx(minutes * 100 + seconds, 0b01000000, true);
14  delay(200);
15}

Displays de 7 segmentos com o ESP32 e o Raspberry Pi Pico

Você pode ligar um display de um dígito direto em um ESP32 ou Pico; como os pinos têm saída de 3,3 V, os segmentos ficam um pouco mais fracos, então use resistores menores, como 100–150 Ω. O módulo TM1637 também funciona com 3,3 V e é usado no ESP32 com a mesma biblioteca do Arduino. No Pico com MicroPython, basta copiar para o Pico o arquivo tm1637.py (a biblioteca de mcauser):

MicroPython
1import tm1637
2from machine import Pin
3import time
4
5tm = tm1637.TM1637(clk=Pin(16), dio=Pin(17))   # tm1637.py Pico'da olmalı / tm1637.py must be on the Pico
6tm.brightness(4)                               # 0–7
7
8count = 0
9while True:
10    tm.number(count)        # -999 … 9999
11    count += 1
12    time.sleep(1)

7 segmentos, LCD ou OLED?

Característica7 segmentosLCD 16x2OLED
O que consegue mostrarDígitos e algumas letrasLetras, dígitos, caracteres personalizadosTexto, gráficos, ícones
LegibilidadeMuito brilhante, legível de longeBoa com a luz de fundoAlto contraste, mas pequeno
Pinos necessários8 ou mais (2 com um TM1637)2 (I2C)2 (I2C)
Ideal paraRelógios, contadores, placaresMenus, textos de mediçãoGráficos, ícones, pequenos gadgets

Se você só precisa mostrar números e a leitura a distância importa, o display de 7 segmentos é imbatível. Se precisa de texto, unidades e menus, dê uma olhada em Como usar um display LCD I2C.

Ideias de projetos com display de 7 segmentos

  • Dado eletrônico: mostre um número aleatório de 1 a 6 quando um botão for apertado.
  • Contador com botão: faça um contador que sobe com um botão e zera com outro.
  • Relógio digital: um relógio com um TM1637 e um módulo RTC, que mantém a hora mesmo quando falta energia.
  • Contagem regressiva: um timer ajustável para jogos de tabuleiro ou experimentos.
  • Indicador de temperatura: mostre em dígitos grandes a temperatura medida com um DHT11.
  • Teste de reação: mostre em milissegundos a rapidez com que você aperta o botão depois que um LED acende.

Erros comuns e como resolvê-los

  • Nenhum segmento acende: o pino comum está no lugar errado; você pode ter ligado um display de ânodo comum no GND.
  • Os dígitos aparecem embaralhados: a correspondência entre os segmentos e os pinos do Arduino está errada; confira acendendo um segmento de cada vez.
  • Alguns dígitos ficam fracos: há um único resistor no pino comum; use um resistor separado para cada segmento.
  • Só um dígito acende ou fica piscando em um display de 4 dígitos: há um delay() no loop(), ou a varredura não acontece com a frequência necessária.
  • Os segmentos que deviam acender ficam apagados e os outros acendem: ânodo comum e cátodo comum estão trocados; mude o COMMON_ANODE.
  • Faltam pinos: reduza o número de pinos com um módulo TM1637, um driver MAX7219 ou um registrador de deslocamento 74HC595.

Saber que cada segmento é, na verdade, um LED é a chave para entender os displays de 7 segmentos; para o básico, dê uma olhada em O que é LED? No app BlueGrays você encontra projetos de contagem de 0 a 9, contador com botão, dado, relógio digital de 4 dígitos e animação de bomba passo a passo, com esquemas do circuito e código.

Perguntas frequentes

Que resistor devo usar com um display de 7 segmentos?

Com 5 V, 220–330 Ω por segmento é adequado; 220 Ω dá uma luz mais forte e 330 Ω puxa menos corrente. Em placas de 3,3 V, como o ESP32 e o Pico, você pode usar 100–150 Ω. Coloque os resistores em cada linha de segmento separadamente, e não no pino comum.

Como sei se o meu display de 7 segmentos é de ânodo comum ou de cátodo comum?

Ligue o pino comum (3 ou 8) no GND e encoste um pino de segmento no 5V através de um resistor de 220 Ω; se o segmento acender, é de cátodo comum. Se não, ligue o pino comum no 5V e o pino do segmento no GND através do resistor; se acender agora, é de ânodo comum. O código da peça normalmente também traz CC ou CA.

Quantos pinos tem um display de 7 segmentos?

Os displays de um dígito têm 10 pinos: 7 segmentos, 1 ponto e 2 pinos comuns. Os displays de quatro dígitos têm 12 pinos: 8 linhas de segmento compartilhadas e 4 pinos de seleção de dígito. Módulos como o TM1637 são ligados com apenas 4 pinos (CLK, DIO, VCC, GND).

Por que só um dígito acende no meu display de 4 dígitos?

Os displays de quatro dígitos funcionam por multiplexação, então os dígitos precisam ser varridos um depois do outro o tempo todo. Se você usa delay() no loop(), a varredura para e só o último dígito fica aceso. Use uma biblioteca como a SevSeg, chame refreshDisplay() continuamente e faça a temporização com millis().

Um display de 7 segmentos consegue mostrar letras?

Algumas letras, sim: A, b, C, d, E, F, H, L, P, U e o podem ser mostradas de forma reconhecível. Letras como K, M, W e X não podem ser desenhadas direito com sete segmentos. Se você precisa mostrar texto, um display LCD ou OLED é mais adequado.

Como posso acionar um display de 7 segmentos com menos pinos?

O jeito mais fácil é um módulo com chip controlador: o TM1637 aciona quatro dígitos com 2 fios e o MAX7219 aciona oito dígitos com 3. Se você quer montar seu próprio circuito, um registrador de deslocamento 74HC595 permite controlar 8 segmentos com apenas 3 pinos do Arduino.

Ver todos os projetos
Exibição de números de 0 a 9 em display de 7 segmentos
#41Intermediário
Premium

Exibição de números de 0 a 9 em display de 7 segmentos

Exiba você mesmo aqueles números conhecidos dos elevadores e relógios digitais. Em um display formado por sete pequenas barras luminosas, o Arduino mostra um dígito de 0 a 9 por segundo e depois recom

4.5(30)
43
Exibição de números de 0 a 99 em um display de 7 segmentos
#42Avançado
Premium

Exibição de números de 0 a 99 em um display de 7 segmentos

Um display de dois dígitos formado por pequenas barras, como os de calculadoras, conta de 0 a 99. O Arduino separa cada número em unidades e dezenas e acende as barras necessárias entre as sete de cad

4.5(27)
35
Contador com display de 7 segmentos e botões
#43Avançado
Premium

Contador com display de 7 segmentos e botões

Um contador simples com três botões: ao pressionar um deles, o algarismo no display aumenta em um; com outro, diminui em um; e o terceiro zera a contagem. O display de 7 segmentos de um dígito conta d

4.6(35)
47
Projeto de dado
#79Intermediário
Premium

Projeto de dado

Chega de perder o dado durante os jogos de tabuleiro: a cada toque no botão, um número aleatório de 1 a 6 aparece no display de 7 segmentos. Cada toque gera exatamente um resultado, que também aparece

5.0(48)
67
Exibição de 0 a 9.999 em display de 7 segmentos de 4 dígitos
#47Intermediário
Premium

Exibição de 0 a 9.999 em display de 7 segmentos de 4 dígitos

Em um display de quatro dígitos, os números passam rapidamente de 0 a 9.999 e depois recomeçam do zero. O Arduino cria uma ilusão de ótica para que os quatro dígitos pareçam acesos ao mesmo tempo: na

4.4(19)
25
Relógio digital com display de 7 segmentos de 4 dígitos
#48Intermediário
Premium

Relógio digital com display de 7 segmentos de 4 dígitos

Um relógio digital luminoso de quatro dígitos, parecido com o de um forno de cozinha. O módulo de relógio DS1302 mantém a hora e, a cada segundo, o Arduino lê as horas e os minutos e os exibe no displ

4.8(56)
73
Animação de bomba com display de 7 segmentos de 4 dígitos
#49Iniciante
Premium

Animação de bomba com display de 7 segmentos de 4 dígitos

A cena de bomba-relógio dos filmes na sua mesa, totalmente inofensiva: o display de 4 dígitos faz uma contagem regressiva a partir de 1:05, o buzzer emite um bipe a cada segundo e o LED vermelho pisca

4.8(63)
79
Display TM1637 de 4 dígitos e 7 segmentos com ESP32
#125Intermediário
Premium

Display TM1637 de 4 dígitos e 7 segmentos com ESP32

Vamos controlar um módulo de display de 4 dígitos e 7 segmentos com driver TM1637 usando um ESP32. Com apenas 2 pinos GPIO (CLK e DIO), executamos um contador de 0 a 9.999, ajustamos o nível de brilho e exibimos o caractere de dois-pontos (:) no centro, como em um relógio. Com a biblioteca TM1637Display, fica muito fácil controlar números, valores hexadecimais, segmentos e strings.

4.7(20)
32