Nota

Ciao, benvenuto nella Community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci 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 agli annunci di nuovi prodotti e alle anteprime.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e omaggi: Partecipa a omaggi e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

1.1.5 Display a 7 Segmenti a 4 Cifre

Introduzione

Ora, seguiamo le istruzioni per controllare un display a 7 segmenti a 4 cifre.

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list_4_digit.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

COMPONENTI IN QUESTO KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Display a 7 Segmenti da 4 Cifre

-

74HC595

ACQUISTA

Nota

In questo progetto, per il display a 7 segmenti a 4 cifre, è necessario utilizzare il modello BS. Se si utilizza il modello AS, potrebbe non accendersi.

Schema di Collegamento

T-Board Name

physical

wiringPi

BCM

GPIO17

Pin 11

0

17

GPIO27

Pin 13

2

27

GPIO22

Pin 15

3

22

SPIMOSI

Pin 19

12

10

GPIO18

Pin 12

1

18

GPIO23

Pin 16

4

23

GPIO24

Pin 18

5

24

../_images/schmatic_4_digit.png

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/image80.png

Passo 2: Accedi alla cartella del codice.

cd ~/raphael-kit/c/1.1.5/

Passo 3: Compila il codice.

gcc 1.1.5_4-Digit.c -lwiringPi

Passo 4: Esegui il file eseguibile.

sudo ./a.out

Dopo l’esecuzione del codice, il programma inizierà a contare, incrementando di 1 ogni secondo, e il display a 7 segmenti a 4 cifre mostrerà il conteggio.

Nota

Se non funziona dopo l’esecuzione o appare un errore come: "wiringPi.h: No such file or directory", consulta Installazione e verifica di WiringPi.

Codice

#include <wiringPi.h>
#include <stdio.h>
#include <wiringShift.h>
#include <signal.h>
#include <unistd.h>

#define SDI 5
#define RCLK 4
#define SRCLK 1

const int placePin[] = {12, 3, 2, 0};
unsigned char number[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

int counter = 0;

void pickDigit(int digit)
{
    for (int i = 0; i < 4; i++)
    {
        digitalWrite(placePin[i], 0);
    }
    digitalWrite(placePin[digit], 1);
}

void hc595_shift(int8_t data)
{
    int i;
    for (i = 0; i < 8; i++)
    {
        digitalWrite(SDI, 0x80 & (data << i));
        digitalWrite(SRCLK, 1);
        delayMicroseconds(1);
        digitalWrite(SRCLK, 0);
    }
    digitalWrite(RCLK, 1);
    delayMicroseconds(1);
    digitalWrite(RCLK, 0);
}

void clearDisplay()
{
    int i;
    for (i = 0; i < 8; i++)
    {
        digitalWrite(SDI, 1);
        digitalWrite(SRCLK, 1);
        delayMicroseconds(1);
        digitalWrite(SRCLK, 0);
    }
    digitalWrite(RCLK, 1);
    delayMicroseconds(1);
    digitalWrite(RCLK, 0);
}

void loop()
{
    while(1){
    clearDisplay();
    pickDigit(0);
    hc595_shift(number[counter % 10]);

    clearDisplay();
    pickDigit(1);
    hc595_shift(number[counter % 100 / 10]);

    clearDisplay();
    pickDigit(2);
    hc595_shift(number[counter % 1000 / 100]);

    clearDisplay();
    pickDigit(3);
    hc595_shift(number[counter % 10000 / 1000]);
    }
}

void timer(int timer1)
{
    if (timer1 == SIGALRM)
    {
        counter++;
        alarm(1);
        printf("%d\n", counter);
    }
}

void main(void)
{
    if (wiringPiSetup() == -1)
    {
        printf("setup wiringPi failed !");
        return;
    }
    pinMode(SDI, OUTPUT);
    pinMode(RCLK, OUTPUT);
    pinMode(SRCLK, OUTPUT);

    for (int i = 0; i < 4; i++)
    {
        pinMode(placePin[i], OUTPUT);
        digitalWrite(placePin[i], HIGH);
    }
    signal(SIGALRM, timer);
    alarm(1);
    loop();
}

Spiegazione del Codice

const int placePin[] = {12, 3, 2, 0};

Questi quattro pin controllano i pin dell’anodo comune del display a 7 segmenti a 4 cifre.

unsigned char number[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

Una matrice di codici di segmento da 0 a 9 in esadecimale (anodo comune).

void pickDigit(int digit)
{
    for (int i = 0; i < 4; i++)
    {
        digitalWrite(placePin[i], 0);
    }
    digitalWrite(placePin[digit], 1);
}

Seleziona la posizione del valore. Ogni volta è abilitata solo una posizione. La posizione abilitata sarà impostata su alto.

void loop()
{
    while(1){
    clearDisplay();
    pickDigit(0);
    hc595_shift(number[counter % 10]);

    clearDisplay();
    pickDigit(1);
    hc595_shift(number[counter % 100 / 10]);

    clearDisplay();
    pickDigit(2);
    hc595_shift(number[counter % 1000 / 100]);

    clearDisplay();
    pickDigit(3);
    hc595_shift(number[counter % 10000 / 1000]);
    }
}

La funzione viene utilizzata per impostare il numero visualizzato sul display a 7 segmenti a 4 cifre.

  • clearDisplay(): scrive 11111111 per spegnere i LED sul display a 7 segmenti per cancellare il contenuto visualizzato.

  • pickDigit(0): seleziona il quarto display a 7 segmenti.

  • hc595_shift(number[counter%10]): il numero della singola cifra del contatore verrà visualizzato sul quarto segmento.

signal(SIGALRM, timer);

Questa è una funzione fornita dal sistema. Il prototipo di codice è:

sig_t signal(int signum,sig_t handler);

Dopo aver eseguito la funzione signal(), una volta che il processo riceve il corrispondente signum (in questo caso SIGALRM), sospende immediatamente il task corrente ed esegue la funzione impostata (in questo caso timer(sig)).

alarm(1);

Questa è anche una funzione fornita dal sistema. Il prototipo del codice è:

unsigned int alarm (unsigned int seconds);

Genera un segnale SIGALRM dopo un certo numero di secondi.

void timer(int timer1)
{
    if (timer1 == SIGALRM)
    {
        counter++;
        alarm(1);
        printf("%d\n", counter);
    }
}

Usiamo le funzioni precedenti per implementare la funzione timer. Dopo che l”alarm() genera il segnale SIGALRM, viene chiamata la funzione timer. Aggiunge 1 al contatore e la funzione, alarm(1), verrà richiamata ripetutamente ogni 1 secondo.

Immagine del Fenomeno

../_images/image81.jpeg