.. 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.
- **Aprende y comparte**: Intercambia consejos y tutoriales para mejorar tus habilidades.
- **Avances exclusivos**: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.
- **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
- **Promociones festivas y sorteos**: 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_c_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 procede 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 reconocer el día y la noche y a realizar funciones
de control de luz como lámparas nocturnas. Este proyecto es muy similar
al del potenciómetro, y puedes 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í está el enlace:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nombre
- ARTÍCULOS 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 de la T-Board
- physical
- 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:** Construye el circuito.
.. image:: ../img/july24_2.2.1_photoresistor_mcp3008.png
**Paso 2:** Ve a la carpeta del código.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/2.2.1-2/
**Paso 3:** Compila el código.
.. raw:: html
.. code-block::
gcc 2.2.1_Photoresistor.c -o photoresistor -lwiringPi -lm
**Paso 4:** Ejecuta el archivo compilado.
.. raw:: html
.. code-block::
./photoresistor
Cuando el código se está ejecutando, el brillo del LED cambiará de acuerdo con la intensidad de luz detectada por el fotorresistor.
.. note::
Si no funciona después de ejecutarlo, o aparece un mensaje de error: \"wiringPi.h: No such file or directory\", por favor consulta :ref:`install_wiringpi_pi5`.
**Código**
.. code-block:: c
#include
#include
#include
#include
#define SPI_CHANNEL 0 // Usar canal SPI 0 (CE0)
#define SPI_SPEED 1000000 // Velocidad SPI de 1 MHz
#define LedPin 3 // GPIO3 (WiringPi) para PWM del LED
// Leer valor ADC desde MCP3008, canal 0~7
int readMCP3008(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // Bit de inicio
buffer[1] = (8 + channel) << 4; // SGL/DIF = 1, D2-D0 = canal
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
// Combinar el resultado
int result = ((buffer[1] & 3) << 8) | buffer[2];
return result;
}
int main(void) {
if (wiringPiSetup() == -1) {
printf("¡Falló la inicialización de wiringPi!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("¡Falló la configuración de SPI!\n");
return 1;
}
softPwmCreate(LedPin, 0, 100); // Inicializar PWM por software
while (1) {
int analogVal = readMCP3008(0); // Leer de CH0
printf("Valor ADC: %d\n", analogVal);
// Escalar valor ADC de 10 bits (0–1023) al rango de PWM (0–100)
int pwmVal = analogVal * 100 / 1023;
softPwmWrite(LedPin, pwmVal);
delay(100);
}
return 0;
}
**Explicación del código**
El código aquí es el mismo que en 2.1.7 Potenciómetro. Si tienes alguna otra pregunta, por favor revisa la explicación del código de :ref:`2.1.7_c_pi5_mcp3008` para más detalles.
.. Imagen del fenómeno
.. -------------------
.. .. image:: ../img/image199.jpeg