Nota
Hola, ¡bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete más profundamente en Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.
¿Por qué unirse?
Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
Aprender y compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.
Avances exclusivos: Accede anticipadamente a nuevos anuncios de productos y adelantos exclusivos.
Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.
Promociones y sorteos festivos: Participa en sorteos y promociones navideñas.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.
4.1.3 Reloj Parlante
Introducción
En este proyecto, vamos a hacer un reloj parlante con un altavoz y un display de 7 segmentos de 4 dígitos. El display mostrará la hora y el altavoz anunciará la hora cada hora.
Componentes Necesarios
En este proyecto, necesitamos los siguientes componentes.
Es muy conveniente comprar un kit completo, aquí está el enlace:
Nombre |
ELEMENTOS EN ESTE KIT |
ENLACE |
|---|---|---|
Kit Raphael |
337 |
También puedes comprarlos por separado en los enlaces a continuación.
INTRODUCCIÓN DEL COMPONENTE |
ENLACE DE COMPRA |
|---|---|
- |
|
- |
|
Diagrama Esquemático
Nombre T-Board |
cableado físico |
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 |
Procedimientos Experimentales
Paso 1: Construye el circuito.
Antes de este proyecto, debes asegurarte de haber completado 3.1.4 Conversión de Texto a Voz.
Paso 2: Usa el comando date para ver la hora local.
date
Si la hora local es diferente de la hora real, necesitas usar el siguiente comando para configurar la zona horaria.
sudo dpkg-reconfigure tzdata
Elige tu zona horaria.
Paso 3: Accede a la carpeta del código.
cd ~/raphael-kit/python/
Paso 4: Ejecuta.
python3 4.1.3_SpeechClock.py
Después de ejecutar el código:
Se reproduce un mensaje de bienvenida: “Clock system started. Welcome!”
La pantalla de cuatro dígitos muestra la hora actual en formato HH:MM.
Al inicio de cada hora (cuando el minuto = 0), el sistema anuncia la hora actual una vez.
La pantalla se actualiza continuamente hasta que se presione
Ctrl+C, momento en el cual se liberan los recursos de GPIO.
Código
Nota
Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como raphael-kit/python. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.
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()
Explicación del código
Inicializa el motor de conversión de texto a voz (TTS) usando
espeaky establece el idioma en inglés.tts = TTS(engine="espeak") tts.lang('en-US')
Define los pines GPIO utilizados para el registro de desplazamiento (74HC595) y los pines de selección de dígitos para la pantalla de 4 dígitos.
SDI = 24 RCLK = 23 SRCLK = 25 placePin = (10, 22, 27, 17)
Almacena los valores de codificación de segmentos usados para mostrar los dígitos 0–9 en la pantalla de siete segmentos.
number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
Limpia la pantalla enviando ocho bits “1” al registro de desplazamiento.
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)
Envía un byte de datos de segmento al 74HC595 para actualizar el dígito mostrado.
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)
Selecciona una de las cuatro posiciones de dígito (miles, centenas, decenas, unidades) para realizar el multiplexado.
def pickDigit(digit): for pin in placePin: GPIO.output(pin, GPIO.LOW) GPIO.output(placePin[digit], GPIO.HIGH)
Lee la hora actual desde el reloj del sistema.
now = time.localtime() hour = now.tm_hour minute = now.tm_min
Actualiza cada dígito de la pantalla de siete segmentos para mostrar la hora actual en formato HH:MM.
hc595_shift(number[minute % 10]) hc595_shift(number[(minute // 10) % 10]) hc595_shift(number[hour % 10]) hc595_shift(number[(hour // 10) % 10])
Pronuncia la hora actual al inicio de cada hora usando TTS.
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
Reproduce un mensaje de bienvenida cuando el programa inicia.
tts.say("Clock system started. Welcome!")
Libera todos los pines GPIO cuando el usuario detiene el programa con
Ctrl+C.GPIO.cleanup()