.. 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 [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !
.. _1.1.5_py_pi5:
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.
.. image:: ../python_pi5/img/1.1.5_4_digit_list.png
.. raw:: html
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
============ ======== ===
.. image:: ../python_pi5/img/1.1.5_4_digit_schmatic.png
Procédure expérimentale
---------------------------
**Étape 1 :** Montez le circuit.
.. image:: ../python_pi5/img/1.1.5_4-Digit_circuit.png
**Étape 2 :** Accédez au dossier contenant le code.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**Étape 3 :** Exécutez le programme.
.. raw:: html
.. code-block::
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.
.. warning::
Si un message d'erreur apparaît tel que ``RuntimeError: Cannot determine SOC peripheral base address``, veuillez consulter :ref:`faq_soc`.
**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.
.. raw:: html
.. code-block:: python
#!/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**
#. Ces quatre broches contrôlent les broches d'anode commune des quatre chiffres de l'afficheur 7 segments.
.. code-block:: python
# 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)]
#. Un tableau de codes segmentaires pour les chiffres de 0 à 9 en hexadécimal (anode commune).
.. code-block:: python
# Définition des codes segmentaires pour les chiffres 0-9
number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
#. Initialise un minuteur qui déclenche la fonction `timer` chaque seconde. Cela met en place l'incrémentation récurrente du compteur.
.. code-block:: python
def setup():
""" Setup initial state and start the timer. """
global timer1
timer1 = threading.Timer(1.0, timer) # Initialisation du minuteur
timer1.start()
#. 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.
.. code-block:: python
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
#. Déplace un octet de données dans le registre à décalage 74HC595, contrôlant les segments de l'afficheur.
.. code-block:: python
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()
#. Met continuellement à jour l'affichage avec la valeur actuelle du compteur, en affichant chaque chiffre successivement.
.. code-block:: python
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
#. Efface l'afficheur 7 segments en éteignant tous les segments avant d'afficher le chiffre suivant.
.. code-block:: python
def clearDisplay():
""" Clear the 7-segment display. """
for _ in range(8):
SDI.on()
SRCLK.on()
SRCLK.off()
RCLK.on()
RCLK.off()
#. Sélectionne le chiffre de l'afficheur 7 segments à activer. Chaque chiffre est contrôlé par une broche GPIO distincte.
.. code-block:: python
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é
#. Libère correctement les ressources GPIO et arrête le minuteur lorsque le programme est interrompu.
.. code-block:: python
except KeyboardInterrupt:
# Gère l'interruption du script (ex. Ctrl+C)
destroy() # Nettoie les ressources à la sortie