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

../_images/list_2.7.png

Circuito con Fritzing

../_images/image438.png

Schema del Circuito

../_images/image439.png

Codice

Nota

  • Puoi aprire direttamente il file 2.7_4digitalSegment.ino che si trova nel percorso sunfounder_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.

  1. 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 segmentPins e digitPins definiscono 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.

    • del rappresenta un tempo di ritardo per mantenere la visualizzazione della cifra corrente prima di passare alla successiva.

    • previousMillis e interval sono legati al tempo e determinano quando incrementare il cronometro.

  2. 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
    };
    
  3. 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.

  4. 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().

  5. 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 utilizzando pickNumber().

    • Il delay(del) assicura che ogni cifra sia visibile per un breve tempo prima di passare alla successiva.

  6. 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)
    }
    
  7. 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 numbers precedentemente 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
        }
    }
    
  8. 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

../_images/image104.jpeg