Nota

¡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 [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

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

Componentes requeridos

En este proyecto, necesitamos los siguientes componentes.

../_images/list2_2.2.2_thermistor.png

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

Nombre

ARTÍCULOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado desde 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

physical

WiringPi

BCM

SPICE0

pin24

10

8

SPIMOSI

pin19

12

10

SPIMISO

pin21

13

9

SPISCLK

pin23

14

11

../_images/schematic_2.2.2_thermistor_mcp3008.png

Procedimientos experimentales

Paso 1: Construye el circuito.

../_images/july24_2.2.2_thermistor_mcp3008.png

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

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

cd ~/raphael-kit/python

Paso 4: Ejecuta el archivo.

sudo python3 2.2.2-2_thermistor.py

Con el código ejecutándose, el termistor detecta la temperatura ambiente, la cual se imprimirá en la pantalla una vez que el programa realice 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 código de abajo. Pero antes, necesitas ir a la ruta del código fuente como raphael-kit/python. 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
import RPi.GPIO as GPIO

# Establecer modo de GPIO
GPIO.setmode(GPIO.BCM)

# 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 desde el canal MCP3008 (0–7)
    """
    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

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

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

        # Calcular resistencia del termistor (R2 en divisor de voltaje es 10kΩ)
        Rt = 10000.0 * Vr / (3.3 - Vr)

        # Cálculo 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 resultado
        print('Celsius: %.2f °C  Fahrenheit: %.2f °F' % (Cel, Fah))

        time.sleep(0.2)

except KeyboardInterrupt:
    pass

finally:
    spi.close()
    GPIO.cleanup()

Explicación del código

  1. Esta sección importa las librerías necesarias:

    • spidev para comunicación SPI con MCP3008

    • time para retardos

    • math para operaciones logarítmicas en la fórmula de temperatura Steinhart–Hart

    • RPi.GPIO para inicializar y limpiar GPIO

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import spidev
    import time
    import math
    import RPi.GPIO as GPIO
    
  2. Inicializa el modo de GPIO como BCM y configura la interfaz SPI en bus 0 y dispositivo 0 (CE0), con una velocidad de 1 MHz.

    GPIO.setmode(GPIO.BCM)
    spi = spidev.SpiDev()
    spi.open(0, 0)
    spi.max_speed_hz = 1000000
    
  3. Define una función read_adc(channel) para leer valores analógicos de un canal específico (0–7) del MCP3008. Envía un comando SPI de 3 bytes y recibe un resultado analógico 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. Bucle principal: Lee voltaje analógico desde un termistor en el canal 0, lo convierte a resistencia y luego usa la ecuación Steinhart–Hart para estimar la temperatura en Celsius y Fahrenheit. Las actualizaciones se imprimen cada 0,2 segundos.

    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. El bloque finally asegura un apagado correcto. Cierra la interfaz SPI y limpia los GPIO para liberar todos los recursos de hardware.

    except KeyboardInterrupt:
        pass
    
    finally:
        spi.close()
        GPIO.cleanup()