Componenti · 6 min di lettura

Come usare un display a 7 segmenti: mostrare numeri con Arduino, anodo o catodo comune

Come funziona un display a 7 segmenti? Lettere dei segmenti (a–g, dp), catodo comune e anodo comune, piedinatura e resistenze, codice per contare da 0 a 9, display a 4 cifre e multiplexing, modulo TM1637, ESP32 e Pico.

Un display a 7 segmenti è un indicatore semplice formato da sette LED a barra disposti come il numero "8", più un piccolo punto. Lo usano gli orologi digitali, i timer dei microonde, i tabelloni segnapunti e i distributori di benzina. È economico, molto luminoso e si legge bene anche da lontano. Nei progetti Arduino è una delle uscite classiche per costruire contatori, dadi, cronometri e orologi.

Display a 7 segmenti a una cifra
Display a 7 segmenti a una cifra: sette segmenti a barra e un punto (dp); ha 10 pin, cinque sotto e cinque sopra.

Come funziona un display a 7 segmenti?

I segmenti si indicano con lettere: partendo dalla a in alto e procedendo in senso orario ci sono b (in alto a destra), c (in basso a destra), d (in basso), e (in basso a sinistra) ed f (in alto a sinistra); la barra centrale è la g e il punto è dp. Ogni segmento è in realtà un LED separato, e a seconda di quali si accendono si formano le diverse cifre. Per l'"1", per esempio, si accendono solo b e c; per l'"8" tutti e sette.

CifraSegmenti accesi
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

Catodo comune o anodo comune?

Come in un LED RGB, un'estremità di tutti i segmenti è collegata a un pin comune. In un display a catodo comune il pin comune va a GND e un segmento si accende quando riceve HIGH. In uno ad anodo comune il pin comune va al 5V e il segmento si accende con LOW. Dall'esterno sono identici; per capire quale hai, collega il pin comune a GND e tocca il 5V con un pin di segmento tramite una resistenza da 220 Ω. Se il segmento si accende è a catodo comune; se no, inverti il collegamento e riprova.

CaratteristicaCatodo comune (CC)Anodo comune (CA)
Pin comune (3 e 8)GND5V
Per accendere un segmentoHIGHLOW
Nel codicedigitalWrite(pin, acceso)digitalWrite(pin, !acceso)

Piedinatura e collegamento ad Arduino

Nei comuni display a una cifra con 10 pin, con il lato frontale rivolto verso di te, i pin sono numerati in senso antiorario partendo dal basso a sinistra. I due pin centrali (3 e 8) sono il terminale comune e sono collegati internamente. La tabella mostra sia i pin del display sia i pin di Arduino usati dal codice di questo articolo:

Pin del displaySegmentoPin di Arduino
7aD2
6bD3
4cD4
2dD5
1eD6
9fD7
10gD8
5dpD9
3 e 8ComuneGND (catodo comune) o 5V (anodo comune)
Dai a ogni segmento la sua resistenza (220–330 Ω a 5 V). Se metti una sola resistenza sul pin comune, la corrente si divide tra i segmenti accesi: l'"1" appare molto luminoso e l'"8" debole. Per calcolare il valore usa lo strumento Resistenza per LED.

Contare da 0 a 9 con Arduino

Salvare in un array, come bit, quali segmenti accende ogni cifra rende il codice molto più corto. Nell'esempio qui sotto il bit più a sinistra di ogni byte è il segmento a e quello più a destra il segmento g. La funzione showDigit() legge questi bit uno per uno e li scrive sui pin; se il tuo display è ad anodo comune, basta impostare COMMON_ANODE a true.

Arduino (C++)
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}
Aggiungendo un pulsante a questo codice puoi creare un contatore che aumenta di uno a ogni pressione, oppure un dado elettronico che mostra un numero casuale. Il collegamento del pulsante e il rimbalzo sono spiegati in Come collegare un pulsante ad Arduino.

Display a 4 cifre e multiplexing

Display a 7 segmenti a 4 cifre
Display a 7 segmenti a 4 cifre: le 8 linee dei segmenti sono condivise dalle quattro cifre e ogni cifra ha anche un proprio pin di selezione; 12 pin in totale.

Un display a quattro cifre non ha 32 pin di segmento, ma solo 12 pin: 8 linee di segmento (a–g e dp) condivise da tutte le cifre e 4 pin che scelgono quale cifra accendere. Dato che le linee sono condivise, non puoi mostrare numeri diversi su cifre diverse nello stesso istante. La soluzione è il multiplexing: accendi solo la 1ª cifra per qualche millisecondo, poi la 2ª, la 3ª e la 4ª. Quando questo ciclo si ripete più di 50 volte al secondo, l'occhio vede tutte e quattro le cifre accese insieme. Invece di scrivere a mano questa scansione, è molto più semplice usare la libreria SevSeg:

