.. note:: 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 [|link_sf_facebook|] e unisciti oggi! .. _ar_4_digit: 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 ----------------------- .. image:: img/list_2.7.png * :ref:`cpn_mega2560` * :ref:`cpn_breadboard` * :ref:`cpn_wires` * :ref:`cpn_resistor` * :ref:`cpn_4_digit` Circuito con Fritzing ------------------------ .. image:: img/image438.png Schema del Circuito ---------------------- .. image:: img/image439.png Codice --------- .. note:: * Puoi aprire direttamente il file ``2.7_4digitalSegment.ino`` che si trova nel percorso ``sunfounder_vincent_kit_for_arduino\code\2.7_4digitalSegment``. .. raw:: html 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: .. code-block:: arduino 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. #. 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. .. code-block:: arduino 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: .. code-block:: arduino 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: .. code-block:: arduino 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()``: .. code-block:: arduino // 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. #. 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. .. code-block:: arduino 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 ``numbers`` precedentemente definito per sapere quali segmenti accendere/spegnere. .. code-block:: arduino 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()``. .. code-block:: arduino 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 --------------------- .. image:: img/image104.jpeg