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.
Es ist definitiv praktisch, ein ganzes Set zu kaufen, hier ist der Link:
Name |
ARTIKEL IN DIESEM KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Sie können sie auch einzeln über die untenstehenden Links kaufen.
KOMPONENTENBESCHREIBUNG |
KAUF-LINK |
|---|---|
- |
|
- |
|
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 |
Experimentelle Verfahren
Schritt 1: Bauen Sie den Schaltkreis.
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.
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+Cgedrü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
Initialisiert die Text-to-Speech-Engine mit
espeakund setzt die Sprache auf Englisch.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.
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.
number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
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)
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)
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)
Liest die aktuelle Uhrzeit aus der Systemzeit.
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.
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.
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.
tts.say("Clock system started. Welcome!")
Räumt alle GPIO-Pins auf, wenn der Benutzer das Programm mit
Ctrl+Cbeendet.GPIO.cleanup()