#Proyecto Final Jensy Villafranca

#ÁREA DE LIBRERIAS
from machine import Pin, PWM, ADC, I2C
from utime import sleep, sleep_ms
import time
import math
from i2c_lcd import I2cLcd
import math
from math import log
import network 
import ujson
from umqtt.simple import MQTTClient

#ÁREA DE VARIABLES
#--Potenciometros
frecuencia = 5000
minimo_original_pot = 0
maximo_original_pot = 4095
minimo_nuevo_pot = 1
maximo_nuevo_pot = 100
#Inicializar el pin del potenciometro
potenciometro =  ADC(Pin(13))
potenciometro.atten(ADC.ATTN_11DB) 
potenciometroPeso =  ADC(Pin(34))
potenciometroPeso.atten(ADC.ATTN_11DB) 
#-------------------

#--RGB
pinRojo_rgb_gasolina = PWM(Pin(23), freq=frecuencia)
pinRojo_rgb_gasolina.duty(512)
pinVerde_rgb_gasolina = PWM(Pin(21), freq=frecuencia)
pinVerde_rgb_gasolina.duty(512)
pinAzul_rgb_gasolina = PWM(Pin(22), freq=frecuencia)
pinAzul_rgb_gasolina.duty(512)
#---------------------
pinRojo_rgb_temperatura = PWM(Pin(15), freq=frecuencia)
pinRojo_rgb_temperatura.duty(512)
pinVerde_rgb_temperatura = PWM(Pin(2), freq=frecuencia)
pinVerde_rgb_temperatura.duty(512)
pinAzul_rgb_temperatura = PWM(Pin(4), freq=frecuencia)
pinAzul_rgb_temperatura.duty(512)
#----------------------
pinRojo_rgb_peso = PWM(Pin(16), freq=frecuencia)
pinRojo_rgb_peso.duty(512)
pinVerde_rgb_peso = PWM(Pin(17), freq=frecuencia)
pinVerde_rgb_peso.duty(512)
pinAzul_rgb_peso = PWM(Pin(5), freq=frecuencia)
pinAzul_rgb_peso.duty(512)
#-----------------------

#--Pantallas
tamañoLCD = 0x27
i2c = I2C(scl = Pin(32), sda=Pin(33), freq=400000) #LCD Gasolina
i2c_2 = I2C(scl = Pin(25), sda=Pin(26), freq=400000) #LCD Temperatura
i2c_3 = I2C(scl = Pin(27), sda=Pin(14), freq=400000) #LCD Peso
pantalla_gasolina = I2cLcd(i2c, tamañoLCD, 4, 20) #Pantalla Gasolina
pantalla_temperatura = I2cLcd(i2c_2, tamañoLCD, 4, 20) #Pantalla Gasolina
pantalla_peso = I2cLcd(i2c_3, tamañoLCD, 4, 20) #Pantalla Peso
#4 y 20 son las celdas del LCD
#-------------------------

#--Buzzer
buzzer = Pin(19,Pin.OUT)
#la frecuencia en el buzzer sirve para el tono musical del mismo, corresponde al tono musical "La"
#--------------------------

#--Variables de estado
estadoGasolina = ""
estadoTemperatura = ""
estadoPeso = ""
#---------------------------

#--Sensor de Temperatura
BETA = 3950 # es el coeficiente del beta del termistor (constante)
constanteGradosKelvin = 273.15
sensorTemperatura_pin = ADC(12)
#----------------------------

#--Variables auxiliares
prioridad = 0
vecesMQQT = 0
estadoAlarma = 0

#--Variables MQQT
MQTT_CLIENT_ID = "" 
MQTT_BROKER = "18.116.156.233" 
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "sensores/#"

#--Datos a enviar a servidor MQQT alojado en instancia de AWS
placa = "HAA0005"

#Para el modelo 6225E (Modelo 4) usar este enlace: https://empresaagricola.ddns.net/modelo6225E.jpg

