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