Note

Bonjour, bienvenue dans la communauté des passionnés de SunFounder Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez dans l’univers de Raspberry Pi, Arduino et ESP32 avec d’autres amateurs.

Pourquoi nous rejoindre ?

  • Support d’experts : Résolvez les problèmes après-vente et surmontez les défis techniques grâce à l’aide de notre communauté et de notre équipe.

  • Apprendre & Partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.

  • Aperçus exclusifs : Accédez en avant-première aux annonces des nouveaux produits.

  • Réductions spéciales : Profitez de réductions exclusives sur nos dernières nouveautés.

  • Promotions festives et cadeaux : Participez à des concours et à des promotions spéciales pour les fêtes.

👉 Prêt à explorer et créer avec nous ? Cliquez sur [Ici] et rejoignez-nous dès aujourd’hui !

1.1.5 Afficheur 7 segments à 4 chiffres

Introduction

Suivez-moi pour essayer de contrôler un afficheur 7 segments à 4 chiffres.

Composants nécessaires

Dans ce projet, nous aurons besoin des composants suivants.

../_images/1.1.5_4_digit_list.png

Schéma de câblage

T-Board Name

physical

BCM

GPIO17

Pin 11

17

GPIO27

Pin 13

27

GPIO22

Pin 15

22

SPIMOSI

Pin 19

10

GPIO18

Pin 12

18

GPIO23

Pin 16

23

GPIO24

Pin 18

24

../_images/1.1.5_4_digit_schmatic.png

Procédure expérimentale

Étape 1 : Montez le circuit.

../_images/1.1.5_4-Digit_circuit.png

Étape 2 : Accédez au dossier contenant le code.

cd ~/davinci-kit-for-raspberry-pi/python-pi5

Étape 3 : Exécutez le programme.

sudo python3 1.1.5_4-Digit.py

Après l’exécution du code, le programme effectue un comptage, augmentant de 1 par seconde, et l’afficheur à 4 chiffres affiche ce compteur.

Avertissement

Si un message d’erreur apparaît tel que RuntimeError: Cannot determine SOC peripheral base address, veuillez consulter Si gpiozero ne fonctionne pas..

Code

Note

Vous pouvez Modifier/Réinitialiser/Copier/Exécuter/Arrêter le code ci-dessous. Mais avant cela, vous devez accéder au chemin source du code comme davinci-kit-for-raspberry-pi/python-pi5. Après modification, vous pouvez l’exécuter directement pour observer le résultat.

#!/usr/bin/env python3
from gpiozero import OutputDevice
import time
import threading

# Définition des broches GPIO pour le registre à décalage 74HC595
SDI = OutputDevice(24)   # Entrée de données série
RCLK = OutputDevice(23)  # Horloge du registre
SRCLK = OutputDevice(18) # Horloge du registre de décalage

# Définition des broches GPIO pour la sélection des chiffres de l'afficheur 7 segments
placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)]

# Définition des codes segmentaires pour les chiffres 0-9
number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)

counter = 0  # Initialisation du compteur
timer1 = 0   # Initialisation du minuteur

def clearDisplay():
    """ Clear the 7-segment display. """
    for _ in range(8):
        SDI.on()
        SRCLK.on()
        SRCLK.off()
    RCLK.on()
    RCLK.off()

def hc595_shift(data):
    """ Shift a byte of data to the 74HC595 shift register. """
    for i in range(8):
        SDI.value = 0x80 & (data << i)  # Définir SDI haut/bas selon le bit de données
        SRCLK.on()  # Impulsion d'horloge du registre de décalage
        SRCLK.off()
    RCLK.on()  # Verrouille les données avec une impulsion d'horloge
    RCLK.off()

def pickDigit(digit):
    """ Select a digit for display on the 7-segment display. """
    for pin in placePin:
        pin.off()  # Éteint toutes les broches de sélection
    placePin[digit].on()  # Active la broche du chiffre sélectionné

def timer():
    """ Timer function to increment the counter every second. """
    global counter, timer1
    timer1 = threading.Timer(1.0, timer)  # Réinitialisation du minuteur
    timer1.start()
    counter += 1  # Incrémente le compteur
    print("%d" % counter)  # Affiche la valeur actuelle du compteur

def setup():
    """ Setup initial state and start the timer. """
    global timer1
    timer1 = threading.Timer(1.0, timer)  # Initialisation du minuteur
    timer1.start()

