.. 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. .. _3.1.4_c_pi5_mcp3008: 3.1.4 Ventilador Inteligente (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 ------------ En este proyecto, usaremos motores, botones y termistores para hacer un ventilador inteligente manual + automático cuya velocidad de viento es ajustable. Componentes requeridos ----------------------- En este proyecto necesitamos los siguientes componentes. .. image:: ../img/list2_Smart_Fan.png :align: center 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_power_module` - \- * - :ref:`cpn_thermistor` - |link_thermistor_buy| * - :ref:`cpn_l293d` - \- * - :ref:`cpn_mcp3008` - \- * - :ref:`cpn_button` - |link_button_buy| * - :ref:`cpn_motor` - |link_motor_buy| Diagrama esquemático -------------------- .. list-table:: :header-rows: 1 * - Nombre - T-Board - wiringPi - BCM * - SPICE0 - Pin 24 - 10 - 8 * - SPIMOSI - Pin 19 - 12 - 10 * - SPIMISO - Pin 21 - 13 - 9 * - SPISCLK - Pin 23 - 14 - 11 * - GPIO22 - Pin 15 - 3 - 22 * - GPIO5 - Pin 29 - 21 - 5 * - GPIO6 - Pin 31 - 22 - 6 * - GPIO13 - Pin 33 - 23 - 13 .. image:: ../img/schematic_3.1.4_smart_fan_mcp3008.png :align: center Procedimientos experimentales ----------------------------- **Paso 1:** Construye el circuito. .. image:: ../img/july24_3.1.4_smart_fan_mcp3008.png :align: center .. note:: El módulo de energía puede usar una batería de 9V con el conector de batería de 9V incluido en el kit. Inserta el puente del módulo de energía en las líneas de bus de 5V de la protoboard. .. image:: ../img/image118.jpeg :align: center **Paso 2:** Ingresa a la carpeta del código. .. raw:: html .. code-block:: cd ~/raphael-kit/c/3.1.4-2/ **Paso 3:** Compila. .. raw:: html .. code-block:: gcc 3.1.4_SmartFan.c -o SmartFan -lwiringPi -lm **Paso 4:** Ejecuta el archivo compilado. .. raw:: html .. code-block:: ./SmartFan Al ejecutar el código, inicia el ventilador presionando el botón. Cada vez que presiones, se ajusta una velocidad hacia arriba o hacia abajo. Hay **5** niveles de velocidad: **0~4**. Cuando está en el nivel 4 y presionas el botón, el ventilador se detiene con una velocidad **0**. Cuando la temperatura aumenta o disminuye más de 2℃, la velocidad se ajusta automáticamente un nivel más rápido o más lento. .. 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 #include #define SPI_CHANNEL 0 #define SPI_SPEED 1000000 #define MotorPin1 21 #define MotorPin2 22 #define MotorEnable 23 #define BtnPin 3 int read_ADC(int channel) { if (channel < 0 || channel > 7) return -1; unsigned char buffer[3]; buffer[0] = 1; // Bit de inicio buffer[1] = (8 + channel) << 4; // Modo de un solo extremo y canal buffer[2] = 0; wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3); int result = ((buffer[1] & 3) << 8) | buffer[2]; return result; } int temperture() { int analogVal = read_ADC(0); double Vr = 3.3 * analogVal / 1023.0; // Usar 3.3V como Vref double Rt = 10000.0 * Vr / (3.3 - Vr); double temp = 1 / (((log(Rt / 10000.0)) / 3950.0) + (1 / (273.15 + 25.0))); double cel = temp - 273.15; double Fah = cel * 1.8 + 32; printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah); return (int)cel; } int motor(int level) { if (level == 0) { digitalWrite(MotorEnable, LOW); return 0; } if (level >= 4) { level = 4; } digitalWrite(MotorEnable, HIGH); softPwmWrite(MotorPin1, level * 25); return level; } void setup() { if (wiringPiSetup() == -1) { printf("¡Falló la configuración de wiringPi!\n"); return; } if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { printf("¡Falló la configuración SPI!\n"); return; } softPwmCreate(MotorPin1, 0, 100); softPwmCreate(MotorPin2, 0, 100); pinMode(MotorEnable, OUTPUT); pinMode(BtnPin, INPUT); } int main(void) { setup(); int currentState, lastState = 0; int level = 0; int currentTemp, markTemp = 0; while (1) { currentState = digitalRead(BtnPin); currentTemp = temperture(); if (currentTemp <= 0) continue; if (currentState == 1 && lastState == 0) { level = (level + 1) % 5; markTemp = currentTemp; delay(500); } lastState = currentState; if (level != 0) { if (currentTemp - markTemp <= -2) { level = level - 1; markTemp = currentTemp; } if (currentTemp - markTemp >= 2) { level = level + 1; markTemp = currentTemp; } } level = motor(level); } return 0; } Explicación del código ---------------------- .. code-block:: c int read_ADC(int channel) { ... } Esta función se usa para leer la entrada analógica desde el MCP3008 en el canal especificado. Envía un comando SPI de 3 bytes y devuelve un valor digital de 10 bits entre 0–1023. .. code-block:: c int temperture() { ... } La función ``temperture()`` lee la señal analógica del termistor a través del MCP3008, calcula el voltaje y la resistencia, luego convierte a Celsius y Fahrenheit usando la fórmula del termistor (aproximación de Steinhart–Hart). .. code-block:: c int motor(int level) { ... } Esta función controla la velocidad del ventilador mediante PWM. El nivel varía de 0–4, donde 0 apaga el ventilador y cada nivel aumenta el ciclo de trabajo en un 25%. .. code-block:: c void setup() { ... } La función ``setup()`` inicializa WiringPi, configura SPI, inicializa PWM y configura los pines GPIO necesarios para el control del motor y la lectura del botón. .. code-block:: c int main(void) { ... } La función ``main()`` contiene el bucle del programa: 1. Comprueba constantemente el estado del botón y lee la temperatura actual. 2. Al presionar el botón, el nivel del ventilador aumenta (ciclando 0–4) y se guarda la temperatura de referencia. 3. Si la temperatura cambia ±2℃, ajusta automáticamente la velocidad del ventilador. 4. Llama a ``motor(level)`` para actualizar la salida PWM según el nivel actual.