.. note:: Hola, ¡bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete más profundamente en Raspberry Pi, Arduino y ESP32 junto con otros entusiastas. **¿Por qué unirse?** - **Soporte experto**: Resuelve problemas posventa 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 anuncios de nuevos productos y adelantos. - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes. - **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! 3.1.8 Monitor de Sobrecalentamiento ========================================== .. note:: .. image:: img/mcp3008_and_adc0834.jpg :width: 25% :align: left Dependiendo de la versión de tu kit, identifica si tienes **ADC0834** o **MCP3008** y procede con la sección correspondiente. Introducción ------------------- Podrías querer crear un dispositivo de monitoreo de sobrecalentamiento que se aplique a diversas situaciones, por ejemplo, en una fábrica, si se necesita una alarma y el apagado automático oportuno de una máquina cuando hay sobrecalentamiento en el circuito. En esta lección, usaremos un termistor, un joystick, un zumbador, un LED y una pantalla LCD para crear un dispositivo inteligente de monitoreo de temperatura cuyo umbral es ajustable. Componentes ----------------- .. image:: img/list_Overheat_Monitor.png :align: center .. image:: img/list_Overheat_Monitor2.png :align: center Diagrama de Esquema -------------------------- ============ ======== ======== === T-Board Name physical wiringPi BCM GPIO17 Pin 11 0 17 GPIO18 Pin 12 1 18 GPIO27 Pin 13 2 27 GPIO22 Pin15 3 22 GPIO23 Pin16 4 23 GPIO24 Pin18 5 24 SDA1 Pin 3 SCL1 Pin 5 ============ ======== ======== === .. image:: img/Schematic_three_one8.png :width: 700 :align: center Procedimiento Experimental ----------------------------- **Paso 1:** Construir el circuito. .. image:: img/image258.png :alt: Overheat Monitor_bb :width: 800 **Para Usuarios de Lenguaje C** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Paso 2**: Ve a la carpeta del código. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/3.1.8/ **Paso 3**: Compila el código. .. raw:: html .. code-block:: gcc 3.1.8_OverheatMonitor.c -lwiringPi -lm **Paso 4**: Ejecuta el archivo compilado. .. raw:: html .. code-block:: sudo ./a.out Al ejecutarse el código, se muestra en la **I2C LCD1602** la temperatura actual y el umbral de temperatura alta, que inicialmente es **40**. Si la temperatura actual supera el umbral, el zumbador y el LED se activan para alertarte. .. note:: Si el programa no funciona después de ejecutarlo o aparece el mensaje de error: "wiringPi.h: No such file or directory", consulta :ref:`faq_c_nowork`. **Joystick** aquí se utiliza para ajustar el umbral de temperatura alta. Al mover el **Joystick** en las direcciones de los ejes X o Y puedes ajustar (subir o bajar) el umbral de temperatura alta actual. Presiona el **Joystick** nuevamente para restablecer el umbral al valor inicial. **Explicación del Código** .. code-block:: c int get_joystick_value(){     uchar x_val;     uchar y_val;     x_val = get_ADC_Result(1);     y_val = get_ADC_Result(2);     if (x_val > 200){         return 1;     }     else if(x_val < 50){         return -1;     }     else if(y_val > 200){         return -10;     }     else if(y_val < 50){         return 10;     }     else{         return 0;     } } Esta función lee los valores de X y Y. Si **X>200**, devuelve "**1**"; si **X<50**, devuelve "**-1**"; si **y>200**, devuelve "**-10**", y si **y<50**, devuelve "**10**". .. code-block:: c void upper_tem_setting(){     write(0, 0, "Upper Adjust:");     int change = get_joystick_value();     upperTem = upperTem + change;     char str[6];     snprintf(str,3,"%d",upperTem);     write(0,1,str);     int len;     len = strlen(str);     write(len,1,"             ");     delay(100); } Esta función permite ajustar el umbral y mostrarlo en la pantalla I2C LCD1602. .. code-block:: c double temperature(){     unsigned char temp_value;     double Vr, Rt, temp, cel, Fah;     temp_value = get_ADC_Result(0);     Vr = 5 * (double)(temp_value) / 255;     Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));     temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));     cel = temp - 273.15;     Fah = cel * 1.8 +32;     return cel; } Lee el valor analógico de **CH0** (termistor) del **ADC0834** y luego lo convierte en un valor de temperatura. .. code-block:: c void monitoring_temp(){     char str[6];     double cel = temperature();     snprintf(str,6,"%.2f",cel);     write(0, 0, "Temp: ");     write(6, 0, str);     snprintf(str,3,"%d",upperTem);     write(0, 1, "Upper: ");     write(7, 1, str);     delay(100);     if(cel >= upperTem){         digitalWrite(buzzPin, HIGH);         digitalWrite(LedPin, HIGH);     }     else if(cel < upperTem){         digitalWrite(buzzPin, LOW);         digitalWrite(LedPin, LOW);     } } Al ejecutar el código, se muestra en la **I2C LCD1602** la temperatura actual y el umbral de temperatura alta, que inicialmente es **40**. Si la temperatura actual supera el umbral, el zumbador y el LED se activan para alertarte. .. code-block:: c int main(void) {     setup();     int lastState =1;     int stage=0;     while (1)     {         int currentState = digitalRead(Joy_BtnPin);         if(currentState==1 && lastState == 0){             stage=(stage+1)%2;             delay(100);             lcd_clear();         }         lastState=currentState;         if (stage==1){             upper_tem_setting();         }         else{             monitoring_temp();         }     }     return 0; } La función main() contiene el proceso completo del programa como se muestra a continuación: 1) Al iniciar el programa, el valor inicial de **stage** es **0**, y la temperatura actual y el umbral de temperatura alta **40** se muestran en la **I2C LCD1602**. Si la temperatura actual supera el umbral, el zumbador y el LED se activan para alertar. 2) Al presionar el Joystick, **stage** cambiará a **1**, y podrás ajustar el umbral de temperatura alta. Al mover el Joystick en las direcciones de los ejes X o Y, puedes ajustar (subir o bajar) el umbral actual. Presiona el Joystick nuevamente para restablecer el umbral al valor inicial. **Para Usuarios de Lenguaje Python** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Paso 2**: Ve a la carpeta del código. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python/ **Paso 3**: Ejecuta el archivo. .. raw:: html .. code-block:: sudo python3 3.1.8_OverheatMonitor.py Al ejecutar el código, la temperatura actual y el umbral de temperatura alta **40** se muestran en la **I2C LCD1602**. Si la temperatura actual supera el umbral, el zumbador y el LED se activarán para alertarte. El **Joystick** se utiliza para ajustar el umbral de temperatura alta. Moviendo el **Joystick** en la dirección del eje X o Y puedes aumentar o disminuir el umbral de temperatura alta. Presiona el **Joystick** nuevamente para restablecer el umbral al valor inicial. **Código** .. note:: Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes, necesitas ir a la ruta del código fuente como ``davinci-kit-for-raspberry-pi/python``. .. raw:: html .. code-block:: python import LCD1602 import RPi.GPIO as GPIO import ADC0834 import time import math Joy_BtnPin = 22 buzzPin = 23 ledPin = 24 upperTem = 40 def setup(): ADC0834.setup() GPIO.setmode(GPIO.BCM) GPIO.setup(ledPin, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(buzzPin, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(Joy_BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) LCD1602.init(0x27, 1) def get_joystick_value(): x_val = ADC0834.getResult(1) y_val = ADC0834.getResult(2) if(x_val > 200): return 1 elif(x_val < 50): return -1 elif(y_val > 200): return -10 elif(y_val < 50): return 10 else: return 0 def upper_tem_setting(): global upperTem LCD1602.write(0, 0, 'Upper Adjust: ') change = int(get_joystick_value()) upperTem = upperTem + change strUpperTem = str(upperTem) LCD1602.write(0, 1, strUpperTem) LCD1602.write(len(strUpperTem),1, ' ') time.sleep(0.1) def temperature(): analogVal = ADC0834.getResult() Vr = 5 * float(analogVal) / 255 Rt = 10000 * Vr / (5 - Vr) temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25))) Cel = temp - 273.15 Fah = Cel * 1.8 + 32 return round(Cel,2) def monitoring_temp(): global upperTem Cel=temperature() LCD1602.write(0, 0, 'Temp: ') LCD1602.write(0, 1, 'Upper: ') LCD1602.write(6, 0, str(Cel)) LCD1602.write(7, 1, str(upperTem)) time.sleep(0.1) if Cel >= upperTem: GPIO.output(buzzPin, GPIO.HIGH) GPIO.output(ledPin, GPIO.HIGH) else: GPIO.output(buzzPin, GPIO.LOW) GPIO.output(ledPin, GPIO.LOW) def loop(): lastState=1 stage=0 while True: currentState=GPIO.input(Joy_BtnPin) if currentState==1 and lastState ==0: stage=(stage+1)%2 time.sleep(0.1) LCD1602.clear() lastState=currentState if stage == 1: upper_tem_setting() else: monitoring_temp() def destroy(): LCD1602.clear() ADC0834.destroy() GPIO.cleanup() if __name__ == '__main__': # El programa comienza aquí try: setup() while True: loop() except KeyboardInterrupt: # Cuando se presiona 'Ctrl+C', se ejecutará la función destroy() destroy() **Explicación del Código** .. code-block:: python def get_joystick_value():     x_val = ADC0834.getResult(1)     y_val = ADC0834.getResult(2)     if(x_val > 200):         return 1     elif(x_val < 50):         return -1     elif(y_val > 200):         return -10     elif(y_val < 50):         return 10 else:         return 0 Esta función lee los valores de X e Y. Si **X > 200**, devuelve "**1**"; si **X < 50**, devuelve "**-1**"; si **y > 200**, devuelve "**-10**"; y si **y < 50**, devuelve "**10**". .. code-block:: python def upper_tem_setting():     global upperTem     LCD1602.write(0, 0, 'Upper Adjust: ')     change = int(get_joystick_value())     upperTem = upperTem + change LCD1602.write(0, 1, str(upperTem)) LCD1602.write(len(strUpperTem),1, ' ') time.sleep(0.1) Esta función ajusta el umbral y lo muestra en la I2C LCD1602. .. code-block:: python def temperature():     analogVal = ADC0834.getResult()     Vr = 5 * float(analogVal) / 255     Rt = 10000 * Vr / (5 - Vr)     temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))     Cel = temp - 273.15     Fah = Cel * 1.8 + 32     return round(Cel,2) Lee el valor analógico del **CH0** (termistor) del **ADC0834** y lo convierte en valor de temperatura. .. code-block:: python def monitoring_temp():     global upperTem     Cel=temperature()     LCD1602.write(0, 0, 'Temp: ')     LCD1602.write(0, 1, 'Upper: ')     LCD1602.write(6, 0, str(Cel))     LCD1602.write(7, 1, str(upperTem)) time.sleep(0.1)     if Cel >= upperTem:         GPIO.output(buzzPin, GPIO.HIGH)         GPIO.output(ledPin, GPIO.HIGH) else:         GPIO.output(buzzPin, GPIO.LOW)         GPIO.output(ledPin, GPIO.LOW) Al ejecutar el código, la temperatura actual y el umbral de alta temperatura **40** se muestran en **I2C LCD1602**. Si la temperatura actual supera el umbral, el zumbador y el LED se activarán para alertarte. .. code-block:: python def loop():     lastState=1     stage=0     while True:         currentState=GPIO.input(Joy_BtnPin)         if currentState==1 and lastState ==0:             stage=(stage+1)%2 time.sleep(0.1) LCD1602.clear()         lastState=currentState         if stage == 1: upper_tem_setting() else: monitoring_temp() La función main() contiene todo el proceso del programa como se muestra: 1) Al iniciar el programa, el valor inicial de **stage** es **0**, y la temperatura actual y el umbral de alta temperatura **40** se muestran en **I2C LCD1602**. Si la temperatura actual es mayor que el umbral, el zumbador y el LED se activarán para alertarte. 2) Presiona el Joystick y **stage** cambiará a **1**, permitiéndote ajustar el umbral de alta temperatura. Moviendo el Joystick en las direcciones del eje X e Y se puede ajustar (aumentar o disminuir) el umbral de temperatura actual. Vuelve a presionar el Joystick para restablecer el umbral al valor inicial. Imagen del Fenómeno ------------------------- .. image:: img/image259.jpeg :align: center