Nota

Ciao, benvenuto nella Community Facebook di appassionati SunFounder Raspberry Pi & Arduino & ESP32! Approfondisci Raspberry Pi, Arduino ed ESP32 con altri appassionati.

Perché unirsi?

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

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

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.

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

  • Promozioni festive e giveaway: Partecipa a giveaway e promozioni festive.

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

2.2.1 Fotoresistenza (MCP3008)

Nota

../_images/mcp3008_and_adc0834.jpg

A seconda della versione del kit, identifica se hai ADC0834 o MCP3008 e procedi con la sezione corrispondente.

Introduzione

La fotoresistenza è un componente comunemente usato per rilevare l’intensità della luce ambientale. Aiuta il controller a riconoscere il giorno e la notte e a realizzare funzioni di controllo della luce, come ad esempio una lampada notturna. Questo progetto è molto simile a quello con il potenziometro, con la differenza che qui la variazione di tensione è legata all’intensità luminosa.

Componenti richiesti

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list2_2.2.1_photoresistor1.png

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

Nome

ARTICOLI IN QUESTO KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTE

LINK DI ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

LED

ACQUISTA

MCP3008

-

Fotoresistore

ACQUISTA

Schema elettrico

Nome T-Board

fisico

WiringPi

BCM

SPICE0

pin24

10

8

SPIMOSI

pin19

12

10

SPIMISO

pin21

13

9

SPISCLK

pin23

14

11

GPIO22

pin15

3

22

../_images/schematic_2.2.1_photoresistor_mcp30081.png

Procedure sperimentali

Passo 1: Costruisci il circuito.

../_images/july24_2.2.1_photoresistor_mcp30081.png

Passo 2: Configura l’interfaccia SPI e installa la libreria spidev (vedi Configurazione SPI per istruzioni dettagliate). Se hai già completato questi passaggi, puoi saltarli.

Passo 3: Vai alla cartella del codice.

cd ~/raphael-kit/python-pi5

Passo 4: Esegui il file eseguibile.

sudo python3 2.2.1-2_Photoresistor_zero.py

Quando il codice è in esecuzione, la luminosità del LED cambierà in base all’intensità della luce rilevata dalla fotoresistenza.

Avvertimento

Se compare l’errore RuntimeError: Cannot determine SOC peripheral base address, fai riferimento a If gpiozero doesn’t work.

Codice

Nota

Puoi Modificare/Resettare/Copiare/Eseguire/Fermare il codice qui sotto. Prima, però, devi andare al percorso del codice sorgente, ad esempio raphael-kit/python-pi5. Dopo aver modificato il codice, puoi eseguirlo direttamente per vederne l’effetto.

#!/usr/bin/env python3
import spidev
import time
from gpiozero import PWMLED

# Inizializza un LED PWM sul pin GPIO 22
led = PWMLED(22)

# Inizializza la comunicazione SPI (Bus 0, CE0 -> GPIO8)
spi = spidev.SpiDev()
spi.open(0, 0)  # Bus 0, CS0
spi.max_speed_hz = 1000000  # 1 MHz

# Funzione per leggere da un canale MCP3008 (0–7)
def read_adc(channel):
    """
    Legge un valore analogico da MCP3008 (0–1023)
    """
    if channel < 0 or channel > 7:
        return -1
    # Protocollo MCP3008: bit di avvio, modalità single-ended, canale (3 bit), filler
    r = spi.xfer2([1, (8 + channel) << 4, 0])
    value = ((r[1] & 3) << 8) | r[2]
    return value

# Funzione per mappare i valori da un intervallo a un altro
def MAP(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

# Ciclo principale per leggere il valore ADC e controllare la luminosità del LED
def loop():
    while True:
        # Legge il valore analogico dal canale 0 di MCP3008
        analogVal = read_adc(0)
        print('value = %d' % analogVal)

        # Mappa 0–1023 in intervallo PWM 0.0–1.0
        led.value = analogVal / 1023.0

        # Attende 0,2 secondi
        time.sleep(0.2)

# Esegue il ciclo principale e gestisce l'interruzione KeyboardInterrupt
try:
    loop()
except KeyboardInterrupt:
    led.value = 0  # Spegne il LED prima di uscire

Spiegazione del codice

  1. Questa parte importa la classe PWMLED dalla libreria gpiozero per il controllo dei LED PWM, spidev per la comunicazione SPI con MCP3008 e time per le funzioni di pausa/ritardo.

    import spidev
    import time
    from gpiozero import PWMLED
    
  2. Inizializza un LED PWM collegato al pin GPIO 22 e configura l’interfaccia SPI per MCP3008 (Bus 0, CE0) con una velocità di 1 MHz.

    led = PWMLED(22)
    spi = spidev.SpiDev()
    spi.open(0, 0)
    spi.max_speed_hz = 1000000
    
  3. Definisce una funzione per leggere un valore analogico da un canale specifico di MCP3008. Invia un comando di 3 byte tramite SPI e ricava un valore a 10 bit (0–1023) dalla risposta.

    def read_adc(channel):
        if channel < 0 or channel > 7:
            return -1
        r = spi.xfer2([1, (8 + channel) << 4, 0])
        value = ((r[1] & 3) << 8) | r[2]
        return value
    
  4. Definisce una funzione MAP() di supporto per convertire un numero da un intervallo a un altro, utile per mappare i valori dell’ADC nell’intervallo PWM.

    def MAP(x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
    
  5. Implementa un ciclo che legge continuamente il valore analogico dal canale 0 di MCP3008, lo converte in un valore di luminosità PWM (0.0–1.0) e lo applica al LED. Il ciclo si interrompe per 0,2 secondi ad ogni iterazione.

    def loop():
        while True:
            analogVal = read_adc(0)
            print('value = %d' % analogVal)
            led.value = analogVal / 1023.0
            time.sleep(0.2)
    
  6. Gestisce l’uscita con KeyboardInterrupt. Quando l’utente interrompe il programma (Ctrl+C), il LED viene spento prima della chiusura.

    try:
        loop()
    except KeyboardInterrupt:
        led.value = 0