.. note:: Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten. **Warum beitreten?** - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams. - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern. - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken. - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte. - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil. 👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei! .. _1.1.5_py_pi5: 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. .. image:: ../python_pi5/img/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 ============ ======== === .. image:: ../python_pi5/img/1.1.5_4_digit_schmatic.png Experimentelle Verfahren ----------------------------------- **Schritt 1**: Bauen Sie den Schaltkreis auf. .. image:: ../python_pi5/img/1.1.5_4-Digit_circuit.png **Schritt 2:** Wechseln Sie in den Ordner des Codes. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Schritt 3:** Führen Sie die ausführbare Datei aus. .. raw:: html .. code-block:: 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. .. warning:: Wenn die Fehlermeldung ``RuntimeError: Cannot determine SOC peripheral base address`` angezeigt wird, lesen Sie bitte :ref:`faq_soc` **Code** .. note:: 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. .. raw:: html .. code-block:: python #!/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** #. Diese vier Pins steuern die gemeinsamen Anodenpins der vierstelligen 7-Segment-Anzeigen. .. code-block:: python # GPIO-Pins für die Ziffernauswahl auf der 7-Segment-Anzeige definieren placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)] #. Ein Segmentcode-Array von 0 bis 9 in Hexadezimal (gemeinsame Anode). .. code-block:: python # Segmentcodes für die Zahlen 0-9 auf der 7-Segment-Anzeige definieren number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90) #. Initialisiert einen Timer, der die `timer`-Funktion jede Sekunde auslöst. Dadurch wird die regelmäßige Zählererhöhung eingerichtet. .. code-block:: python def setup(): """ Anfangszustand einrichten und den Timer starten. """ global timer1 timer1 = threading.Timer(1.0, timer) # Timer initialisieren und starten timer1.start() #. 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. .. code-block:: python 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 #. Verschiebt ein Byte Daten in das 74HC595 Schieberegister und steuert damit die Anzeigesegmente. .. code-block:: python 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() #. Aktualisiert kontinuierlich die Anzeige mit dem aktuellen Zählerwert, indem jede Ziffer nacheinander angezeigt wird. .. code-block:: python 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 #. Löscht die 7-Segment-Anzeige, indem alle Segmente ausgeschaltet werden, bevor die nächste Ziffer angezeigt wird. .. code-block:: python def clearDisplay(): """ Die 7-Segment-Anzeige löschen. """ for _ in range(8): SDI.on() SRCLK.on() SRCLK.off() RCLK.on() RCLK.off() #. Wählt aus, welche Ziffer der 7-Segment-Anzeige aktiviert werden soll. Jede Ziffer wird durch einen separaten GPIO-Pin gesteuert. .. code-block:: python 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 #. Gibt die GPIO-Ressourcen ordnungsgemäß frei und stoppt den Timer, wenn das Programm unterbrochen wird. .. code-block:: python except KeyboardInterrupt: # Skriptunterbrechung (z. B. Ctrl+C) behandeln destroy() # Ressourcen bei Beendigung aufräumen