Nota

Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci l’esplorazione del Raspberry Pi, Arduino ed ESP32 con altri appassionati.

Perché unirti a noi?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Accedi in anteprima agli annunci di nuovi prodotti e alle anticipazioni esclusive.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni e omaggi festivi: Partecipa a omaggi e promozioni speciali durante le festività.

👉 Sei pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

4.1.3 Orologio parlante

Introduzione

In questo progetto, realizziamo un orologio vocale con un altoparlante e un display a 7 segmenti a 4 cifre. Il display mostrerà l’ora, mentre l’altoparlante annuncerà l’ora ogni ora.

Componenti necessari

In questo progetto avremo bisogno dei seguenti componenti.

../_images/3.1.17components.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Modulo Audio e Altoparlante

-

Display a 7 Segmenti da 4 Cifre

-

74HC595

ACQUISTA

Schema elettrico

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

Procedura sperimentale

Passo 1: Costruisci il circuito.

../_images/3.1.17fritzing.png

Prima di iniziare questo progetto, assicurati di aver completato 3.1.4 Sintesi vocale (Text-to-speech).

Passo 2: Utilizza il comando date per visualizzare l’ora locale.

date

Se l’ora locale è diversa dall’ora reale, utilizza il seguente comando per impostare il fuso orario.

sudo dpkg-reconfigure tzdata

Scegli il tuo fuso orario.

../_images/tzdata.png

Passo 3: Accedi alla cartella del codice.

cd ~/raphael-kit/python/

Passo 3: Esegui.

python3 4.1.3_SpeechClock.py

Dopo l’esecuzione del programma:

  • Viene pronunciato un messaggio di benvenuto: “Clock system started. Welcome!”

  • Il display a quattro cifre mostra l’ora corrente nel formato HH:MM.

  • All’inizio di ogni ora (quando il minuto = 0), il sistema annuncia l’ora corrente una sola volta.

  • Il display si aggiorna continuamente finché non viene premuto Ctrl+C; a quel punto le risorse GPIO vengono ripristinate e il programma termina correttamente.

Codice

Nota

Puoi Modificare/Resettare/Copiare/Eseguire/Fermare il codice qui sotto. Ma prima di farlo, devi andare nel percorso del codice sorgente, come raphael-kit/python. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.

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()

Spiegazione del Codice

  1. Inizializza il motore di sintesi vocale utilizzando espeak e imposta la lingua su inglese.

    tts = TTS(engine="espeak")
    tts.lang('en-US')
    
  2. Definisce i pin GPIO utilizzati per il registro a scorrimento (74HC595) e i pin di selezione delle cifre per il display a 4 digit.

    SDI = 24
    RCLK = 23
    SRCLK = 25
    placePin = (10, 22, 27, 17)
    
  3. Memorizza i valori di codifica dei segmenti utilizzati per visualizzare le cifre 0–9 sul display a sette segmenti.

    number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
    
  4. Pulisce il display inviando otto bit “1” al registro a scorrimento.

    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. Invia un byte di dati dei segmenti al 74HC595 per aggiornare la cifra visualizzata.

    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. Seleziona una delle quattro posizioni delle cifre (migliaia, centinaia, decine, unità) per la multiplexazione.

    def pickDigit(digit):
        for pin in placePin:
            GPIO.output(pin, GPIO.LOW)
        GPIO.output(placePin[digit], GPIO.HIGH)
    
  7. Legge l’ora corrente dall’orologio di sistema.

    now = time.localtime()
    hour = now.tm_hour
    minute = now.tm_min
    
  8. Aggiorna ciascuna cifra sul display a sette segmenti per mostrare l’ora corrente nel 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])
    
  9. Annuncia l’ora corrente tramite sintesi vocale una volta all’inizio di ogni ora.

    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. Riproduce un messaggio di benvenuto quando il programma viene avviato.

    tts.say("Clock system started. Welcome!")
    
  11. Ripristina lo stato dei pin GPIO quando l’utente interrompe il programma con Ctrl+C.

    GPIO.cleanup()
    

Immagine del fenomeno

../_images/4.1.3speech_clock.JPG