.. note::
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 [|link_sf_facebook|] e unisciti oggi stesso!
.. _2.2.1_js_pi5_mcp3008:
2.2.1 Fotoresistore (MCP3008)
===============================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
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.
.. image:: ../img/list2_2.2.1_photoresistor.png
È sicuramente conveniente acquistare un kit completo, ecco il link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nome
- ELEMENTI INCLUSI NEL KIT
- LINK
* - Kit Raphael
- 337
- |link_Raphael_kit|
Puoi anche acquistarli separatamente dai link sottostanti.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUZIONE COMPONENTE
- LINK DI ACQUISTO
* - :ref:`cpn_gpio_extension_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_led`
- |link_led_buy|
* - :ref:`cpn_mcp3008`
- \-
* - :ref:`cpn_photoresistor`
- |link_photoresistor_buy|
Schema elettrico
--------------------
.. list-table::
:widths: 30 30 30 30
:header-rows: 1
* - 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
.. image:: ../img/schematic_2.2.1_photoresistor_mcp3008.png
Procedure sperimentali
-----------------------
**Passo 1:** Monta il circuito.
.. image:: ../img/2.2.1_Photoresistor_bb.png
**Passo 2:** Vai alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/raphael-kit/nodejs/
**Passo 3:** Esegui il codice.
.. raw:: html
.. code-block::
sudo node photoresistor-2.js
**Codice**
.. code-block:: js
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**
.. code-block:: js
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.
.. code-block:: js
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.
.. code-block:: js
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.
.. code-block:: js
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``.
.. code-block:: js
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.
.. code-block:: js
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.
.. code-block:: js
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.