enlaceFoto = "https://empresaagricola.ddns.net/modelo5055E.jpg"
porcentajeGasolina = 0
porcentajeTemperatura = 0
porcentajePeso = 0
idEstadoTractor = 5
latitud = 13.092243
longitud = -86.951866
idLote = 1
idEmpleado = 5
idModelo = 5

#ÁREA DE FUNCIONES
#Función para conectarme a MQQT
def conectar_mqqt(valorG, valorT, valorP):
    global vecesMQQT
    vecesMQQT+=1
    print("Conectandome a MQTT",end="")
    cliente = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD, port=1883)
    #Estableciendo conexión con el servidor MQQT
    cliente.connect()
    mensaje = ujson.dumps({
        "gasolina" : valorG,
        "temperatura" : valorT,
        "peso" : valorP,
        "placa" : placa,
        "enlaceFoto" : enlaceFoto,
        "porcentajeGasolina" : porcentajeGasolina,
        "porcentajeTemperatura" : porcentajeTemperatura,
        "porcentajePeso" : porcentajePeso,
        "idEstadoTractor" : idEstadoTractor,
        "latitud" : latitud,
        "longitud" : longitud,
        "idLote" : idLote,
        "idEmpleado" : idEmpleado,
        "idModelo" : idModelo
    })
    cliente.publish("sensores/temperatura", mensaje)
    print("...Conectado a MQQT")
    
#Función para conectarme a internet
def conectar_wifi():
    print("Conectándonos al WIFI", end="")
    red = network.WLAN(network.STA_IF) #De tipo cliente
    red.active(True)
    red.connect('Wokwi-GUEST', '')

    while not red.isconnected():
        print(".", end="")
        time.sleep(0.5)
    print("Conectado") 


#Función para desconectarme a internet
def desconectar_wifi():
    red = network.WLAN(network.STA_IF) 
    if red.isconnected():
        red.disconnect()  
        red.active(False) 
        print("Desconectado del WiFi")
    else:
        print("No estaba conectado")

