Nota

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

Perché unirsi?

  • Supporto esperto: Risolvi i problemi post-vendita e le 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 l’accesso anticipato agli annunci dei 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 Fotoresistore (MCP3008)

Nota

../_images/mcp3008_and_adc0834.jpg

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

Introduzione

Il fotoresistore è 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 le lampade notturne. Questo progetto è molto simile al potenziometro, ma invece di variare la tensione manualmente, lo fa in base alla luce rilevata.

Componenti richiesti

In questo progetto utilizzeremo i seguenti componenti.

../_images/list2_2.2.1_photoresistor.png

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

Nome

ELEMENTI INCLUSI NEL KIT

LINK

Kit Raphael

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_mcp3008.png

Procedure sperimentali

Passo 1: Monta il circuito.

../_images/2.2.1_Photoresistor_bb.png

Passo 2: Vai alla cartella del codice.

cd ~/raphael-kit/nodejs/

Passo 3: Esegui il codice.

sudo node photoresistor-2.js

Codice

const Gpio = require('pigpio').Gpio;
const mcpadc = require('mcp-spi-adc');

// Apri il canale MCP3008 0 (ingresso analogico CH0)
const adc = mcpadc.openMcp3008(0, { speedHz: 1350000 }, (err) => {
if (err) {
    console.error("Impossibile aprire MCP3008:", err);
    process.exit(1);
}

console.log("MCP3008 inizializzato su SPI0/CE0.");

// Inizializza LED su GPIO22 (compatibile PWM)
const led = new Gpio(22, { mode: Gpio.OUTPUT });

// Legge l'ADC e aggiorna la luminosità del LED ogni 100ms
const interval = setInterval(() => {
    adc.read((err, reading) => {
    if (err) {
        console.error("Errore di lettura ADC:", err);
        return;
    }

    const adcValue = reading.value;          // Valore float tra 0.0 e 1.0
    const pwmValue = Math.round(adcValue * 255); // Scala a 0–255

    console.log(`ADC = ${adcValue.toFixed(4)}, PWM = ${pwmValue}`);

    led.pwmWrite(pwmValue); // Aggiorna la luminosità del LED
    });
}, 100);

// Gestisce Ctrl+C (SIGINT) per spegnimento pulito
process.on('SIGINT', () => {
    console.log('\nSpegnimento in corso...');
    clearInterval(interval);  // Ferma il ciclo
    led.digitalWrite(0);      // Spegne il LED
    process.exit(0);
});
});

Spiegazione del codice

const Gpio = require('pigpio').Gpio;

Questa riga importa il modulo pigpio, utilizzato per controllare i pin GPIO del Raspberry Pi. Supporta l’uscita PWM necessaria per regolare la luminosità del LED.

const mcpadc = require('mcp-spi-adc');

Questa riga importa la libreria mcp-spi-adc, che abilita la comunicazione con il convertitore analogico-digitale MCP3008 utilizzando l’interfaccia SPI hardware del Raspberry Pi.

const adc = mcpadc.openMcp3008(0, { speedHz: 1350000 }, (err) => { ... });

Apre il canale di ingresso analogico 0 del chip MCP3008 usando SPI hardware. La velocità di clock SPI è impostata a 1,35 MHz. Se si verifica un errore durante l’apertura del canale, il programma lo registra e termina.

const led = new Gpio(22, { mode: Gpio.OUTPUT });

Inizializza il pin GPIO22 come uscita. Questo pin viene utilizzato per controllare la luminosità di un LED tramite PWM con la libreria pigpio.

setInterval(() => {
    adc.read((err, reading) => {
        ...
    });
}, 100);

Imposta un ciclo ricorrente ogni 100 millisecondi. In ogni ciclo legge il valore analogico dal canale 0 dell’MCP3008. Il risultato è un numero in virgola mobile tra 0.0 e 1.0, che rappresenta il rapporto tra tensione di ingresso e tensione di riferimento.

const pwmValue = Math.round(adcValue * 255);
led.pwmWrite(pwmValue);

Converte il valore analogico in un valore PWM a 8 bit nell’intervallo 0–255, quindi lo scrive su GPIO22 per regolare proporzionalmente la luminosità del LED.

process.on('SIGINT', () => {
    clearInterval(interval);
    led.digitalWrite(0);
    process.exit(0);
});

Aggiunge un gestore del segnale per terminare correttamente il programma quando si preme Ctrl+C. Ferma il ciclo, spegne il LED e chiude il programma in modo pulito.