.. note:: ¡Hola, bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Profundiza en Raspberry Pi, Arduino y ESP32 con otros entusiastas. **¿Por qué unirse?** - **Soporte experto**: Resuelve 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**: Obtén acceso anticipado a anuncios de nuevos productos y adelantos. - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes. - **Promociones festivas y sorteos**: Participa en sorteos y promociones festivas. 👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo! .. _2.2.2_c_pi5: 2.2.2 Termistor ====================== .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left Dependiendo de la versión de su kit, identifique si tiene **ADC0834** o **MCP3008** y continúe con la sección correspondiente. Introducción ---------------- Al igual que el fotoresistor puede detectar la luz, el termistor es un dispositivo electrónico sensible a la temperatura que se puede utilizar para realizar funciones de control de temperatura, como hacer una alarma de calor. Componentes necesarios ------------------------------ En este proyecto, necesitamos los siguientes componentes. .. image:: ../img/list_2.2.2_thermistor.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 enlaces a continuación. .. 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_thermistor` - |link_thermistor_buy| * - :ref:`cpn_adc0834` - \- Diagrama esquemático ------------------------ .. image:: ../img/image323.png .. image:: ../img/image324.png Procedimientos Experimentales --------------------------------- **Paso 1:** Construye el circuito. .. image:: ../img/image202.png **Paso 2:** Ve a la carpeta del código. .. raw:: html .. code-block:: cd ~/raphael-kit/c/2.2.2/ **Paso 3:** Compila el código. .. raw:: html .. code-block:: gcc 2.2.2_Thermistor.c -lwiringPi -lm .. note:: -lm es para cargar la biblioteca de matemáticas. No lo omitas o cometerás un error. **Paso 4:** Ejecuta el archivo compilado. .. raw:: html .. code-block:: sudo ./a.out Con el código ejecutándose, el termistor detecta la temperatura ambiente que se imprimirá en la pantalla una vez que termine el cálculo del programa. .. 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 typedef unsigned char uchar; typedef unsigned int uint; #define ADC_CS 0 #define ADC_CLK 1 #define ADC_DIO 2 uchar get_ADC_Result(uint channel) { uchar i; uchar dat1=0, dat2=0; int sel = channel > 1 & 1; int odd = channel & 1; digitalWrite(ADC_CLK, 1); delayMicroseconds(2); digitalWrite(ADC_CLK, 0); delayMicroseconds(2); pinMode(ADC_DIO, OUTPUT); digitalWrite(ADC_CS, 0); // Start bit digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,1); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); //Single End mode digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,1); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); // ODD digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,odd); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); //Select digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,sel); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); digitalWrite(ADC_CLK,0); delayMicroseconds(2); for(i=0;i<8;i++) { digitalWrite(ADC_CLK,1); delayMicroseconds(2); digitalWrite(ADC_CLK,0); delayMicroseconds(2); pinMode(ADC_DIO, INPUT); dat1=dat1<<1 | digitalRead(ADC_DIO); } for(i=0;i<8;i++) { dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))< Hay una biblioteca de numeración en C que declara un conjunto de funciones para realizar operaciones y transformaciones matemáticas comunes. .. code-block:: c analogVal = get_ADC_Result(0); Esta función se utiliza para leer el valor del termistor. .. code-block:: c 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; printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah); Estos cálculos convierten los valores del termistor en valores Celsius. .. code-block:: c Vr = 5 * (double)(analogVal) / 255; Rt = 10000 * (double)(Vr) / (5 - (double)(Vr)); Estas dos líneas de código calculan la distribución de voltaje con el valor leído analógico para obtener Rt (resistencia del termistor). .. code-block:: c temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25))); Este código se refiere a insertar Rt en la fórmula **T\ K\ =1/(ln(R\ T/R\ N)/B+1/T\ N)** para obtener la temperatura en Kelvin. .. code-block:: c temp = temp - 273.15; Convierte la temperatura en Kelvin a grados Celsius. .. code-block:: c Fah = cel * 1.8 +32; Convierte grados Celsius a Fahrenheit. .. code-block:: c printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah); Imprime los grados centígrados, grados Fahrenheit y sus unidades en la pantalla. Imagen del Fenómeno ----------------------- .. image:: ../img/image203.jpeg