.. note::

    ¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete más en el mundo de 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 nuevos.
    - **Promociones y Sorteos Festivos**: 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.2_py_pi5:

2.2.2 Termistor
===================

Introducción
---------------

Al igual que una fotorresistencia puede detectar la luz, un termistor es 
un dispositivo electrónico sensible a la temperatura que puede usarse para 
funciones de control de temperatura, como hacer una alarma de calor.

Componentes Necesarios
------------------------------

En este proyecto, necesitamos los siguientes componentes. 

.. image:: ../python_pi5/img/2.2.2_thermistor_list.png

Definitivamente es conveniente comprar un kit completo, aquí está el enlace:

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Nombre	
        - COMPONENTES 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_extension_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:: ../python_pi5/img/2.2.2_thermistor_schematic_1.png


.. image:: ../python_pi5/img/2.2.2_thermistor_schematic_2.png


Procedimientos Experimentales
---------------------------------

**Paso 1:** Construir el circuito.

.. image:: ../python_pi5/img/2.2.2_thermistor_circuit.png

**Paso 2:** Ir a la carpeta del código.

.. raw:: html

   <run></run>

.. code-block:: 

    cd ~/raphael-kit/python-pi5

**Paso 3:** Ejecutar el archivo ejecutable.

.. raw:: html

   <run></run>

.. code-block:: 

    sudo python3 2.2.2_Thermistor_zero.py

Con el código en ejecución, el termistor detecta la temperatura ambiente, que se imprimirá en la pantalla una vez que finalice el cálculo del programa.

.. warning::

    Si recibe el mensaje de error ``RuntimeError: Cannot determine SOC peripheral base address``, consulte :ref:`faq_soc`

**Código**

.. note::

    Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como ``raphael-kit/python-pi5``. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.

.. raw:: html

    <run></run>

.. code-block:: python

   #!/usr/bin/env python3
   # -*- coding: utf-8 -*-

   import ADC0834
   import time
   import math

   # Inicializar el módulo ADC0834
   ADC0834.setup()

   # Ejecutar el proceso en un bloque try-except
   try:
       while True:
           # Leer el valor analógico del sensor
           analogVal = ADC0834.getResult()

           # Convertir el valor analógico a voltaje
           Vr = 5 * float(analogVal) / 255

           # Calcular la resistencia del termistor
           Rt = 10000 * Vr / (5 - Vr)

           # Calcular la temperatura en Kelvin
           temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25)))

           # Convertir Kelvin a Celsius
           Cel = temp - 273.15

           # Convertir Celsius a Fahrenheit
           Fah = Cel * 1.8 + 32

           # Imprimir la temperatura en Celsius y Fahrenheit
           print('Celsius: %.2f C  Fahrenheit: %.2f F' % (Cel, Fah))

           # Esperar 0.2 segundos antes de la siguiente lectura
           time.sleep(0.2)

   # Manejar KeyboardInterrupt para una terminación adecuada
   except KeyboardInterrupt:
       # Limpiar recursos de ADC0834
       ADC0834.destroy()


**Explicación del Código**

#. Esta sección importa la biblioteca ADC0834 para la conversión de analógico a digital, la biblioteca time para implementar retardos y la biblioteca math para realizar operaciones matemáticas.

   .. code-block:: python

       #!/usr/bin/env python3
       # -*- coding: utf-8 -*-

       import ADC0834
       import time
       import math

#. Inicializa el módulo ADC0834 para habilitar la lectura de valores analógicos.

   .. code-block:: python

       # Inicializar el módulo ADC0834
       ADC0834.setup()

#. Implementa un bucle infinito para la lectura continua de datos. El bucle lee el valor analógico de un termistor, convierte este valor a voltaje, calcula la resistencia del termistor y luego traduce esta resistencia en mediciones de temperatura en Kelvin, Celsius y Fahrenheit. También muestra las lecturas de temperatura en Celsius y Fahrenheit, haciendo una pausa de 0.2 segundos entre cada lectura.

   .. code-block:: python

       # Ejecutar el proceso en un bloque try-except
       try:
           while True:
               # Leer el valor analógico del sensor
               analogVal = ADC0834.getResult()

               # Convertir el valor analógico a voltaje
               Vr = 5 * float(analogVal) / 255

               # Calcular la resistencia del termistor
               Rt = 10000 * Vr / (5 - Vr)

               # Calcular la temperatura en Kelvin
               temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25)))

               # Convertir Kelvin a Celsius
               Cel = temp - 273.15

               # Convertir Celsius a Fahrenheit
               Fah = Cel * 1.8 + 32

               # Imprimir la temperatura en Celsius y Fahrenheit
               print('Celsius: %.2f C  Fahrenheit: %.2f F' % (Cel, Fah))

               # Esperar 0.2 segundos antes de la siguiente lectura
               time.sleep(0.2)

#. Captura una excepción KeyboardInterrupt para terminar el programa de manera adecuada e incluye instrucciones de limpieza para los recursos de ADC0834 al finalizar.

   .. code-block:: python

       # Manejar KeyboardInterrupt para una terminación adecuada
       except KeyboardInterrupt:
           # Limpiar recursos de ADC0834
           ADC0834.destroy()
