.. 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! .. _4.1.12_py: 4.1.12 Ampel ======================== Einführung --------------- In diesem Projekt werden wir LED-Leuchten in drei Farben verwenden, um den Wechsel der Verkehrsampeln zu simulieren. Eine vierstellige 7-Segment-Anzeige wird verwendet, um die Zeitdauer jedes Ampelzustands anzuzeigen. Benötigte Komponenten ------------------------------ Für dieses Projekt benötigen wir die folgenden Komponenten. .. image:: ../img/list_Traffic_Light.png :align: center Es ist definitiv praktisch, ein komplettes Set zu kaufen, hier ist der Link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Name - ARTIKEL IN DIESEM KIT - LINK * - Raphael Kit - 337 - |link_Raphael_kit| Sie können sie auch einzeln über die untenstehenden Links kaufen. .. list-table:: :widths: 30 20 :header-rows: 1 * - KOMPONENTENBESCHREIBUNG - KAUF-LINK * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_led` - |link_led_buy| * - :ref:`cpn_4_digit` - \- * - :ref:`cpn_74hc595` - |link_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 ============ ======== ======== === .. image:: ../img/Schematic_three_one7.png :align: center Experimentelle Verfahren ----------------------------- **Schritt 1:** Schalten Sie die Schaltung. .. image:: ../img/image254.png **Schritt 2:** Verzeichnis wechseln. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Schritt 3:** Ausführen. .. raw:: html .. code-block:: sudo python3 4.1.12_TrafficLight.py Wenn der Code ausgeführt wird, simulieren die LEDs den Farbwechsel der Ampeln. Zunächst leuchtet die rote LED 60s lang, dann leuchtet die grüne LED 30s lang; anschließend leuchtet die gelbe LED 5s lang. Danach leuchtet die rote LED erneut 60s lang. Diese Reihenfolge von Aktionen wird wiederholt ausgeführt. Gleichzeitig zeigt die 4-stellige 7-Segment-Anzeige kontinuierlich die verbleibende Zeit an. Code ---------- .. note:: Sie können den untenstehenden Code **Modifizieren/Zurücksetzen/Kopieren/Ausführen/Stoppen**. Aber bevor Sie das tun, müssen Sie zum Quellcode-Pfad wie ``raphael-kit/python`` wechseln. Nachdem Sie den Code geändert haben, können Sie ihn direkt ausführen, um das Ergebnis zu sehen. .. raw:: html .. code-block:: python #!/usr/bin/env python3 import RPi.GPIO as GPIO import time import threading #define the pins connect to 74HC595 SDI = 24 #serial data input(DS) RCLK = 23 #memory clock input(STCP) SRCLK = 18 #shift register clock input(SHCP) number = (0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90) placePin = (10,22,27,17) ledPin =(25,8,7) greenLight = 30 yellowLight = 5 redLight = 60 lightColor=("Red","Green","Yellow") colorState=0 counter = 60 timer1 = 0 def setup(): GPIO.setmode(GPIO.BCM) GPIO.setup(SDI, GPIO.OUT) GPIO.setup(RCLK, GPIO.OUT) GPIO.setup(SRCLK, GPIO.OUT) for pin in placePin: GPIO.setup(pin,GPIO.OUT) for pin in ledPin: GPIO.setup(pin,GPIO.OUT) global timer1 timer1 = threading.Timer(1.0,timer) timer1.start() def clearDisplay(): for i in range(8): GPIO.output(SDI, 1) GPIO.output(SRCLK, GPIO.HIGH) GPIO.output(SRCLK, GPIO.LOW) GPIO.output(RCLK, GPIO.HIGH) GPIO.output(RCLK, GPIO.LOW) def hc595_shift(data): for i in range(8): GPIO.output(SDI, 0x80 & (data << i)) GPIO.output(SRCLK, GPIO.HIGH) GPIO.output(SRCLK, GPIO.LOW) GPIO.output(RCLK, GPIO.HIGH) GPIO.output(RCLK, GPIO.LOW) def pickDigit(digit): for i in placePin: GPIO.output(i,GPIO.LOW) GPIO.output(placePin[digit], GPIO.HIGH) def timer(): #timer function global counter global colorState global timer1 timer1 = threading.Timer(1.0,timer) timer1.start() counter-=1 if (counter is 0): if(colorState is 0): counter= greenLight if(colorState is 1): counter=yellowLight if (colorState is 2): counter=redLight colorState=(colorState+1)%3 print ("counter : %d color: %s "%(counter,lightColor[colorState])) def lightup(): global colorState for i in range(0,3): GPIO.output(ledPin[i], GPIO.HIGH) GPIO.output(ledPin[colorState], GPIO.LOW) def display(): global counter a = counter % 10000//1000 + counter % 1000//100 b = counter % 10000//1000 + counter % 1000//100 + counter % 100//10 c = counter % 10000//1000 + counter % 1000//100 + counter % 100//10 + counter % 10 if (counter % 10000//1000 == 0): clearDisplay() else: clearDisplay() pickDigit(3) hc595_shift(number[counter % 10000//1000]) if (a == 0): clearDisplay() else: clearDisplay() pickDigit(2) hc595_shift(number[counter % 1000//100]) if (b == 0): clearDisplay() else: clearDisplay() pickDigit(1) hc595_shift(number[counter % 100//10]) if(c == 0): clearDisplay() else: clearDisplay() pickDigit(0) hc595_shift(number[counter % 10]) def loop(): while True: display() lightup() def destroy(): # When "Ctrl+C" is pressed, the function is executed. global timer1 GPIO.cleanup() timer1.cancel() #cancel the timer if __name__ == '__main__': # Program starting from here setup() try: loop() except KeyboardInterrupt: destroy() **Code-Erklärung** .. code-block:: python SDI = 24 #serial data input(DS) RCLK = 23 #memory clock input(STCP) SRCLK = 18 #shift register clock input(SHCP) number = (0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90) placePin = (10,22,27,17) def clearDisplay(): def hc595_shift(data): def pickDigit(digit): def display(): Diese Codes werden verwendet, um die Nummernanzeige des 4-stelligen 7-Segment-Displays zu realisieren. Weitere Informationen finden Sie im Kapitel 1.1.5 des Dokuments. Hier verwenden wir die Codes zur Anzeige des Countdowns der Ampelzeit. .. code-block:: python ledPin =(25,8,7) colorState=0 def lightup(): global colorState for i in range(0,3): GPIO.output(ledPin[i], GPIO.HIGH) GPIO.output(ledPin[colorState], GPIO.LOW) Die Codes werden verwendet, um die LED ein- und auszuschalten. .. code-block:: python greenLight = 30 yellowLight = 5 redLight = 60 lightColor=("Red","Green","Yellow") colorState=0 counter = 60 timer1 = 0 def timer(): #timer function global counter global colorState global timer1 timer1 = threading.Timer(1.0,timer) timer1.start() counter-=1 if (counter is 0): if(colorState is 0): counter= greenLight if(colorState is 1): counter=yellowLight if (colorState is 2): counter=redLight colorState=(colorState+1)%3 print ("counter : %d color: %s "%(counter,lightColor[colorState])) Die Codes werden verwendet, um den Timer ein- und auszuschalten. Für weitere Informationen verweisen Sie auf Kapitel 1.1.5. Hier wird colorState umgeschaltet, um die LED umzuschalten, wenn der Timer zurück auf null geht. Anschließend wird dem Timer ein neuer Wert zugewiesen. .. code-block:: python def setup(): # ... global timer1 timer1 = threading.Timer(1.0,timer) timer1.start() def loop(): while True: display() lightup() def destroy(): # When "Ctrl+C" is pressed, the function is executed. global timer1 GPIO.cleanup() timer1.cancel() #cancel the timer if __name__ == '__main__': # Program starting from here setup() try: loop() except KeyboardInterrupt: destroy() In der Funktion ``setup()`` wird der Timer gestartet. In der Funktion ``loop()`` wird ein **while True** verwendet: die zugehörigen Funktionen des 4-stelligen 7-Segment-Displays und der LED werden zyklisch aufgerufen. Phänomen-Bild ------------------- .. image:: ../img/IMG_8319.jpg :align: center