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

Una volta eseguito il codice, il display a 7 segmenti a 4 cifre mostrerà l’ora e suonerà ogni ora.

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

tts = TTS(engine="espeak")
tts.lang('en-US')

SDI = 24
RCLK = 23
SRCLK = 18

placePin = (10, 22, 27, 17)
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 i in placePin:
        GPIO.setup(i, GPIO.OUT)

def clearDisplay():
    for i 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):
    for i in placePin:
        GPIO.output(i,GPIO.LOW)
    GPIO.output(placePin[digit], GPIO.HIGH)

def loop():
    status = 0
    while True:
        time.localtime(time.time())
        hour = int(time.strftime('%H',time.localtime(time.time())))
        minute = int(time.strftime('%M',time.localtime(time.time())))

        clearDisplay()
        pickDigit(0)
        hc595_shift(number[minute % 10])

        clearDisplay()
        pickDigit(1)
        hc595_shift(number[minute % 100//10])

        clearDisplay()
        pickDigit(2)
        hc595_shift(number[hour % 10])

        clearDisplay()
        pickDigit(3)
        hc595_shift(number[hour % 100//10])

        if minute == 0 and status == 0:
            tts.say('The time is now ' + str(hour) + ' hours and ' + str(minute) + ' minutes')
            status = 1
        elif minute != 0:
            status = 0

def destroy():   # Quando viene premuto "Ctrl+C", la funzione viene eseguita.
    GPIO.cleanup()

if __name__ == '__main__':  # Il programma inizia qui
    setup()
    try:
        loop()
    except KeyboardInterrupt:
        destroy()

Spiegazione del Codice

time.localtime(time.time())
hour = int(time.strftime('%H',time.localtime(time.time())))
minute = int(time.strftime('%M',time.localtime(time.time())))

Attraverso la funzione time.time(), possiamo ottenere il timestamp dell’ora corrente (il numero di secondi in virgola mobile trascorsi dall’epoca del 1970), e quindi utilizzare il metodo di formattazione dell’ora del modulo time (time.localtime(time.time())) per elaborare il timestamp corrente, in modo da poter formattare il timestamp come ora locale.

Il risultato dell’input è:

time.struct_time(tm_year=2021, tm_mon=5, tm_mday=28, tm_hour=13, tm_min=54, tm_sec=26, tm_wday=4, tm_yday=148, tm_isdst=0)

Infine, utilizziamo il metodo time.strftime() per formattare questa lunga stringa di informazioni nel formato desiderato. Se desideri ottenere l’ora corrente, puoi ottenerla con la funzione time.strftime('%H',time.localtime(time.time())) .

Di seguito sono elencati i risultati del formato specificato ottenuto modificando il primo parametro.

%y

Rappresentazione dell’anno a due cifre (00-99)

%Y

Four-digit year representation(000-9999)

%m

mese (01-12)

%H

Giorno del mese (0-31)

%I

Ore in un orologio a 24 ore (0-23)

%M

Ore in un orologio a 12 ore (01-12)

%y

Minuti (00-59)

%S

secondi (00-59)

%a

Nome abbreviato del giorno della settimana

%A

Nome completo del giorno della settimana

%b

Nome abbreviato del mese

%B

Nome completo del mese

%c

Data e ora locali corrispondenti

%j

Giorno dell’anno (001-366)

%p

Equivalente di A.M. o P.M. locale

%U

Num of weeks of one year(00-53)starting with Sunday

%w

Settimana (0-6), a partire da domenica

%W

Num of weeks of one year(00-53)starting with Monday

%x

Rappresentazione della data corrispondente locale

%X

Rappresentazione dell’ora corrispondente locale

%Z

Nome del fuso orario corrente

Nota

L’output del metodo time.strftime() è costituito da variabili stringa. Prima di utilizzarlo, ricordati di effettuare una conversione forzata del tipo.

clearDisplay()
pickDigit(0)
hc595_shift(number[minute % 10])

clearDisplay()
pickDigit(1)
hc595_shift(number[minute % 100//10])

clearDisplay()
pickDigit(2)
hc595_shift(number[hour % 10])

clearDisplay()
pickDigit(3)
hc595_shift(number[hour % 100//10])

La decina delle ore viene visualizzata sul primo display a 7 segmenti, mentre l’unità viene visualizzata sul secondo. Poi la decina dei minuti viene visualizzata sul terzo display digitale, e l’unità viene visualizzata sull’ultimo.

if minute == 0 and status == 0:
    tts.say('The time is now ' + str(hour) + ' hours and ' + str(minute) + ' minutes')
    status = 1
elif minute != 0:
    status = 0

Quando i minuti sono 0 (ad ogni ora), il Raspberry Pi utilizzerà il TTS per annunciare l’ora.

Immagine del fenomeno

../_images/4.1.3speech_clock.JPG