1.1.5 4-stellige 7-Segment-Anzeige

Einführung

Als Nächstes versuchen wir, die 4-stellige 7-Segment-Anzeige zu steuern.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

../_images/1.1.5_4_digit_list.png

Schaltplan

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

Experimentelle Verfahren

Schritt 1: Bauen Sie den Schaltkreis auf.

../_images/1.1.5_4-Digit_circuit.png

Schritt 2: Wechseln Sie in den Ordner des Codes.

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

Schritt 3: Führen Sie die ausführbare Datei aus.

sudo python3 1.1.5_4-Digit_zero.py

Nachdem der Code ausgeführt wurde, führt das Programm einen Zähler aus, der pro Sekunde um 1 erhöht wird, und die 4-stellige Anzeige zeigt den Zählerstand an.

Code

Bemerkung

Sie können den unten stehenden Code Modifizieren/Zurücksetzen/Kopieren/Ausführen/Stoppen. Aber bevor Sie das tun, müssen Sie zum Quellcode-Pfad wie davinci-kit-for-raspberry-pi/python-pi5 gehen. Nachdem Sie den Code geändert haben, können Sie ihn direkt ausführen, um die Auswirkungen zu sehen.

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

# GPIO-Pins für das 74HC595 Schieberegister definieren
SDI = OutputDevice(24)   # Serieller Dateneingang
RCLK = OutputDevice(23)  # Register Clock
SRCLK = OutputDevice(18) # Schieberegistertakt

# GPIO-Pins für die Ziffernauswahl auf der 7-Segment-Anzeige definieren
placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)]

# Segmentcodes für die Zahlen 0-9 auf der 7-Segment-Anzeige definieren
number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)

counter = 0  # Zähler für die Anzeige initialisieren
timer1 = 0   # Timer für Zählererhöhung initialisieren

def clearDisplay():
    """ Die 7-Segment-Anzeige löschen. """
    for _ in range(8):
        SDI.on()
        SRCLK.on()
        SRCLK.off()
    RCLK.on()
    RCLK.off()

def hc595_shift(data):
    """ Ein Byte Daten in das 74HC595 Schieberegister schieben. """
    for i in range(8):
        SDI.value = 0x80 & (data << i)  # SDI auf Hoch/Niedrig basierend auf dem Datenbit setzen
        SRCLK.on()  # Schieberegistertakt auslösen
        SRCLK.off()
    RCLK.on()  # Daten durch Auslösen des Register Clocks in die Ausgabe übernehmen
    RCLK.off()

def pickDigit(digit):
    """ Eine Ziffer für die Anzeige auf der 7-Segment-Anzeige auswählen. """
    for pin in placePin:
        pin.off()  # Alle Ziffernauswahl-Pins ausschalten
    placePin[digit].on()  # Die ausgewählte Ziffer einschalten

def timer():
    """ Timerfunktion, um den Zähler jede Sekunde zu erhöhen. """
    global counter, timer1
    timer1 = threading.Timer(1.0, timer)  # Timer für nächste Erhöhung zurücksetzen
    timer1.start()
    counter += 1  # Zähler erhöhen
    print("%d" % counter)  # Aktuellen Zählerstand ausgeben

def setup():
    """ Anfangszustand einrichten und den Timer starten. """
    global timer1
    timer1 = threading.Timer(1.0, timer)  # Timer initialisieren und starten
    timer1.start()

