Nota

¡Hola, bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.

¿Por qué unirse?

  • Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprender y compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Preestrenos 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 y sorteos festivos: Participa en sorteos y promociones especiales de temporada.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.

2.2.2 Termistor (MCP3008)

Nota

../_images/mcp3008_and_adc0834.jpg

Dependiendo de la versión de tu kit, identifica si tienes ADC0834 o MCP3008 y procede con la sección correspondiente.

Introducción

Así como un fotorresistor puede detectar la luz, un termistor es un dispositivo electrónico sensible a la temperatura que puede usarse para implementar funciones de control de temperatura, como una alarma de sobrecalentamiento.

Componentes requeridos

En este proyecto, necesitamos los siguientes componentes.

../_images/list2_2.2.2_thermistor1.png

Es definitivamente conveniente comprar un kit completo, aquí tienes el enlace:

Nombre

ELEMENTOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado en los siguientes enlaces.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Resistor

COMPRAR

Termistor

COMPRAR

MCP3008

-

Diagrama esquemático

Nombre

T-Board

WiringPi

BCM

SPICE0

pin24

10

8

SPIMOSI

pin19

12

10

SPIMISO

pin21

13

9

SPISCLK

pin23

14

11

../_images/schematic_2.2.2_thermistor_mcp30081.png

Procedimientos experimentales

Paso 1: Construye el circuito.

../_images/july24_2.2.2_thermistor_mcp30081.png

Paso 2: Configura la interfaz SPI e instala la librería spidev (consulta Configuración de SPI para instrucciones detalladas). Si ya has completado estos pasos, puedes omitirlos.

Paso 3: Ve a la carpeta del código.

cd ~/raphael-kit/python-pi5

Paso 4: Ejecuta el archivo

sudo python3 2.2.2-2_Thermistor_zero.py

Cuando el código se esté ejecutando, el termistor detectará la temperatura ambiente, la cual será impresa en la pantalla después de finalizar el cálculo.

Advertencia

Si aparece el error RuntimeError: Cannot determine SOC peripheral base address, consulta Si «gpiozero» no funciona.

Código

Nota

Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el siguiente código. Pero antes, 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.

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

import spidev
import time
import math

# Inicializar SPI para MCP3008 (Bus 0, CE0)
spi = spidev.SpiDev()
spi.open(0, 0)  # Bus 0, Dispositivo 0 (CE0)
spi.max_speed_hz = 1000000  # 1 MHz

def read_adc(channel):
    """
    Leer valor analógico del canal MCP3008 (0–7)
    """
    if channel < 0 or channel > 7:
        return -1
    # Formato de comunicación MCP3008
    adc = spi.xfer2([1, (8 + channel) << 4, 0])
    value = ((adc[1] & 0x03) << 8) | adc[2]
    return value

try:
    while True:
        # Leer valor analógico desde CH0 del MCP3008
        analogVal = read_adc(0)

        # Convertir a voltaje (referencia de 3.3V)
        Vr = 3.3 * analogVal / 1023.0

        # Calcular resistencia del termistor
        Rt = 10000.0 * Vr / (3.3 - Vr)

        # Calcular temperatura en Kelvin usando la aproximación Steinhart–Hart
        tempK = 1.0 / (((math.log(Rt / 10000.0)) / 3950.0) + (1.0 / (273.15 + 25.0)))

        # Convertir a Celsius y Fahrenheit
        Cel = tempK - 273.15
        Fah = Cel * 1.8 + 32

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

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

except KeyboardInterrupt:
    spi.close()

Explicación del código

  1. Se importan los módulos spidev para la comunicación con el ADC MCP3008 mediante SPI, time para los retardos y math para cálculos logarítmicos usados en la conversión de temperatura.

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import spidev
    import time
    import math
    
  2. Se inicializa la interfaz SPI para el MCP3008 en el bus 0 y dispositivo 0 (CE0), configurando la velocidad máxima de reloj a 1 MHz.

    spi = spidev.SpiDev()
    spi.open(0, 0)
    spi.max_speed_hz = 1000000
    
  3. Se define una función para leer valores analógicos de un canal específico (0–7) del MCP3008 usando el protocolo SPI. Devuelve un entero de 10 bits (0–1023).

    def read_adc(channel):
        if channel < 0 or channel > 7:
            return -1
        adc = spi.xfer2([1, (8 + channel) << 4, 0])
        value = ((adc[1] & 0x03) << 8) | adc[2]
        return value
    
  4. Se implementa un bucle que lee continuamente valores analógicos del termistor conectado al CH0, los convierte a voltaje (referencia de 3.3V), luego a resistencia y finalmente a temperatura usando la ecuación Steinhart–Hart. Se imprime la temperatura en Celsius y Fahrenheit. Se incluye una pequeña pausa entre lecturas.

    try:
        while True:
            analogVal = read_adc(0)
            Vr = 3.3 * analogVal / 1023.0
            Rt = 10000.0 * Vr / (3.3 - Vr)
            tempK = 1.0 / (((math.log(Rt / 10000.0)) / 3950.0) + (1.0 / (273.15 + 25.0)))
            Cel = tempK - 273.15
            Fah = Cel * 1.8 + 32
            print('Celsius: %.2f °C  Fahrenheit: %.2f °F' % (Cel, Fah))
            time.sleep(0.2)
    
  5. Se captura la interrupción del teclado (Ctrl+C) para finalizar el programa de forma correcta cerrando la interfaz SPI.

    except KeyboardInterrupt:
        spi.close()