.. note:: ¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas. **¿Por qué unirse?** - **Soporte experto**: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo. - **Aprender y compartir**: Intercambia consejos y tutoriales para mejorar tus habilidades. - **Vistas previas exclusivas**: Obtén acceso anticipado a anuncios de nuevos productos y adelantos. - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más nuevos. - **Promociones y sorteos festivos**: Participa en sorteos y promociones de temporada. 👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo. .. _2.2.1_js_pi5_mcp3008: 2.2.1 Fotorresistor (MCP3008) ============================= .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left Dependiendo de la versión de tu kit, identifica si tienes **ADC0834** o **MCP3008** y continúa con la sección correspondiente. Introducción ------------ El fotorresistor es un componente comúnmente utilizado para medir la intensidad de la luz ambiental. Ayuda al controlador a distinguir entre día y noche y a realizar funciones de control de luz, como las lámparas nocturnas. Este proyecto es muy similar al del potenciómetro, y podrías pensar en él como un cambio de voltaje para detectar la luz. Componentes necesarios ---------------------- En este proyecto, necesitaremos los siguientes componentes. .. image:: ../img/list2_2.2.1_photoresistor.png Diagrama esquemático -------------------- .. list-table:: :widths: 30 30 30 30 :header-rows: 1 * - Nombre T-Board - Físico - 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 Procedimiento experimental -------------------------- **Paso 1:** Montar el circuito. .. image:: ../img/2.2.1_Photoresistor_bb.png **Paso 2:** Ir a la carpeta del código. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/nodejs/ **Paso 3:** Ejecutar el código. .. raw:: html .. code-block:: sudo node photoresistor-2.js **Código** .. code-block:: js const Gpio = require('pigpio').Gpio; const mcpadc = require('mcp-spi-adc'); // Abrir canal 0 del MCP3008 (entrada analógica CH0) const adc = mcpadc.openMcp3008(0, { speedHz: 1350000 }, (err) => { if (err) { console.error("No se pudo abrir el MCP3008:", err); process.exit(1); } console.log("MCP3008 inicializado en SPI0/CE0."); // Inicializar LED en GPIO22 (compatible con PWM) const led = new Gpio(22, { mode: Gpio.OUTPUT }); // Configurar intervalo para leer el ADC y actualizar el brillo del LED cada 100ms const interval = setInterval(() => { adc.read((err, reading) => { if (err) { console.error("Error de lectura del ADC:", err); return; } const adcValue = reading.value; // Valor flotante entre 0.0 y 1.0 const pwmValue = Math.round(adcValue * 255); // Escalar a 0–255 console.log(`ADC = ${adcValue.toFixed(4)}, PWM = ${pwmValue}`); led.pwmWrite(pwmValue); // Actualizar el brillo del LED }); }, 100); // Manejar Ctrl+C (SIGINT) para limpiar process.on('SIGINT', () => { console.log('\nCerrando de forma segura...'); clearInterval(interval); // Detener el bucle de intervalo led.digitalWrite(0); // Apagar LED process.exit(0); }); }); **Explicación del código** .. code-block:: js const Gpio = require('pigpio').Gpio; Esta línea importa el módulo ``pigpio``, que se utiliza para controlar los pines GPIO en la Raspberry Pi. Admite salida PWM necesaria para atenuar un LED. .. code-block:: js const mcpadc = require('mcp-spi-adc'); Esta línea importa la librería ``mcp-spi-adc``, que permite la comunicación con el conversor analógico-digital MCP3008 utilizando la interfaz SPI por hardware de la Raspberry Pi. .. code-block:: js const adc = mcpadc.openMcp3008(0, { speedHz: 1350000 }, (err) => { ... }); Abre el canal de entrada analógica 0 del chip MCP3008 utilizando SPI por hardware. La velocidad del reloj SPI se establece en 1.35 MHz. Si ocurre un error al abrir el canal, el programa lo registra y finaliza. .. code-block:: js const led = new Gpio(22, { mode: Gpio.OUTPUT }); Inicializa el pin GPIO 22 como salida. Este pin se utiliza para controlar el brillo de un LED mediante PWM a través de la librería ``pigpio``. .. code-block:: js setInterval(() => { adc.read((err, reading) => { ... }); }, 100); Configura un bucle recurrente que se ejecuta cada 100 milisegundos. En cada ciclo, lee el valor analógico del canal 0 del MCP3008. El resultado es un número flotante entre 0.0 y 1.0 que representa la relación entre el voltaje de entrada y el voltaje de referencia. .. code-block:: js const pwmValue = Math.round(adcValue * 255); led.pwmWrite(pwmValue); Convierte el valor analógico a un valor PWM de 8 bits en el rango 0–255, y luego lo escribe en el GPIO22 para ajustar el brillo del LED proporcionalmente. .. code-block:: js process.on('SIGINT', () => { clearInterval(interval); led.digitalWrite(0); process.exit(0); }); Agrega un manejador de señal para cerrar el programa de forma segura cuando se presione ``Ctrl+C``. Detiene el bucle de intervalo, apaga el LED y finaliza el programa correctamente.