.. note::
¡Hola! Bienvenidos a la comunidad de entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto con otros apasionados.
**¿Por qué unirse?**
- **Soporte de Expertos**: Soluciona problemas post-venta 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**: Accede anticipadamente a anuncios de nuevos productos y adelantos.
- **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
- **Promociones y Sorteos Festivos**: Participa en sorteos y promociones especiales en días festivos.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy.
3.1.4 Ventilador Inteligente
==============================
.. 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 curso, utilizaremos motores, botones y termistores para construir un ventilador inteligente con función manual y automática, con velocidad de viento ajustable.
Componentes
-------------
.. image:: img/list_Smart_Fan.png
:align: center
Diagrama de Circuito
-----------------------
============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17 Pin 11 0 17
GPIO18 Pin 12 1 18
GPIO27 Pin 13 2 27
GPIO22 Pin 15 3 22
GPIO5 Pin 29 21 5
GPIO6 Pin 31 22 6
GPIO13 Pin 33 23 13
============ ======== ======== ===
.. image:: img/Schematic_three_one4.png
:width: 500
:align: center
Procedimientos Experimentales
--------------------------------
**Paso 1:** Construye el circuito.
.. image:: img/image245.png
:alt: Smart Fan_bb
:width: 800
:align: center
.. note::
El módulo de alimentación puede utilizar una batería de 9V con el conector
de batería de 9V incluido en el kit. Inserta el puente del módulo de
alimentación en las tiras de bus de 5V de la protoboard.
.. image:: img/image118.jpeg
:alt: \_MG_2084
:width: 2.80694in
:height: 0.94375in
:align: center
**Para Usuarios de Lenguaje C**
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Paso 2**: Ingresa en la carpeta del código.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.4/
**Paso 3**: Compila.
.. raw:: html
.. code-block::
gcc 3.1.4_SmartFan.c -lwiringPi -lm
**Paso 4**: Ejecuta el archivo ejecutable anterior.
.. raw:: html
.. code-block::
sudo ./a.out
Cuando el código se ejecute, presiona el botón para activar el ventilador.
Cada vez que presionas, se ajusta una categoría de velocidad hacia arriba o
abajo. Hay **5** niveles de velocidad: **0~4**. Cuando está en la **4.ª**
categoría de velocidad y presionas el botón, el ventilador se detiene con una
velocidad de viento en **0**.
.. note::
Si no funciona tras ejecutarlo, o aparece el mensaje de error: \"wiringPi.h: No such file or directory", consulta :ref:`faq_c_nowork`.
Cuando la temperatura sube o baja más de 2℃, la velocidad del ventilador cambia
automáticamente una categoría más rápido o más lento.
**Explicación del Código**
.. code-block:: c
int temperture(){
unsigned char analogVal;
double Vr, Rt, temp, cel, Fah;
analogVal = get_ADC_Result(0);
Vr = 5 * (double)(analogVal) / 255;
Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
cel = temp - 273.15;
Fah = cel * 1.8 +32;
int t=cel;
return t;
}
La función temperture() convierte los valores del termistor leídos por el
ADC0834 en valores de temperatura. Consulta :ref:`2.2.2_thermistor_c_pi5` para más detalles.
.. code-block:: c
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;
}
Esta función controla la velocidad de rotación del motor. El rango del
**Nivel** es **0-4** (el nivel **0** detiene el motor). Cada nivel representa
un ajuste del **25%** en la velocidad del viento.
.. code-block:: c
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;
}
La función **main()** contiene todo el proceso del programa, como se describe:
1) Lee constantemente el estado del botón y la temperatura actual.
2) Cada pulsación incrementa el nivel en **+1** y, al mismo tiempo, se actualiza
la temperatura. El rango del **Nivel** es **1~4**.
3) Cuando el ventilador está en funcionamiento (el nivel es **diferente de 0**), la
temperatura se sigue detectando. Un cambio de **+2℃** aumenta o disminuye el nivel.
4) El motor ajusta su velocidad de rotación según el **Nivel**.