Bemerkung

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 [hier] und treten Sie heute bei!

4.1.9 Ampel

Einführung

In diesem Projekt werden wir LED-Lampen in drei Farben verwenden, um den Wechsel von Ampellichtern zu realisieren, und ein vierstelliges 7-Segment-Display wird verwendet, um die Zeit für jeden Ampelzustand anzuzeigen.

Benötigte Komponenten

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

../_images/4.1.12_traffic_light_list.png

Es ist definitiv praktisch, ein komplettes Kit zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Raphael Kit

337

Raphael Kit

Sie können sie auch einzeln über die untenstehenden Links kaufen.

KOMPONENTENVORSTELLUNG

KAUF-LINK

GPIO-Erweiterungsplatine

BUY

Steckbrett

BUY

Jumper-Kabel

BUY

Widerstand

BUY

LED

BUY

4-stellige 7-Segment-Anzeige

-

74HC595

BUY

Schaltplan

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

GPIO25

Pin 22

6

25

SPICE0

Pin 24

10

8

SPICE1

Pin 26

11

7

../_images/4.1.12_traffic_light_schematic.png

Experimentelle Verfahren

Schritt 1: Bauen Sie den Schaltkreis auf.

../_images/4.1.12_traffic_light_circuit.png

Schritt 2: Wechseln Sie das Verzeichnis.

cd ~/raphael-kit/python-pi5

Schritt 3: Ausführen.

sudo python3 4.1.12_TrafficLight_zero.py

Während der Code ausgeführt wird, simulieren die LEDs den Farbwechsel der Ampellichter. Zuerst leuchtet die rote LED für 60 Sekunden, dann leuchtet die grüne LED für 30 Sekunden; danach leuchtet die gelbe LED für 5 Sekunden. Anschließend leuchtet die rote LED erneut für 60 Sekunden. Auf diese Weise wird diese Serie von Aktionen wiederholt ausgeführt. Gleichzeitig zeigt das vierstellige 7-Segment-Display kontinuierlich die Countdown-Zeit an.

Code

Bemerkung

Sie können den untenstehenden Code Modifizieren/Zurücksetzen/Kopieren/Ausführen/Stoppen. Aber zuerst müssen Sie zum Quellcodepfad wie raphael-kit/python-pi5 gehen. Nach der Modifikation des Codes können Sie ihn direkt ausführen, um das Ergebnis zu sehen.

#!/usr/bin/env python3

from gpiozero import OutputDevice, LED
import threading

# Setup GPIO pins for 74HC595 shift register
SDI = OutputDevice(24)   # Serial Data Input
RCLK = OutputDevice(23)  # Register Clock
SRCLK = OutputDevice(18) # Shift Register Clock

# Setup GPIO pins for digit selection on 7-segment display
placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)]

# Segment codes for numbers 0-9 on 7-segment display
number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)

# Setup GPIO pins for traffic light LEDs
ledPinR = LED(25) # Red LED
ledPinG = LED(8)  # Green LED
ledPinY = LED(7)  # Yellow LED

# Duration settings for traffic lights
greenLight = 30
yellowLight = 5
redLight = 60

# Traffic light color names
lightColor = ("Red", "Green", "Yellow")

# Initialize state variables
colorState = 0
counter = 60
timer1 = None

