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
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.
È sicuramente conveniente acquistare un kit completo, ecco il link:
Nome |
ELEMENTI INCLUSI NEL KIT |
LINK |
|---|---|---|
Kit Raphael |
337 |
Puoi anche acquistarli separatamente dai link sottostanti.
INTRODUZIONE COMPONENTE |
LINK DI ACQUISTO |
|---|---|
- |
|
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 |
Procedure sperimentali
Passo 1: Monta il circuito.
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.