Arduino (C++)
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}
Non usare delay() dentro loop() con un display in multiplexing. La scansione si ferma e resta accesa solo l'ultima cifra. Gestisci i tempi con millis() e assicurati che refreshDisplay() venga chiamata di continuo.

Il modulo TM1637: 4 cifre con soli 2 fili

Modulo display a 7 segmenti TM1637 a 4 cifre
Modulo TM1637: il chip di controllo esegue la scansione; si collega con soli 4 pin: CLK, DIO, VCC e GND.

Se 12 fili e una scansione continua ti sembrano troppo lavoro, il modulo TM1637 fa per te. Il suo chip di controllo gestisce da solo il multiplexing; Arduino gli dice soltanto quale numero mostrare tramite i pin CLK e DIO. La maggior parte delle versioni ha anche i due punti (:) al centro per fare orologi. Installa dal Gestore librerie la libreria TM1637 di Avishay Orpaz; il codice qui sotto mostra minuti e secondi con i due punti:

Arduino (C++)
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}

Display a 7 segmenti con ESP32 e Raspberry Pi Pico

Puoi collegare un display a una cifra direttamente a un ESP32 o a un Pico; dato che i pin forniscono 3,3 V, i segmenti sono un po' meno luminosi, quindi usa resistenze più piccole, da 100–150 Ω. Anche il modulo TM1637 funziona a 3,3 V e sull'ESP32 si usa con la stessa libreria Arduino. Per MicroPython sul Pico basta copiare sul Pico il file tm1637.py (la libreria di 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 segmenti, LCD o OLED?

Caratteristica7 segmentiLCD 16x2OLED
Cosa può mostrareCifre e alcune lettereLettere, cifre, caratteri personalizzatiTesto, grafica, icone
LeggibilitàMolto luminoso, leggibile da lontanoBuona con la retroilluminazioneMolto contrastato ma piccolo
Pin necessari8 o più (2 con un TM1637)2 (I2C)2 (I2C)
Ideale perOrologi, contatori, tabelloniMenu, testo delle misureGrafica, icone, piccoli dispositivi

Se devi mostrare solo numeri e conta la leggibilità da lontano, il display a 7 segmenti è imbattibile. Se ti servono testo, unità di misura e menu, dai un'occhiata a Usare un display LCD I2C.

Idee di progetti con il display a 7 segmenti

  • Dado elettronico: mostra un numero casuale da 1 a 6 alla pressione di un pulsante.
  • Contatore a pulsanti: un contatore che sale con un pulsante e si azzera con un altro.
  • Orologio digitale: un orologio con TM1637 e modulo RTC che non perde l'ora anche se va via la corrente.
  • Conto alla rovescia: un timer regolabile per giochi da tavolo o esperimenti.
  • Indicatore di temperatura: mostra a cifre grandi la temperatura misurata con un DHT11.
  • Test dei riflessi: mostra in millisecondi quanto velocemente premi il pulsante dopo che si accende un LED.

Errori comuni e come risolverli

  • Non si accende nessun segmento: il pin comune è collegato nel posto sbagliato; forse hai collegato a GND un display ad anodo comune.
  • Le cifre appaiono sbagliate: la corrispondenza tra segmenti e pin di Arduino è errata; verificala accendendo un segmento alla volta.
  • Alcune cifre sono deboli: c'è una sola resistenza sul pin comune; usane una per ogni segmento.
  • Sul display a 4 cifre se ne accende solo una o tutto sfarfalla: c'è un delay() in loop() o la scansione non è abbastanza frequente.
  • I segmenti che dovrebbero accendersi sono spenti e gli altri accesi: anodo e catodo comune sono stati confusi; cambia COMMON_ANODE.
  • I pin non bastano: riduci il numero di pin con un modulo TM1637, un driver MAX7219 o uno shift register 74HC595.

Sapere che ogni segmento è in realtà un LED è la chiave per capire i display a 7 segmenti; per le basi dai un'occhiata a Cos'è un LED? Nell'app BlueGrays trovi progetti per contare da 0 a 9, contatore a pulsante, dado, orologio digitale a 4 cifre e animazione della bomba, passo passo con schemi e codice.

Domande frequenti

Che resistenza si usa con un display a 7 segmenti?

A 5 V vanno bene 220–330 Ω per segmento; 220 Ω dà più luce, 330 Ω consuma meno. Sulle schede a 3,3 V come ESP32 e Pico puoi usare 100–150 Ω. Metti le resistenze su ogni linea di segmento separatamente, non sul pin comune.

Come capisco se il mio display a 7 segmenti è ad anodo o a catodo comune?

Collega il pin comune (3 o 8) a GND e tocca il 5V con un pin di segmento tramite 220 Ω; se il segmento si accende è a catodo comune. Se no, collega il pin comune al 5V e il pin di segmento a GND tramite la resistenza; se ora si accende è ad anodo comune. Di solito anche la sigla del componente riporta CC o CA.

Quanti pin ha un display a 7 segmenti?

I display a una cifra hanno 10 pin: 7 segmenti, 1 punto e 2 pin comuni. Quelli a quattro cifre ne hanno 12: 8 linee di segmento condivise e 4 pin di selezione delle cifre. Moduli come il TM1637 si collegano con soli 4 pin (CLK, DIO, VCC, GND).

Perché sul mio display a 4 cifre si accende solo una cifra?

I display a quattro cifre funzionano in multiplexing, quindi le cifre devono essere scansionate una dopo l'altra in continuazione. Se usi delay() in loop(), la scansione si ferma e resta accesa solo l'ultima cifra. Usa una libreria come SevSeg, chiama di continuo refreshDisplay() e gestisci i tempi con millis().

Si possono scrivere lettere su un display a 7 segmenti?

Alcune sì: A, b, C, d, E, F, H, L, P, U e o sono riconoscibili. Lettere come K, M, W e X non si possono disegnare bene con sette segmenti. Se devi mostrare del testo, è più adatto un display LCD o OLED.

Come si usa un display a 7 segmenti con meno pin?

Il modo più semplice è un modulo con chip di controllo: il TM1637 pilota quattro cifre con 2 fili e il MAX7219 otto cifre con 3. Se vuoi costruire il tuo circuito, uno shift register 74HC595 controlla 8 segmenti con soli 3 pin di Arduino.

Vedi tutti i progetti
Stampa di numeri da 0 a 9 con display a 7 segmenti
#41Intermedio
Premium

Stampa di numeri da 0 a 9 con display a 7 segmenti

Progetto che mostra i numeri da 0 a 9 in sequenza su un display a 7 segmenti. Insegna la logica di creazione dei numeri controllando i pin dei segmenti.

4.5(30)
42
Stampa di numeri da 0 a 99 con display a 7 segmenti
#42Avanzato
Premium

Stampa di numeri da 0 a 99 con display a 7 segmenti

Progetto che mostra i numeri da 0 a 99 con display a 7 segmenti a doppia cifra. Insegna le operazioni sui bit (bitRead) e la logica di scomposizione delle cifre a una decina.

4.5(27)
35
Display a 7 segmenti e contatore con pulsante
#43Avanzato
Premium

Display a 7 segmenti e contatore con pulsante

Progetto di contatore che aumenta, diminuisce e azzera il numero sul display a 7 segmenti con 3 pulsanti. Insegna il controllo dei confini e la logica interattiva del contatore.

4.6(35)
46
Progetto Dadi
#79Intermedio
Premium

Progetto Dadi

Progetto di dado che genera un numero casuale tra 1 e 6 a ogni pressione del pulsante e lo visualizza su un display a 7 segmenti. Grazie al meccanismo di rimbalzo, viene prodotto un unico risultato co

5.0(48)
67
0-9999 Stampa del numero sul display a 4 7 segmenti
#47Intermedio
Premium

0-9999 Stampa del numero sul display a 4 7 segmenti

Progetto che mostra i numeri da 0 a 9999 su un display a 4 7 segmenti con la libreria SevSeg. Insegna la logica di visualizzazione di più cifre con il metodo multiplexing (scansione).

4.4(19)
25
Orologio digitale con display a 4 7 segmenti
#48Intermedio
Premium

Orologio digitale con display a 4 7 segmenti

Progetto di orologio digitale con indicazione di ore e minuti con modulo RTC DS1302 e display a 4 segmenti e 7 segmenti. Combina i dati dell'orologio in tempo reale e la visualizzazione dei segmenti.

4.8(56)
73
Animazione bomba con display a 4 7 segmenti
#49Principiante
Premium

Animazione bomba con display a 4 7 segmenti

Progetto di animazione di una bomba che esegue un conto alla rovescia su un display a 4 7 segmenti, che può essere accelerato con il potenziometro e annullato con i pulsanti. Insegna l'uso del timer,

4.8(62)
78
ESP32 TM1637 Display a 7 segmenti a 4 cifre
#125Intermedio
Premium

ESP32 TM1637 Display a 7 segmenti a 4 cifre

Stiamo controllando un modulo display a 7 segmenti a 4 cifre con driver TM1637 tramite ESP32. Utilizzando solo 2 GPIO (CLK e DIO), gestiamo un contatore compreso tra 0 e 9999, regoliamo il livello di luminosità e visualizziamo il carattere dei due punti centrali (`:`) in formato orologio. Grazie alla libreria TM1637Display, il controllo di numeri, valori esadecimali, segmenti e stringhe è molto semplice.

4.7(20)
32

Scopri i segmenti e la piedinatura di un display a 7 segmenti, impara a distinguere anodo e catodo comune, a contare da 0 a 9 con Arduino, a gestire in multiplexing un display a 4 cifre e a costruire un orologio a due fili con il TM1637.