Nota
Ciao, benvenuto nella comunità di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci il mondo di Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
Perché unirti a noi?
Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.
Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.
Anteprime esclusive: Ottieni accesso anticipato a nuovi annunci di prodotti e contenuti esclusivi.
Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni festive e concorsi: Partecipa a concorsi e promozioni speciali durante le festività.
👉 Sei pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi!
2.7 Display a 7 Segmenti con 4 Cifre
Panoramica
In questa lezione imparerai come utilizzare il display a 7 segmenti con 4 cifre. Questo componente è composto da quattro display a 7 segmenti che lavorano insieme per mostrare numeri a 4 cifre.
Componenti Necessari
Circuito con Fritzing
Schema del Circuito
Codice
Nota
Puoi aprire direttamente il file
2.7_4digitalSegment.inoche si trova nel percorsosunfounder_vincent_kit_for_arduino\code\2.7_4digitalSegment.
Analisi del Codice
In sostanza, questo codice utilizza il principio del multiplexing per visualizzare un numero a 4 cifre su un display a 7 segmenti. Passando rapidamente da una cifra all’altra e visualizzandone una alla volta, si ottiene l’illusione che tutte le cifre siano visualizzate contemporaneamente. La funzionalità di cronometro è ottenuta utilizzando la funzione millis() per tenere traccia del tempo e incrementare il numero mostrato ogni secondo.
Definizione di Variabili e Costanti:
int segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; int digitPins[] = {13, 12, 11, 10}; long n = 0; // Variabile per memorizzare il numero del cronometro int del = 5; // Ritardo (in millisecondi) per mantenere ogni cifra illuminata unsigned long previousMillis = 0; // Memorizza l'ultimo momento in cui il cronometro è stato incrementato const long interval = 1000; // Intervallo di un secondo (in millisecondi)
Gli array
segmentPinsedigitPinsdefiniscono i pin collegati rispettivamente ai segmenti e alle cifre del display a 7 segmenti.nè una variabile di tipo long che tiene traccia del numero corrente del cronometro, partendo da 0 e incrementandosi.delrappresenta un tempo di ritardo per mantenere la visualizzazione della cifra corrente prima di passare alla successiva.previousMilliseintervalsono legati al tempo e determinano quando incrementare il cronometro.
Modelli a 7 Segmenti per Numeri:
L’array bidimensionale numbers definisce come ciascuno dei numeri da 0 a 9 è rappresentato su un display a 7 segmenti a catodo comune.
byte numbers[10][8] = { {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW}, // 0 {LOW, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW}, // 1 {HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH, LOW}, // 2 {HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, LOW}, // 3 {LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH, LOW}, // 4 {HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, LOW}, // 5 {HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW}, // 6 {HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW}, // 7 {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW}, // 8 {HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, LOW} // 9 };
Funzione Setup:
void setup() { // Configure all segment and digit pins as OUTPUT for (int i = 0; i < 8; i++) { pinMode(segmentPins[i], OUTPUT); } for (int i = 0; i < 4; i++) { pinMode(digitPins[i], OUTPUT); digitalWrite(digitPins[i], HIGH); // Initially turn off all digits (for common-cathode displays, HIGH is OFF) } }
Tutti i pin dei segmenti e delle cifre sono impostati in modalità OUTPUT, poiché controlleranno i segmenti e le cifre del display.
Inizialmente, tutte le cifre sono spente, indicate impostando HIGH per un display a catodo comune.
Ciclo Principale:
void loop() { // Controlla se è passato un secondo dall'ultimo incremento if (millis() - previousMillis >= interval) { previousMillis += interval; // Aggiorna il tempo dell'ultimo incremento n = (n + 1) % 10000; // Incrementa il numero del cronometro e lo riporta a 0 dopo 9999 } displayNumber(n); // Mostra il numero corrente del cronometro sul display a 7 segmenti }
Questa sezione verifica se è trascorso l’intervallo (impostato a 1000 ms o 1 secondo) dall’ultimo incremento del cronometro. Se sì, incrementa il numero.
Il numero viene quindi visualizzato sul display a 7 segmenti utilizzando la funzione
displayNumber().
Funzione
displayNumber():// Funzione per mostrare un numero a 4 cifre sul display a 7 segmenti void displayNumber(long num) { for (int digit = 0; digit < 4; digit++) { clearLEDs(); // Spegne tutti i segmenti e le cifre pickDigit(digit); // Attiva la cifra corrente int value = (num / (int)pow(10, 3 - digit)) % 10; // Estrae la cifra specifica dal numero pickNumber(value); // Illumina i segmenti per visualizzare la cifra delay(del); // Mantiene la cifra illuminata per un breve tempo } }
Questa funzione divide il numero a 4 cifre in singole cifre e visualizza ciascuna cifra una alla volta in rapida successione. Ciò crea l’illusione che tutte le cifre vengano visualizzate contemporaneamente grazie alla persistenza della visione.
Per ogni cifra, la funzione prima spegne tutti i LED, seleziona la cifra appropriata utilizzando
pickDigit(), e poi visualizza il numero su quella cifra utilizzandopickNumber().Il
delay(del)assicura che ogni cifra sia visibile per un breve tempo prima di passare alla successiva.
Funzione
pickDigit():Questa funzione è responsabile della selezione (o accensione) di una delle quattro cifre sul display a 7 segmenti. Questo viene ottenuto impostando il pin della cifra corrispondente a LOW.
void pickDigit(int x) { digitalWrite(digitPins[x], LOW); // Accende la cifra selezionata (per display a catodo comune, LOW è ACCESO) }
Funzione
pickNumber():Data una singola cifra (0-9), questa funzione controlla i segmenti del display a 7 segmenti per mostrare quella cifra. Utilizza l’array
numbersprecedentemente definito per sapere quali segmenti accendere/spegnere.void pickNumber(int x) { for (int i = 0; i < 8; i++) { digitalWrite(segmentPins[i], numbers[x][i]); // Imposta ogni segmento secondo il modello per il numero specificato } }
Funzione
clearLEDs():Come suggerisce il nome, questa funzione spegne tutti i segmenti e le cifre. Viene utilizzata per garantire che solo una cifra sia attiva alla volta durante il processo di multiplexing nella funzione
displayNumber().void clearLEDs() { for (int i = 0; i < 8; i++) { digitalWrite(segmentPins[i], LOW); // Spegne tutti i segmenti } for (int i = 0; i < 4; i++) { digitalWrite(digitPins[i], HIGH); // Spegne tutte le cifre } }
Immagine del Fenomeno