def loop():
    """ Main loop to update the 7-segment display with counter value. """
    global counter
    while True:
        for i in range(4):  # Parcourt chaque chiffre
            clearDisplay()  # Efface l'affichage avant de définir un nouveau chiffre
            pickDigit(i)    # Sélectionne le chiffre à afficher
            digit = (counter // (10 ** i)) % 10
            hc595_shift(number[digit])  # Envoie la valeur au registre 74HC595
            time.sleep(0.001)  # Courte pause pour la stabilité de l'affichage

def destroy():
    """ Cleanup GPIO resources and stop timer on exit. """
    global timer1
    timer1.cancel()  # Arrête le minuteur
    for device in [SDI, RCLK, SRCLK] + placePin:
        device.close()  # Ferme les périphériques GPIO

try:
    setup()  # Initialise la configuration
    while True:
        loop()  # Démarre la boucle principale

except KeyboardInterrupt:
    # Gère l'interruption du script (ex. Ctrl+C)
    destroy()  # Nettoie les ressources à la sortie

Explication du code

  1. Ces quatre broches contrôlent les broches d’anode commune des quatre chiffres de l’afficheur 7 segments.

    # Définition des broches GPIO pour la sélection des chiffres de l'afficheur 7 segments
    placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)]
    
  2. Un tableau de codes segmentaires pour les chiffres de 0 à 9 en hexadécimal (anode commune).

    # Définition des codes segmentaires pour les chiffres 0-9
    number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
    
  3. Initialise un minuteur qui déclenche la fonction timer chaque seconde. Cela met en place l’incrémentation récurrente du compteur.

    def setup():
        """ Setup initial state and start the timer. """
        global timer1
        timer1 = threading.Timer(1.0, timer)  # Initialisation du minuteur
        timer1.start()
    
  4. Après chaque seconde, la fonction du minuteur est appelée ; elle incrémente le compteur et se réinitialise pour se répéter chaque seconde.

    def timer():
        """ Timer function to increment the counter every second. """
        global counter, timer1
        timer1 = threading.Timer(1.0, timer)  # Réinitialisation du minuteur
        timer1.start()
        counter += 1  # Incrémente le compteur
        print("%d" % counter)  # Affiche la valeur actuelle du compteur
    
  5. Déplace un octet de données dans le registre à décalage 74HC595, contrôlant les segments de l’afficheur.

    def hc595_shift(data):
        """ Shift a byte of data to the 74HC595 shift register. """
        for i in range(8):
            SDI.value = 0x80 & (data << i)  # Définit la valeur de SDI selon le bit de données
            SRCLK.on()  # Impulsion de l'horloge du registre de décalage
            SRCLK.off()
        RCLK.on()  # Verrouille les données sur la sortie en déclenchant l'horloge du registre
        RCLK.off()
    
  6. Met continuellement à jour l’affichage avec la valeur actuelle du compteur, en affichant chaque chiffre successivement.

    def loop():
        """ Main loop to update the 7-segment display with counter value. """
        global counter
        while True:
            for i in range(4):  # Parcourt chaque chiffre
                clearDisplay()  # Efface l'affichage avant de définir un nouveau chiffre
                pickDigit(i)    # Sélectionne le chiffre à afficher
                digit = (counter // (10 ** i)) % 10
                hc595_shift(number[digit])  # Envoie la valeur du chiffre au 74HC595
                time.sleep(0.001)  # Courte pause pour la stabilité de l'affichage
    
  7. Efface l’afficheur 7 segments en éteignant tous les segments avant d’afficher le chiffre suivant.

    def clearDisplay():
        """ Clear the 7-segment display. """
        for _ in range(8):
            SDI.on()
            SRCLK.on()
            SRCLK.off()
        RCLK.on()
        RCLK.off()
    
  8. Sélectionne le chiffre de l’afficheur 7 segments à activer. Chaque chiffre est contrôlé par une broche GPIO distincte.

    def pickDigit(digit):
        """ Select a digit for display on the 7-segment display. """
        for pin in placePin:
            pin.off()  # Éteint toutes les broches de sélection de chiffres
        placePin[digit].on()  # Allume la broche du chiffre sélectionné
    
  9. Libère correctement les ressources GPIO et arrête le minuteur lorsque le programme est interrompu.

    except KeyboardInterrupt:
        # Gère l'interruption du script (ex. Ctrl+C)
        destroy()  # Nettoie les ressources à la sortie