.. note:: ¡Hola, bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a 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. - **Preestrenos exclusivos**: Obtén acceso anticipado a nuevos anuncios de productos y avances. - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes. - **Promociones y sorteos festivos**: Participa en sorteos y promociones especiales 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 Fotoresistor (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 procede con la sección correspondiente. Introducción ------------ El fotoresistor es un componente comúnmente usado para detectar la intensidad de la luz ambiental. Ayuda al controlador a reconocer el día y la noche y realizar funciones de control de luz, como lámparas nocturnas. Este proyecto es muy similar al potenciómetro, y podrías pensar que cambia el voltaje para detectar la luz. Componentes requeridos ---------------------- En este proyecto, necesitamos los siguientes componentes. .. image:: ../img/list2_2.2.1_photoresistor.png Es definitivamente conveniente comprar un kit completo, aquí tienes el enlace: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nombre - ELEMENTOS EN ESTE KIT - ENLACE * - Kit Raphael - 337 - |link_Raphael_kit| También puedes comprarlos por separado en los siguientes enlaces. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCCIÓN DEL COMPONENTE - ENLACE DE COMPRA * - :ref:`cpn_gpio_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| Diagrama esquemático -------------------- .. list-table:: :widths: 30 30 30 30 :header-rows: 1 * - Nombre - T-Board - 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 Procedimientos experimentales ----------------------------- **Paso 1:** Construir el circuito. .. image:: ../img/2.2.1_Photoresistor_bb.png **Paso 2:** Ir a la carpeta del código. .. raw:: html .. code-block:: cd ~/raphael-kit/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 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 ADC y actualizar 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; // 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 brillo del LED }); }, 100); // Manejar Ctrl+C (SIGINT) para limpieza process.on('SIGINT', () => { console.log('\nCerrando correctamente...'); clearInterval(interval); // Detener el bucle del 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 de la Raspberry Pi. Soporta 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 convertidor analógico-digital MCP3008 utilizando la interfaz SPI 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 usando SPI por hardware. La velocidad de reloj SPI está configurada 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 GPIO22 como salida. Este pin se usa para controlar el brillo de un LED mediante PWM con 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 de referencia. .. code-block:: js const pwmValue = Math.round(adcValue * 255); led.pwmWrite(pwmValue); Convierte el valor analógico en un valor PWM de 8 bits en el rango 0–255, y lo escribe en el GPIO22 para ajustar proporcionalmente el brillo del LED. .. code-block:: js process.on('SIGINT', () => { clearInterval(interval); led.digitalWrite(0); process.exit(0); }); Agrega un manejador de señales para cerrar el programa de manera segura cuando se presiona ``Ctrl+C``. Detiene el bucle del intervalo, apaga el LED y finaliza el programa de forma correcta.