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.

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

  • Vistas previas exclusivas: Obtén acceso anticipado a anuncios de nuevos 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 [Aquí] y únete hoy mismo.

3.1.8 Monitor de Sobrecalentamiento (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

Es posible que quieras crear un dispositivo de monitoreo de sobrecalentamiento que se pueda aplicar en diversas situaciones. Por ejemplo, en una fábrica, si queremos tener una alarma y la desconexión automática de la máquina a tiempo cuando hay un circuito sobrecalentado. En este proyecto utilizaremos un termistor, joystick, zumbador, LED y pantalla LCD para hacer un dispositivo inteligente de monitoreo de temperatura cuyo umbral sea ajustable.

Componentes necesarios

En este proyecto, necesitaremos los siguientes componentes.

../_images/list2_Overheat_Monitor.png

Diagrama esquemático

T-Board Name

physical

wiringPi

BCM

SPICE0

Pin 24

10

8

SPIMOSI

Pin 19

12

10

SPIMISO

Pin 21

13

9

SPISCLK

Pin 23

14

11

GPIO22

Pin 15

3

22

GPIO23

Pin 16

4

23

GPIO24

Pin 18

5

24

SDA1

Pin 3

SCL1

Pin 5

../_images/Schematic_three_one8.png

Procedimiento experimental

Paso 1: Montar el circuito.

../_images/july24_3.1.8_overheat_monitor_mcp3008.png

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

cd ~/davinci-kit-for-raspberry-pi/c/3.1.8-2/

Paso 3: Compilar el código.

gcc 3.1.8_OverheatMonitor.c -lm -lwiringPi

Paso 4: Ejecutar el archivo compilado.

sudo ./a.out

Al ejecutar el código, la temperatura actual y el umbral de alta temperatura 40 se mostrarán en la I2C LCD1602. Si la temperatura actual es mayor que el umbral, el zumbador y el LED se activarán para avisarte.

El joystick se utiliza para ajustar el umbral de alta temperatura. Mover el joystick en la dirección de los ejes X e Y ajusta (sube o baja) el umbral. Presionar el joystick lo restablece al valor inicial.

Nota

  • Si aparece el error wiringPi.h: No such file or directory, consulta ¿El código en C no funciona?.

  • Si aparece el error Unable to open I2C device: No such file or directory, debes consultar Configuración de I²C para habilitar I2C y comprobar que el cableado sea correcto.

  • Si el código y el cableado son correctos, pero la LCD no muestra contenido, puedes girar el potenciómetro de la parte trasera para aumentar el contraste.

Explicación del código

int read_ADC(int channel) {
    if (channel < 0 || channel > 7) return -1;
    unsigned char buffer[3];
    buffer[0] = 1;
    buffer[1] = (8 + channel) << 4;
    buffer[2] = 0;
    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
    return ((buffer[1] & 0x03) << 8) | buffer[2];
}

Lee un valor analógico de 10 bits desde un canal (CH0–CH7) del MCP3008 usando SPI y devuelve un entero de 0 a 1023.

int get_joystick_value() {
    int x = read_ADC(1);
    int y = read_ADC(2);

    if (x > 900)      return 1;   // Derecha
    else if (x < 100) return -1;  // Izquierda
    else if (y > 900) return -10; // Arriba
    else if (y < 100) return 10;  // Abajo
    else              return 0;
}

Lee los valores analógicos del joystick en los canales CH1 y CH2. Devuelve un número que indica la dirección del movimiento según los umbrales.

void upper_tem_setting() {
    write_lcd(0,0, "Upper Adjust:");

    int change = get_joystick_value();

    if (change != 0 && change != lastJoystickChange) {
        upperTem += change;
        lastJoystickChange = change;
    }
    else if (change == 0) {
        lastJoystickChange = 0;
    }

    char str[6];
    snprintf(str, sizeof(str), "%d", upperTem);
    write_lcd(0,1, str);
    write_lcd(strlen(str),1, "            ");

    delay(100);
}

Permite ajustar el umbral de temperatura con el joystick. Evita cambios repetidos si se mantiene la dirección.

double temperature() {
    int raw = read_ADC(0);
    double Vr = 3.3 * ((double)raw / 1023.0);
    double Rt = 10000.0 * Vr / (3.3 - Vr);
    double tempK = 1.0 / ((log(Rt/10000.0)/3950.0) + 1.0/(273.15+25.0));
    return tempK - 273.15;
}

Lee el valor analógico desde CH0 (termistor) y usa la ecuación de Steinhart–Hart para calcular la temperatura en °C.

void monitoring_temp() {
    char str[6];
    double cel = temperature();
    snprintf(str, sizeof(str), "%.2f", cel);
    write_lcd(0,0, "Temp: ");
    write_lcd(6,0, str);

    snprintf(str, sizeof(str), "%d", upperTem);
    write_lcd(0,1, "Upper: ");
    write_lcd(7,1, str);
    delay(100);

    if (cel >= upperTem) {
        digitalWrite(buzzPin, HIGH);
        digitalWrite(LedPin,  HIGH);
    } else {
        digitalWrite(buzzPin, LOW);
        digitalWrite(LedPin,  LOW);
    }
}

Lee continuamente la temperatura y muestra junto al umbral en la LCD. Si la temperatura supera el umbral, enciende el zumbador y el LED.

void setup_all() {
    fd = wiringPiI2CSetup(LCDAddr);
    lcd_init();
    if (wiringPiSetup() == -1 || wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
        printf("¡Configuración fallida!\n");
        return;
    }
    pinMode(Joy_BtnPin, INPUT);
    pullUpDnControl(Joy_BtnPin, PUD_UP);
    pinMode(buzzPin, OUTPUT);
    pinMode(LedPin,  OUTPUT);
}

Inicializa la LCD, SPI y los pines GPIO para el botón del joystick, zumbador y LED. Activa la resistencia pull-up para el botón del joystick.

int main(void) {
    setup_all();

    int lastBtnState = HIGH;
    int stage = 0;

    while (1) {
        int curBtn = digitalRead(Joy_BtnPin);
        if (curBtn == HIGH && lastBtnState == LOW) {
            stage = (stage + 1) % 2;
            lastJoystickChange = 0;
            delay(100);
            lcd_clear();
        }
        lastBtnState = curBtn;

        if (stage == 1)
            upper_tem_setting();
        else
            monitoring_temp();
    }

    return 0;
}

Bucle principal con dos modos:

  1. Monitoreo de temperatura.

  2. Ajuste del umbral usando el joystick.

El cambio de modo ocurre cuando se suelta el botón del joystick.