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.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.

../_images/3.1.17components.png

Es ist definitiv praktisch, ein ganzes Set 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.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

GPIO Extension Board

KAUFEN

Steckbrett

KAUFEN

Jumper-Kabel

KAUFEN

Widerstand

KAUFEN

Audio-Modul und Lautsprecher

-

4-stellige 7-Segment-Anzeige

-

74HC595

KAUFEN

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

../_images/4.1.3_speechclock_schematic.png ../_images/3.1.17_schematic.png

Experimentelle Verfahren

Schritt 1: Bauen Sie den Schaltkreis.

../_images/3.1.17fritzing.png

Vor diesem Projekt müssen Sie sicherstellen, dass Sie 3.1.4 Text-in-Sprache abgeschlossen haben.

Schritt 2: Verwenden Sie den Befehl date, um die lokale Zeit anzuzeigen.

date

Wenn die lokale Zeit nicht mit der tatsächlichen Zeit übereinstimmt, müssen Sie den folgenden Befehl verwenden, um die Zeitzone einzustellen.

sudo dpkg-reconfigure tzdata

Wählen Sie Ihre Zeitzone aus.

../_images/tzdata.png

Schritt 3: Gehen Sie in den Ordner des Codes.

cd ~/raphael-kit/python/

Schritt 4: Ausführen.

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

Bemerkung

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.

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

  1. Initialisiert die Text-to-Speech-Engine mit espeak und setzt die Sprache auf Englisch.

    tts = TTS(engine="espeak")
    tts.lang('en-US')
    
  2. Definiert die GPIO-Pins für das Schieberegister (74HC595) sowie die Stellenwahl-Pins für die 4-stellige Anzeige.

    SDI = 24
    RCLK = 23
    SRCLK = 25
    placePin = (10, 22, 27, 17)
    
  3. Speichert die Segmentkodierungen zur Darstellung der Ziffern 0–9 auf der Sieben-Segment-Anzeige.

    number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
    
  4. Löscht die Anzeige, indem acht „1“-Bits in das Schieberegister übertragen werden.

    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)
    
  5. Sendet ein Byte Segmentdaten an den 74HC595, um die dargestellte Ziffer zu aktualisieren.

    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)
    
  6. Wählt eine der vier Stellen (Tausender, Hunderter, Zehner, Einer) für das Multiplex-Verfahren aus.

    def pickDigit(digit):
        for pin in placePin:
            GPIO.output(pin, GPIO.LOW)
        GPIO.output(placePin[digit], GPIO.HIGH)
    
  7. Liest die aktuelle Uhrzeit aus der Systemzeit.

    now = time.localtime()
    hour = now.tm_hour
    minute = now.tm_min
    
  8. Aktualisiert jede Stelle der Sieben-Segment-Anzeige, um die Uhrzeit im Format HH:MM darzustellen.

    hc595_shift(number[minute % 10])
    hc595_shift(number[(minute // 10) % 10])
    hc595_shift(number[hour % 10])
    hc595_shift(number[(hour // 10) % 10])
    
  9. Spricht die aktuelle Uhrzeit zu Beginn jeder vollen Stunde per Text-to-Speech aus.

    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
    
  10. Gibt beim Start des Programms eine Willkommensmeldung aus.

    tts.say("Clock system started. Welcome!")
    
  11. Räumt alle GPIO-Pins auf, wenn der Benutzer das Programm mit Ctrl+C beendet.

    GPIO.cleanup()
    

Phänomen-Bild

../_images/4.1.3speech_clock.JPG