#Función para alarma de gasolina
def alarmaGasolina(mapeo_valores_pot):
    global prioridad
    #Nivel Insuficiente
    if(mapeo_valores_pot >=1 and mapeo_valores_pot <=25):
        estadoGasolina = "Estado: Critico"
        #print("Esta es una prueba", estadoGasolina)
        pantalla_gasolina.move_to(15, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(16, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(17, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(18, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(19, 1)

        if(mapeo_valores_pot <=15):
            print("Prioridad Gasolina: ",prioridad)
            if(prioridad==1 or prioridad==2):
                reproducir_alarma(prioridad)
            elif(prioridad == 0):
                reproducir_alarma(3) #el 3 significa que es de gasolina
            prioridad = 0
            pantalla_gasolina.move_to(0, 2)
            pantalla_gasolina.putstr("*Rebastecer Pronto*")
            colorearLedGasolina(65535,0,0) #Color Rojo
        time.sleep(0.3)
    elif(mapear_valores_pot >25 and mapeo_valores_pot <=50):
        colorearLedGasolina(65535,11000,0) #Color Naranja
        estadoGasolina = "Estado: Bajo"
        pantalla_gasolina.move_to(12, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(13, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(14, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(15, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(16, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(17, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(18, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(19, 1)
        pantalla_gasolina.putstr(' ')
        limpiarMensaje()
      



    elif(mapear_valores_pot >50 and mapear_valores_pot <=75):
        colorearLedGasolina(65535,65535,0) #Color Amarillo
        estadoGasolina = "Estado: Estable"
        pantalla_gasolina.move_to(15, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(16, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(17, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(18, 1)
        pantalla_gasolina.putstr(' ')
        pantalla_gasolina.move_to(19, 1)
        pantalla_gasolina.putstr(' ')
        limpiarMensaje()



    elif(mapear_valores_pot >75): #Color Verde
        colorearLedGasolina(0,65535,0)
        estadoGasolina = "Estado: Tanque Lleno"
        limpiarMensaje()

    imprimirMensajesGasolina(round(mapeo_valores_pot),estadoGasolina) #Esta es una prueba mía

#Función para imprimir mensajes en la LCD - Gasolina
def imprimirMensajesGasolina(mapeoValores, estadoCombustible):
    pantalla_gasolina.move_to(0, 0)
    pantalla_gasolina.putstr('Nivel Gasolina: '+ str(mapeoValores) + "%")
    pantalla_gasolina.move_to(0, 1)
    pantalla_gasolina.putstr(estadoCombustible)
    if(mapeoValores < 10): #Para el correcto formato de visualización
        pantalla_gasolina.move_to(18, 0)
        pantalla_gasolina.putstr(' ')

#Función para imprimir mensajes en la LCD - Temperatura
def imprimirMensajesTemperatura(grados, estadoTemperatura):
    pantalla_temperatura.move_to(0, 0)
    pantalla_temperatura.putstr('Temperatura: '+ str(grados) + " C")
    pantalla_temperatura.move_to(0, 1)
    pantalla_temperatura.putstr(estadoTemperatura)
    if(grados < 10 and grados > 0): #Para el correcto formato de visualización
        pantalla_temperatura.move_to(14, 0)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(15, 0)
        pantalla_temperatura.putstr('C')
        pantalla_temperatura.move_to(16, 0)
        pantalla_temperatura.putstr(' ')
    elif(grados < 0 and grados > -10):
        pantalla_temperatura.move_to(17, 0)
        pantalla_temperatura.putstr(' ')
    elif(grados == 0):
        pantalla_temperatura.move_to(16, 0)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(17, 0)
        pantalla_temperatura.putstr(' ')

#Función para imprimir mensajes en la LCD - Peso
def imprimirMensajesPeso(toneladas, estadoPeso):
    pantalla_peso.move_to(0, 0)
    pantalla_peso.putstr('Peso: '+ str(toneladas) + " Tn")
    pantalla_peso.move_to(0, 1)
    pantalla_peso.putstr(estadoPeso)
    if(toneladas == 0.0):
        pantalla_peso.move_to(12, 0)
        pantalla_peso.putstr(' ')


#Función para colorear el led correspondiente a la gasolina
#duty_u16() acepta valores entre 0 y 65535
def colorearLedGasolina(colorRojo, colorVerde, colorAzul):
    pinRojo_rgb_gasolina.duty_u16(colorRojo)
    pinVerde_rgb_gasolina.duty_u16(colorVerde)
    pinAzul_rgb_gasolina.duty_u16(colorAzul)

#Función para colorear el led correspondiente a la temperatura
def colorearLedTemperatura(colorRojo, colorVerde, colorAzul):
    pinRojo_rgb_temperatura.duty_u16(colorRojo)
    pinVerde_rgb_temperatura.duty_u16(colorVerde)
    pinAzul_rgb_temperatura.duty_u16(colorAzul)

#Función para colorear el led correspondiente al peso
def colorearLedPeso(colorRojo, colorVerde, colorAzul):
    pinRojo_rgb_peso.duty_u16(colorRojo)
    pinVerde_rgb_peso.duty_u16(colorVerde)
    pinAzul_rgb_peso.duty_u16(colorAzul)


#Función para poder reproducir el sonido en el buzzer
def sonidoAlarma(duracion, frecuencia):
    periodo_sonido = 1 / (frecuencia * 2) #Periodo de una onda cuadrada
    tiempo_finalizar = time.ticks_add(time.ticks_ms(), duracion)
    while time.ticks_diff(tiempo_finalizar, time.ticks_ms()) > 0:
        buzzer.value(1)
        estadoAlarma = 1
        time.sleep(periodo_sonido)
        buzzer.value(0)
        time.sleep(periodo_sonido)

# Función para alternar entre dos tonos 
def reproducir_alarma(tipoAlarma):
    if(tipoAlarma == 1): #sonido fuerte
        sonidoAlarma(1200,1000)
        time.sleep(0.3)
    elif(tipoAlarma == 2): #sonido intermedio
        sonidoAlarma(800, 500)
        time.sleep(0.3)
    elif(tipoAlarma == 3): #sonido bajo
        sonidoAlarma(350, 200)
        time.sleep(0.3)

#Función para limpiar mensaje de recarga del tanque
def limpiarMensaje():
    pantalla_gasolina.move_to(0, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(1, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(2, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(3, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(4, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(5, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(6, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(7, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(8, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(9, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(10, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(11, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(12, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(13, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(14, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(15, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(16, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(17, 2)
    pantalla_gasolina.putstr(' ')
    pantalla_gasolina.move_to(18, 2)
    pantalla_gasolina.putstr(' ')

#Función para convertir la temperatura a grados Celsius.
def convertirTemperatura(valoresADC):
    #Formula ya dada por el modelo Steinhart-Hart
    return (1 / (log(1/(65535/valoresADC - 1))/BETA + 1/298.15) - constanteGradosKelvin)

#Función para alarma de la temperatura
def alarmaTemperatura(gradosCelsius):
    global prioridad
    if(gradosCelsius <=0):
        estadoTemperatura = "Frio Extremo"
        colorearLedTemperatura(8000,50000,60000)#azul celeste
        if(prioridad==1 or prioridad==2):
            reproducir_alarma(prioridad)
        elif(prioridad == 0):
            reproducir_alarma(1) #el 1 significa que es el de temperatura
        prioridad = 0
        pantalla_temperatura.move_to(0,3)
        pantalla_temperatura.putstr('Motor Congelado')

        pantalla_temperatura.move_to(12, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(13, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(14, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(15, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(16, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(17, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(18, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(19, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(15, 3)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(16, 3)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(17, 3)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(18, 3)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(19, 3)
        pantalla_temperatura.putstr(' ')

    elif(gradosCelsius >0 and gradosCelsius<=20):
        if(gradosCelsius<=5):
            if(prioridad==1 or prioridad==2):
                reproducir_alarma(prioridad)
            elif(prioridad == 0):
                reproducir_alarma(1) #el 1 significa que es el de temperatura 
            prioridad = 0
            pantalla_temperatura.move_to(0,3)
            pantalla_temperatura.putstr('Proximo a congelarse')
        else:
            pantalla_temperatura.move_to(0,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(1,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(2,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(3,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(4,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(5,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(6,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(7,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(8,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(9,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(10,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(11,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(12,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(13,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(14,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(15,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(16,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(17,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(18,3)
            pantalla_temperatura.putstr(' ')
            pantalla_temperatura.move_to(19,3)
            pantalla_temperatura.putstr(' ')

            
        estadoTemperatura = "Temperatura Fresca"
        colorearLedTemperatura(20000,65535,0)#verde claro
        pantalla_temperatura.move_to(18, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(19, 1)
        pantalla_temperatura.putstr(' ')


    elif(gradosCelsius >20 and gradosCelsius<=40):
        limpiarMensajeTemperatura()
        limpiarMensajeTemperaturaCongeladas()
        estadoTemperatura = "Temperatura Calida"
        colorearLedTemperatura(65535,65535,0)#amarillo

        pantalla_temperatura.move_to(18, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(19, 1)
        pantalla_temperatura.putstr(' ')

    elif(gradosCelsius >40 and gradosCelsius<=60):
        limpiarMensajeTemperatura()
        limpiarMensajeTemperaturaCongeladas()
        estadoTemperatura = "Muy Caliente"
        colorearLedTemperatura(65535,11000,0)#anaranjado

        pantalla_temperatura.move_to(12, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(13, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(14, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(15, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(16, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(17, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(18, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(19, 1)
        pantalla_temperatura.putstr(' ')



    elif(gradosCelsius >60):
        estadoTemperatura = "Calor Extremo"
        colorearLedTemperatura(65535,0,0)#rojo
        if(prioridad==1 or prioridad==2):
            reproducir_alarma(prioridad)
        elif(prioridad == 0):
            reproducir_alarma(1) #el 1 significa que es el de temperatura 

        pantalla_temperatura.move_to(0,3)
        pantalla_temperatura.putstr('Equipo recalentado')

        pantalla_temperatura.move_to(13, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(14, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(15, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(16, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(17, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(18, 1)
        pantalla_temperatura.putstr(' ')
        pantalla_temperatura.move_to(19, 1)
        pantalla_temperatura.putstr(' ')

    imprimirMensajesTemperatura(round(gradosCelsius),estadoTemperatura)

def limpiarMensajeTemperatura():
    pantalla_temperatura.move_to(0,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(1,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(2,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(3,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(4,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(5,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(6,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(7,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(8,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(9,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(10,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(11,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(12,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(13,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(14,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(15,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(16,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(17,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(18,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(19,3)
    pantalla_temperatura.putstr(' ')

def limpiarMensajeTemperaturaCongeladas():
    pantalla_temperatura.move_to(0,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(1,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(2,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(3,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(4,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(5,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(6,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(7,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(8,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(9,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(10,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(11,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(12,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(13,3)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(14,3)
    pantalla_temperatura.putstr(' ')

#Función para limpiar mensaje de exceso de peso
def limpiarMensajaPeso():
    pantalla_peso.move_to(0,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(1,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(2,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(3,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(4,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(5,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(6,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(7,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(8,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(9,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(10,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(11,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(12,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(13,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(14,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(15,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(16,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(17,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(18,3)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(19,3)
    pantalla_peso.putstr(' ')

#Metodo para la alarma de Peso
def alarmaPeso(toneladas):
    global prioridad
    if(toneladas <= 2):  #Peso estable
        colorearLedPeso(0,65535,0) #verde
        estadoPeso = "Peso Estable"
        pantalla_peso.move_to(12, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(13, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(14, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(15, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(16, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(17, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(18, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(19, 1)
        pantalla_peso.putstr(' ')
        limpiarMensajaPeso()
    elif(toneladas> 2 and toneladas <=4):
        colorearLedPeso(65535,65535,0) #amarillo
        estadoPeso = "Peso Medio"
        pantalla_peso.move_to(10, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(11, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(12, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(13, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(14, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(15, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(16, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(17, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(18, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(19, 1)
        pantalla_peso.putstr(' ')
        limpiarMensajaPeso()
    elif(toneladas > 4):
        colorearLedPeso(65535,0,0) #rojo
        estadoPeso = "Exceso de peso"
        print("Prioridad en peso: ",prioridad)
        if(prioridad==1 or prioridad==2):
            reproducir_alarma(prioridad)
        elif(prioridad == 0):
            reproducir_alarma(2) #el 2 significa que es de peso 
        prioridad = 0
       
        pantalla_peso.move_to(14, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(15, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(16, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(17, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(18, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(19, 1)
        pantalla_peso.putstr(' ')
        pantalla_peso.move_to(0,3)
        pantalla_peso.putstr('*Retirar peso ahora*')
    imprimirMensajesPeso(round(toneladas,2), estadoPeso)
        
#Función para prioridad del buzzer
def prioridadBuzzer(estado_buzzer_gasolina, estado_buzzer_temperatura, estado_buzzer_peso):
    global prioridad
    if((estado_buzzer_gasolina == 1 and estado_buzzer_temperatura == 1) or (estado_buzzer_temperatura == 1 and estado_buzzer_peso == 1)):
        #la prioridad es para el de temperatura
        prioridad = 1
        print(prioridad)
    elif(estado_buzzer_gasolina == 1 and estado_buzzer_peso == 1):
        #la prioridad es para el peso
        prioridad = 2
        print(prioridad)
    elif(estado_buzzer_gasolina ==1 and estado_buzzer_peso ==1 and estado_buzzer_temperatura==1):
        #la prioridad es para la temperatura
        prioridad = 1

#Función para evaluar la prioridad del buzzer
def evaluar_prioridad_buzzer(gasolina, grados, toneladas):
    if(gasolina<=15 and (grados<=5 or grados<0 or grados>60) and toneladas<=4):
        prioridadBuzzer(1,1,0)
    elif(toneladas>4 and gasolina>15 and (grados<=5 or grados<0 or grados>60) ):
        prioridadBuzzer(0,1,1)
    elif(gasolina<=15 and toneladas>4 and (grados>5 and grados<=60)):
        prioridadBuzzer(1,0,1)
    elif(gasolina<=15 and (grados<=5 or grados<0 or grados>60) and toneladas>4):
        prioridadBuzzer(1,1,1)

#Función para barra de carga
def barraCarga(lcd1, lcd2, lcd3, porcentaje):
    lcd1.move_to(0, 0)
    lcd1.putstr("CARGANDO")
    lcd1.move_to(0, 1)
    
    # Dibuja la barra de carga
    blocks = int((porcentaje / 100) * 20)
    lcd1.putstr(chr(255) * blocks + '-' * (20 - blocks))
    
    # Muestra el porcentaje
    lcd1.move_to(7, 2)
    lcd1.putstr(f"{porcentaje}%")
    #--------------------------------
    lcd2.move_to(0, 0)
    lcd2.putstr("CARGANDO")
    lcd2.move_to(0, 1)
    
    # Dibuja la barra de carga
    blocks = int((porcentaje / 100) * 20)
    lcd2.putstr(chr(255) * blocks + '-' * (20 - blocks))
    
    # Muestra el porcentaje
    lcd2.move_to(7, 2)
    lcd2.putstr(f"{porcentaje}%")
    #---------------------------------
    lcd3.move_to(0, 0)
    lcd3.putstr("CARGANDO")
    lcd3.move_to(0, 1)
    
    # Dibuja la barra de carga
    blocks = int((porcentaje / 100) * 20)
    lcd3.putstr(chr(255) * blocks + '-' * (20 - blocks))
    
    # Muestra el porcentaje
    lcd3.move_to(7, 2)
    lcd3.putstr(f"{porcentaje}%")

#No sirve
def limpiarBarraCarga():
    print("Ingresa a limpiar")
    pantalla_temperatura.move_to(7, 2)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(8, 2)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(9, 2)
    pantalla_temperatura.putstr(' ')
    pantalla_temperatura.move_to(10, 2)
    pantalla_temperatura.putstr(' ')
    pantalla_peso.move_to(7, 2)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(8, 2)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(9, 2)
    pantalla_peso.putstr(' ')
    pantalla_peso.move_to(10, 2)
    pantalla_peso.putstr(' ')

while True:
    if(vecesMQQT == 0):
        conectar_wifi()
        conectar_mqqt(0,0,0) #aqui esta el problema del 0 0 0  al apagar
        for i in range(0, 101, 5):
            barraCarga(pantalla_gasolina, pantalla_temperatura,pantalla_peso,i)
            sleep_ms(1)
    else:
        limpiarBarraCarga()
    try:
        desconectar_wifi()
        duty_cicle = potenciometro.read() # Lectura del potenciometro
        # Mapeo del valor del potenciometro para representarlo en un rango del 1% al 100%.
        mapear_valores_pot = ((duty_cicle - minimo_original_pot) / (maximo_original_pot - minimo_original_pot) * (maximo_nuevo_pot - minimo_nuevo_pot) + minimo_nuevo_pot)
        alarmaGasolina(mapear_valores_pot)

        # Lectura del sensor de temperatura NTC
        lectura_sensor_temperatura = sensorTemperatura_pin.read_u16()
        alarmaTemperatura(convertirTemperatura(lectura_sensor_temperatura))

        # Lectura del sensor de peso
        duty_cicle_Peso = potenciometroPeso.read()
        toneladas = duty_cicle_Peso / 1000
        alarmaPeso(toneladas)
        print("Peso: (Toneladas) ", toneladas)
        evaluar_prioridad_buzzer(mapear_valores_pot, convertirTemperatura(lectura_sensor_temperatura), toneladas)
        conectar_wifi()
        conectar_mqqt(mapear_valores_pot, convertirTemperatura(lectura_sensor_temperatura), toneladas)
        sleep(10)
    except Exception as e:
        print("Ocurrió un error:", e)


$abcdeabcde151015202530354045505560fghijfghij