def setup():
    """ Initialize the traffic light system and start the timer. """
    global timer1
    timer1 = threading.Timer(1.0, timer)
    timer1.start()

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 data to the 74HC595 shift register for digit display. """
    for i in range(8):
        SDI.value = 0x80 & (data << i)
        SRCLK.on()
        SRCLK.off()
    RCLK.on()
    RCLK.off()

def pickDigit(digit):
    """ Select a specific digit to display on the 7-segment display. """
    for pin in placePin:
        pin.off()
    placePin[digit].on()

def timer():
    """ Handle the timing for traffic light changes. """
    global counter, colorState, timer1
    timer1 = threading.Timer(1.0, timer)
    timer1.start()
    counter -= 1
    if counter == 0:
        counter = [greenLight, yellowLight, redLight][colorState]
        colorState = (colorState + 1) % 3
    print(f"counter : {counter}    color: {lightColor[colorState]}")

def lightup():
    """ Update the traffic light LED based on the current state. """
    global colorState
    ledPinR.off()
    ledPinG.off()
    ledPinY.off()
    [ledPinR, ledPinG, ledPinY][colorState].on()

def display():
    """ Display the current counter value on the 7-segment display. """
    global counter

    for i in range(4):
        digit = counter // (10 ** (3 - i)) % 10
        if i == 0 and digit == 0:
            continue
        clearDisplay()
        pickDigit(3 - i)
        hc595_shift(number[digit])

def loop():
    """ Main loop to continuously update display and lights. """
    while True:
        display()
        lightup()

def destroy():
    """ Clean up resources when the script is terminated. """
    global timer1
    timer1.cancel()
    ledPinR.off()
    ledPinG.off()
    ledPinY.off()

try:
    setup()
    loop()
except KeyboardInterrupt:
    destroy()

Code-Erklärung

  1. Importiert die Klassen OutputDevice und LED aus der gpiozero-Bibliothek, die die Steuerung von allgemeinen Ausgabegeräten und speziell von LEDs ermöglichen. Importiert das Python-Modul threading, das für das Erstellen und Verwalten von Threads für die parallele Ausführung verwendet wird.

    #!/usr/bin/env python3
    from gpiozero import OutputDevice, LED
    import threading
    
  2. Initialisiert die GPIO-Pins, die mit dem Schieberegister’s Serial Data Input (SDI), Register Clock Input (RCLK) und Shift Register Clock Input (SRCLK) verbunden sind.

    # Setup GPIO pins for 74HC595 shift register
    SDI = OutputDevice(24)   # Serial Data Input
    RCLK = OutputDevice(23)  # Register Clock
    SRCLK = OutputDevice(18) # Shift Register Clock
    
  3. Initialisiert die Pins für jede Ziffer des 7-Segment-Displays und definiert die Binärcodes für die Anzeige der Zahlen 0-9.

    # Setup GPIO pins for digit selection on 7-segment display
    placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)]
    
    # Segment codes for numbers 0-9 on 7-segment display
    number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
    
  4. Initialisiert die GPIO-Pins für die Rot-, Grün- und Gelb-LEDs, die in der Ampelsimulation verwendet werden. Legt die Dauer (in Sekunden) für jeden Farbzustand im Ampelsystem fest. Definiert die Namen der Ampelfarben zum Nachschlagen.

    # Setup GPIO pins for traffic light LEDs
    ledPinR = LED(25) # Red LED
    ledPinG = LED(8)  # Green LED
    ledPinY = LED(7)  # Yellow LED
    
    # Duration settings for traffic lights
    greenLight = 30
    yellowLight = 5
    redLight = 60
    
    # Traffic light color names
    lightColor = ("Red", "Green", "Yellow")
    
  5. Initialisiert Variablen zur Verfolgung des aktuellen Farbzustands, eines Zählers für die Zeitmessung und eines Platzhalters für ein Timer-Objekt.

    # Initialize state variables
    colorState = 0
    counter = 60
    timer1 = None
    
  6. Initialisiert das Ampelsystem und startet den Timer-Thread.

    def setup():
        """ Initialize the traffic light system and start the timer. """
        global timer1
        timer1 = threading.Timer(1.0, timer)
        timer1.start()
    
  7. Funktionen zur Steuerung des 7-Segment-Displays. clearDisplay schaltet alle Segmente aus, hc595_shift überträgt Daten in das Schieberegister, und pickDigit aktiviert eine bestimmte Ziffer auf dem Display.

    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 data to the 74HC595 shift register for digit display. """
        for i in range(8):
            SDI.value = 0x80 & (data << i)
            SRCLK.on()
            SRCLK.off()
        RCLK.on()
        RCLK.off()
    
    def pickDigit(digit):
        """ Select a specific digit to display on the 7-segment display. """
        for pin in placePin:
            pin.off()
        placePin[digit].on()
    
  8. Verwaltet die Zeit für Ampellichtwechsel und aktualisiert den Zähler und den Farbzustand.

    def timer():
        """ Handle the timing for traffic light changes. """
        global counter, colorState, timer1
        timer1 = threading.Timer(1.0, timer)
        timer1.start()
        counter -= 1
        if counter == 0:
            counter = [greenLight, yellowLight, redLight][colorState]
            colorState = (colorState + 1) % 3
        print(f"counter : {counter}    color: {lightColor[colorState]}")
    
  9. Aktualisiert den Zustand der Ampel-LEDs basierend auf dem aktuellen Farbzustand.

    def lightup():
        """ Update the traffic light LED based on the current state. """
        global colorState
        ledPinR.off()
        ledPinG.off()
        ledPinY.off()
        [ledPinR, ledPinG, ledPinY][colorState].on()
    
  10. Berechnet die anzuzeigende Ziffer für jedes Segment des 7-Segment-Displays und aktualisiert es entsprechend.

    def display():
        """ Display the current counter value on the 7-segment display. """
        global counter
    
        for i in range(4):
            digit = counter // (10 ** (3 - i)) % 10
            if i == 0 and digit == 0:
                continue
            clearDisplay()
            pickDigit(3 - i)
            hc595_shift(number[digit])
    
  11. Die Hauptschleife, die kontinuierlich die Anzeige und die Ampel-LEDs aktualisiert.

    def loop():
        """ Main loop to continuously update display and lights. """
        while True:
            display()
            lightup()
    
  12. Räumt Ressourcen auf, wenn das Skript beendet wird, wie das Ausschalten der LEDs und das Stoppen des Timer-Threads.

    def destroy():
        """ Clean up resources when the script is terminated. """
        global timer1
        timer1.cancel()
        ledPinR.off()
        ledPinG.off()
        ledPinY.off()