Nota

Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti a noi?

  • Supporto esperto: Risolvi problemi post-vendita e 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: Ottieni accesso anticipato a nuovi annunci di prodotti e anteprime speciali.

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

  • Promozioni festive e omaggi: Partecipa a concorsi e promozioni durante le festività.

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

4.1.12 Semaforo

Introduzione

In questo progetto, utilizzeremo LED di tre colori per simulare il cambio dei semafori e utilizzeremo un display a quattro cifre a 7 segmenti per visualizzare il conto alla rovescia di ciascuno stato del traffico.

Componenti necessari

In questo progetto, avremo bisogno dei seguenti componenti.

../_images/list_Traffic_Light.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

LED

ACQUISTA

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

GPIO25

Pin 22

6

25

SPICE0

Pin 24

10

8

SPICE1

Pin 26

11

7

../_images/Schematic_three_one7.png

Procedure sperimentali

Passo 1: Costruisci il circuito.

../_images/image254.png

Passo 2: Cambia la directory.

cd ~/raphael-kit/python/

Passo 3: Esegui.

sudo python3 4.1.12_TrafficLight.py

Durante l’esecuzione del codice, i LED simuleranno il cambio di colore del semaforo. Prima si accenderà il LED rosso per 60 secondi, poi il LED verde per 30 secondi, infine il LED giallo per 5 secondi. Dopodiché, il LED rosso si accenderà nuovamente per 60 secondi. Questa serie di azioni verrà ripetuta ciclicamente. Nel frattempo, il display a 4 cifre a 7 segmenti mostrerà continuamente il conto alla rovescia.

Codice

Nota

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

#!/usr/bin/env python3

import RPi.GPIO as GPIO
import time
import threading

# Definisci i pin collegati al 74HC595
SDI   = 24      # Input dati seriale (DS)
RCLK  = 23      # Input clock di memoria (STCP)
SRCLK = 18      # Input clock del registro di scorrimento (SHCP)
number = (0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90)

placePin = (10,22,27,17)
ledPin =(25,8,7)

greenLight = 30
yellowLight = 5
redLight = 60
lightColor=("Red","Green","Yellow")

colorState=0
counter = 60
timer1 = 0


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)
    for pin in ledPin:
        GPIO.setup(pin,GPIO.OUT)
    global timer1
    timer1 = threading.Timer(1.0,timer)
    timer1.start()

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 timer():        # Funzione timer
    global counter
    global colorState
    global timer1
    timer1 = threading.Timer(1.0,timer)
    timer1.start()
    counter-=1
    if (counter is 0):
        if(colorState is 0):
            counter= greenLight
        if(colorState is 1):
            counter=yellowLight
        if (colorState is 2):
            counter=redLight
        colorState=(colorState+1)%3
    print ("counter : %d    color: %s "%(counter,lightColor[colorState]))

def lightup():
    global colorState
    for i in range(0,3):
        GPIO.output(ledPin[i], GPIO.HIGH)
    GPIO.output(ledPin[colorState], GPIO.LOW)

def display():
    global counter

    a = counter % 10000//1000 + counter % 1000//100
    b = counter % 10000//1000 + counter % 1000//100 + counter % 100//10
    c = counter % 10000//1000 + counter % 1000//100 + counter % 100//10 + counter % 10

    if (counter % 10000//1000 == 0):
        clearDisplay()
    else:
        clearDisplay()
        pickDigit(3)
        hc595_shift(number[counter % 10000//1000])

    if (a == 0):
        clearDisplay()
    else:
        clearDisplay()
        pickDigit(2)
        hc595_shift(number[counter % 1000//100])

    if (b == 0):
        clearDisplay()
    else:
        clearDisplay()
        pickDigit(1)
        hc595_shift(number[counter % 100//10])

    if(c == 0):
        clearDisplay()
    else:
        clearDisplay()
        pickDigit(0)
        hc595_shift(number[counter % 10])

def loop():
    while True:
        display()
        lightup()

def destroy():   # Quando viene premuto "Ctrl+C", viene eseguita questa funzione.
    global timer1
    GPIO.cleanup()
    timer1.cancel()      # Annulla il timer

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

Spiegazione del codice

SDI   = 24      # Input dati seriale (DS)
RCLK  = 23      # Input clock di memoria (STCP)
SRCLK = 18      # Input clock del registro di scorrimento (SHCP)
number = (0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90)
placePin = (10,22,27,17)

def clearDisplay():
def hc595_shift(data):
def pickDigit(digit):
def display():

Questi codici vengono utilizzati per realizzare la funzione di visualizzazione numerica del display a 4 cifre a 7 segmenti. Per ulteriori dettagli, fai riferimento al capitolo 1.1.5 del documento. Qui, utilizziamo i codici per visualizzare il conto alla rovescia del semaforo.

ledPin =(25,8,7)
colorState=0

def lightup():
    global colorState
    for i in range(0,3):
        GPIO.output(ledPin[i], GPIO.HIGH)
    GPIO.output(ledPin[colorState], GPIO.LOW)

Questi codici vengono utilizzati per accendere e spegnere i LED.

greenLight = 30
yellowLight = 5
redLight = 60
lightColor=("Red","Green","Yellow")

colorState=0
counter = 60
timer1 = 0

def timer():        # Funzione timer
    global counter
    global colorState
    global timer1
    timer1 = threading.Timer(1.0,timer)
    timer1.start()
    counter-=1
    if (counter is 0):
        if(colorState is 0):
            counter= greenLight
        if(colorState is 1):
            counter=yellowLight
        if (colorState is 2):
            counter=redLight
        colorState=(colorState+1)%3
    print ("counter : %d    color: %s "%(counter,lightColor[colorState]))

Questi codici vengono utilizzati per attivare e disattivare il timer. Fai riferimento al capitolo 1.1.5 per maggiori dettagli. Qui, quando il timer torna a zero, lo stato del colore verrà cambiato per modificare il LED, e il timer verrà assegnato a un nuovo valore.

def setup():
    # ...
    global timer1
    timer1 = threading.Timer(1.0,timer)
    timer1.start()

def loop():
    while True:
        display()
        lightup()

def destroy():   # Quando viene premuto "Ctrl+C", viene eseguita questa funzione.
    global timer1
    GPIO.cleanup()
    timer1.cancel()      # Annulla il timer

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

Nella funzione setup(), viene avviato il timer. Nella funzione loop(), viene utilizzato un ciclo while True per chiamare ciclicamente le funzioni relative al display a 4 cifre a 7 segmenti e ai LED.

Immagine del fenomeno

../_images/IMG_8319.jpg