def loop():
    """ Hauptloop, um die 7-Segment-Anzeige mit dem Zählerwert zu aktualisieren. """
    global counter
    while True:
        for i in range(4):  # Jede Ziffer durchlaufen
            clearDisplay()  # Anzeige löschen, bevor neue Ziffer gesetzt wird
            pickDigit(i)    # Ziffer für die Anzeige auswählen
            digit = (counter // (10 ** i)) % 10
            hc595_shift(number[digit])  # Ziffernwert in 74HC595 schieben
            time.sleep(0.001)  # Kurze Verzögerung für Anzeigestabilität

def destroy():
    """ GPIO-Ressourcen freigeben und Timer bei Beendigung stoppen. """
    global timer1
    timer1.cancel()  # Timer stoppen
    for device in [SDI, RCLK, SRCLK] + placePin:
        device.close()  # GPIO-Geräte schließen

try:
    setup()  # Initialisierung einrichten
    while True:
        loop()  # Hauptloop starten

except KeyboardInterrupt:
    # Skriptunterbrechung (z. B. Ctrl+C) behandeln
    destroy()  # Ressourcen bei Beendigung aufräumen

Code-Erklärung

  1. Diese vier Pins steuern die gemeinsamen Anodenpins der vierstelligen 7-Segment-Anzeigen.

    # GPIO-Pins für die Ziffernauswahl auf der 7-Segment-Anzeige definieren
    placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)]
    
  2. Ein Segmentcode-Array von 0 bis 9 in Hexadezimal (gemeinsame Anode).

    # Segmentcodes für die Zahlen 0-9 auf der 7-Segment-Anzeige definieren
    number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
    
  3. Initialisiert einen Timer, der die timer-Funktion jede Sekunde auslöst. Dadurch wird die regelmäßige Zählererhöhung eingerichtet.

    def setup():
        """ Anfangszustand einrichten und den Timer starten. """
        global timer1
        timer1 = threading.Timer(1.0, timer)  # Timer initialisieren und starten
        timer1.start()
    
  4. Nachdem der Timer 1,0 s erreicht hat, wird die Timerfunktion aufgerufen; 1 zum Zähler hinzufügen, und der Timer wird erneut verwendet, um sich selbst jede Sekunde wiederholt auszuführen.

    def timer():
        """ Timerfunktion, um den Zähler jede Sekunde zu erhöhen. """
        global counter, timer1
        timer1 = threading.Timer(1.0, timer)  # Timer für nächste Erhöhung zurücksetzen
        timer1.start()
        counter += 1  # Zähler erhöhen
        print("%d" % counter)  # Aktuellen Zählerstand ausgeben
    
  5. Verschiebt ein Byte Daten in das 74HC595 Schieberegister und steuert damit die Anzeigesegmente.

    def hc595_shift(data):
        """ Ein Byte Daten in das 74HC595 Schieberegister schieben. """
        for i in range(8):
            SDI.value = 0x80 & (data << i)  # SDI auf Hoch/Niedrig basierend auf dem Datenbit setzen
            SRCLK.on()  # Schieberegistertakt auslösen
            SRCLK.off()
        RCLK.on()  # Daten durch Auslösen des Register Clocks in die Ausgabe übernehmen
        RCLK.off()
    
  6. Aktualisiert kontinuierlich die Anzeige mit dem aktuellen Zählerwert, indem jede Ziffer nacheinander angezeigt wird.

    def loop():
        """ Hauptloop, um die 7-Segment-Anzeige mit dem Zählerwert zu aktualisieren. """
        global counter
        while True:
            for i in range(4):  # Jede Ziffer durchlaufen
                clearDisplay()  # Anzeige löschen, bevor neue Ziffer gesetzt wird
                pickDigit(i)    # Ziffer für die Anzeige auswählen
                digit = (counter // (10 ** i)) % 10
                hc595_shift(number[digit])  # Ziffernwert in 74HC595 schieben
                time.sleep(0.001)  # Kurze Verzögerung für Anzeigestabilität
    
  7. Löscht die 7-Segment-Anzeige, indem alle Segmente ausgeschaltet werden, bevor die nächste Ziffer angezeigt wird.

    def clearDisplay():
        """ Die 7-Segment-Anzeige löschen. """
        for _ in range(8):
            SDI.on()
            SRCLK.on()
            SRCLK.off()
        RCLK.on()
        RCLK.off()
    
  8. Wählt aus, welche Ziffer der 7-Segment-Anzeige aktiviert werden soll. Jede Ziffer wird durch einen separaten GPIO-Pin gesteuert.

    def pickDigit(digit):
        """ Eine Ziffer für die Anzeige auf der 7-Segment-Anzeige auswählen. """
        for pin in placePin:
            pin.off()  # Alle Ziffernauswahl-Pins ausschalten
        placePin[digit].on()  # Die ausgewählte Ziffer einschalten
    
  9. Gibt die GPIO-Ressourcen ordnungsgemäß frei und stoppt den Timer, wenn das Programm unterbrochen wird.

    except KeyboardInterrupt:
        # Skriptunterbrechung (z. B. Ctrl+C) behandeln
        destroy()  # Ressourcen bei Beendigung aufräumen