.. 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.3_py: 4.1.3 Sprachuhr ========================== Einführung ----------------- In diesem Projekt werden wir eine Sprachuhr mit einem Lautsprecher und einer 4-stelligen 7-Segment-Anzeige erstellen. Die 4-stellige 7-Segment-Anzeige zeigt die Uhrzeit an, und der Lautsprecher gibt die Uhrzeit stündlich aus. Benötigte Komponenten ------------------------------ Für dieses Projekt benötigen wir die folgenden Komponenten. .. image:: ../img/3.1.17components.png :width: 800 :align: center Es ist definitiv praktisch, ein ganzes 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_audio_speaker` - \- * - :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 ============ ======== ======== === .. image:: ../img/4.1.3_speechclock_schematic.png :width: 700 :align: center .. image:: ../img/3.1.17_schematic.png :width: 400 :align: center Experimentelle Verfahren ---------------------------- **Schritt 1:** Bauen Sie den Schaltkreis. .. image:: ../img/3.1.17fritzing.png :width: 900 :align: center Vor diesem Projekt müssen Sie sicherstellen, dass Sie :ref:`3.1.4_py` abgeschlossen haben. **Schritt 2:** Verwenden Sie den Befehl ``date``, um die lokale Zeit anzuzeigen. .. raw:: html .. code-block:: date Wenn die lokale Zeit nicht mit der tatsächlichen Zeit übereinstimmt, müssen Sie den folgenden Befehl verwenden, um die Zeitzone einzustellen. .. raw:: html .. code-block:: sudo dpkg-reconfigure tzdata Wählen Sie Ihre Zeitzone aus. .. image:: ../img/tzdata.png **Schritt 3:** Gehen Sie in den Ordner des Codes. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Schritt 4:** Ausführen. .. raw:: html .. code-block:: python3 4.1.3_SpeechClock.py Nach dem Ausführen des Codes: - Es wird eine Willkommensnachricht gesprochen: „Clock system started. Welcome!“ - Die vierstellige Anzeige zeigt die aktuelle Uhrzeit im HH:MM-Format an. - Zu Beginn jeder vollen Stunde (Minute = 0) gibt das System die aktuelle Uhrzeit einmal per Sprachausgabe aus. - Die Anzeige wird kontinuierlich aktualisiert, bis ``Ctrl+C`` gedrückt wird; anschließend werden die GPIO-Ressourcen bereinigt. **Code** .. note:: Sie können den untenstehenden Code **Modifizieren/Zurücksetzen/Kopieren/Ausführen/Stoppen**. Davor müssen Sie jedoch zum Quellcodepfad wie ``raphael-kit/python`` gehen. Nach der Modifikation können Sie ihn direkt ausführen, um den Effekt zu sehen. .. raw:: html .. code-block:: python import RPi.GPIO as GPIO from tts import TTS import time # Initialize TTS tts = TTS(engine="espeak") tts.lang('en-US') # GPIO pins SDI = 24 RCLK = 23 SRCLK = 25 placePin = (10, 22, 27, 17) # Seven-segment encoding number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90) 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) def clearDisplay(): for _ 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): # Turn all digits off for pin in placePin: GPIO.output(pin, GPIO.LOW) # Turn selected digit ON GPIO.output(placePin[digit], GPIO.HIGH) def loop(): status = 0 while True: now = time.localtime() hour = now.tm_hour minute = now.tm_min # Display minute (unit) clearDisplay() pickDigit(0) hc595_shift(number[minute % 10]) # Display minute (tens) clearDisplay() pickDigit(1) hc595_shift(number[(minute // 10) % 10]) # Display hour (unit) clearDisplay() pickDigit(2) hc595_shift(number[hour % 10]) # Display hour (tens) clearDisplay() pickDigit(3) hc595_shift(number[(hour // 10) % 10]) # Speak once every hour (at minute == 0) if minute == 0 and status == 0: tts.say(f'The time is now {hour} hours and {minute} minutes') time.sleep(3) # Give time to finish speaking status = 1 elif minute != 0: status = 0 time.sleep(0.005) # Prevent CPU overload def destroy(): GPIO.cleanup() if __name__ == '__main__': setup() # ★ Welcome message at startup tts.say("Clock system started. Welcome!") time.sleep(3) try: loop() except KeyboardInterrupt: destroy() **Code-Erklärung** #. Initialisiert die Text-to-Speech-Engine mit ``espeak`` und setzt die Sprache auf Englisch. .. code-block:: python tts = TTS(engine="espeak") tts.lang('en-US') #. Definiert die GPIO-Pins für das Schieberegister (74HC595) sowie die Stellenwahl-Pins für die 4-stellige Anzeige. .. code-block:: python SDI = 24 RCLK = 23 SRCLK = 25 placePin = (10, 22, 27, 17) #. Speichert die Segmentkodierungen zur Darstellung der Ziffern 0–9 auf der Sieben-Segment-Anzeige. .. code-block:: python number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90) #. Löscht die Anzeige, indem acht „1“-Bits in das Schieberegister übertragen werden. .. code-block:: python def clearDisplay(): for _ 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) #. Sendet ein Byte Segmentdaten an den 74HC595, um die dargestellte Ziffer zu aktualisieren. .. code-block:: python 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) #. Wählt eine der vier Stellen (Tausender, Hunderter, Zehner, Einer) für das Multiplex-Verfahren aus. .. code-block:: python def pickDigit(digit): for pin in placePin: GPIO.output(pin, GPIO.LOW) GPIO.output(placePin[digit], GPIO.HIGH) #. Liest die aktuelle Uhrzeit aus der Systemzeit. .. code-block:: python now = time.localtime() hour = now.tm_hour minute = now.tm_min #. Aktualisiert jede Stelle der Sieben-Segment-Anzeige, um die Uhrzeit im Format HH:MM darzustellen. .. code-block:: python hc595_shift(number[minute % 10]) hc595_shift(number[(minute // 10) % 10]) hc595_shift(number[hour % 10]) hc595_shift(number[(hour // 10) % 10]) #. Spricht die aktuelle Uhrzeit zu Beginn jeder vollen Stunde per Text-to-Speech aus. .. code-block:: python if minute == 0 and status == 0: tts.say(f'The time is now {hour} hours and {minute} minutes') status = 1 elif minute != 0: status = 0 #. Gibt beim Start des Programms eine Willkommensmeldung aus. .. code-block:: python tts.say("Clock system started. Welcome!") #. Räumt alle GPIO-Pins auf, wenn der Benutzer das Programm mit ``Ctrl+C`` beendet. .. code-block:: python GPIO.cleanup() Phänomen-Bild ------------------------ .. image:: ../img/4.1.3speech_clock.JPG :align: center