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 se puede utilizar para realizar funciones de control de temperatura, como hacer 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 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 de la 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: Ve a la carpeta del código.

cd ~/raphael-kit/c/2.2.2-2/

Paso 3: Compila el código.

gcc 2.2.2_Thermistor.c -o Thermistor -lwiringPi -lm

Nota

-lm es para cargar la librería matemática. No lo omitas o se producirá un error.

Paso 4: Ejecuta el archivo compilado.

./Thermistor

Cuando el código se ejecute, el termistor detectará la temperatura ambiente, la cual se imprimirá en la pantalla después de finalizar el cálculo del programa.

Nota

Si no funciona después de ejecutarlo, o aparece un mensaje de error: "wiringPi.h: No such file or directory", por favor consulta Instalar y verificar WiringPi.

Código

#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <math.h>

#define SPI_CHANNEL 0  // CE0
#define SPI_SPEED   1000000  // 1MHz

int read_ADC(int channel) {
    if (channel < 0 || channel > 7) return -1;

    unsigned char buffer[3];
    buffer[0] = 1;  // Bit de inicio
    buffer[1] = (8 + channel) << 4;  // Modo de un solo extremo + canal
    buffer[2] = 0;

    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);

    int value = ((buffer[1] & 3) << 8) | buffer[2];
    return value;
}

int main(void) {
    int analogVal;
    double Vr, Rt, temp, cel, Fah;

    if (wiringPiSetup() == -1) {
        printf("¡Falló la configuración de wiringPi!\n");
        return 1;
    }

    if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
        printf("¡Falló la configuración de SPI!\n");
        return 1;
    }

    while (1) {
        analogVal = read_ADC(0);  // Leer desde CH0

        // MCP3008 es un ADC de 10 bits (0–1023)
        Vr = 3.3 * analogVal / 1023.0;  // Suponiendo Vref = 3.3V
        Rt = 10000.0 * Vr / (3.3 - Vr); // Divisor de voltaje, resistencia de 10k
        temp = 1 / ((log(Rt / 10000.0) / 3950.0) + (1 / (273.15 + 25.0)));
        cel = temp - 273.15;
        Fah = cel * 1.8 + 32;

        printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);
        delay(1000);
    }

    return 0;
}

Explicación del código

#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <math.h>

Estos archivos de cabecera incluyen bibliotecas para el control de GPIO (wiringPi.h), comunicación SPI (wiringPiSPI.h), operaciones estándar de entrada/salida (stdio.h) y funciones matemáticas (math.h) en C.

#define SPI_CHANNEL 0
#define SPI_SPEED   1000000

Define constantes para el canal SPI y la velocidad de comunicación SPI. Aquí se usa el canal SPI 0 (CE0) y una velocidad de reloj de 1 MHz.

int read_ADC(int channel)

Esta función lee datos analógicos de un canal específico del ADC MCP3008.

buffer[0] = 1;
buffer[1] = (8 + channel) << 4;
buffer[2] = 0;

Estas líneas formatean el comando SPI según el protocolo MCP3008: un bit de inicio, configuración para modo de un solo extremo y número de canal.

wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);

Transfiere el comando SPI y recibe los datos ADC de 10 bits desde el MCP3008.

int value = ((buffer[1] & 3) << 8) | buffer[2];

Extrae y combina el resultado ADC de 10 bits desde el búfer SPI devuelto.

if (wiringPiSetup() == -1) { ... }
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { ... }

Estas líneas inicializan WiringPi y configuran SPI. Si la inicialización falla, el programa termina.

analogVal = read_ADC(0);

Lee la señal analógica del canal 0 del MCP3008, donde está conectado el divisor de voltaje con el termistor.

Vr = 3.3 * analogVal / 1023.0;

Convierte el valor digital del ADC en voltaje analógico. El rango del ADC es de 0–1023 con un voltaje de referencia de 3.3V.

Rt = 10000.0 * Vr / (3.3 - Vr);

Calcula la resistencia del termistor usando la fórmula del divisor de voltaje. Se supone una resistencia de 10kΩ en serie con el termistor.

temp = 1 / ((log(Rt / 10000.0) / 3950.0) + (1 / (273.15 + 25.0)));

Usa la ecuación del parámetro B para convertir la resistencia del termistor en temperatura en Kelvin.

T(K) = 1 / [ln(Rt/R₀)/B + 1/T₀], donde - R₀ = 10kΩ - B = 3950 - T₀ = 25°C = 298.15K

cel = temp - 273.15;

Convierte la temperatura de Kelvin a grados Celsius.

Fah = cel * 1.8 + 32;

Convierte la temperatura en Celsius a Fahrenheit.

printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);

Muestra la temperatura tanto en Celsius como en Fahrenheit en la terminal con una precisión de dos decimales.