import machine
from machine import Pin, ADC
import time
import math
import network
from umqtt.simple import MQTTClient
#PRIMERO NOS CONECTAMOS A LA RED WIFI#
#Indicamos Red WIFI y contraseña
ssid= 'Wokwi-GUEST'
wificontraseña= ''
#Definimos modo Station (conectarse a Access Point remoto)
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
#Conectamos al wifi
sta_if.connect(ssid, wificontraseña)
print("Conectando")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("Conectado a Wifi!")
#LUEGOS NOS CONECTAMOS AL BROKER MQTT#
#Indicamos datos MQTT Broker (server y puerto)
mqtt_server= 'io.adafruit.com'
port= 1883
usuario= "proyectoiot10"
contraseña= "aio_JBXN83OzmbfY1dssPBihV4T7Wmo5"
cliente_id= 'ControlCalefactorPecera'
topic_ingreso_temp= 'proyectoiot10/feeds/SensorTemp'
topic_estado_calefactor= 'proyectoiot10/feeds/Calefactor'
topic_setpoint= 'proyectoiot10/feeds/setpoint'
#FUNCION PARA RECIBIR DATOS DEL BROKER#
def funcion_callback(topic, msg):
global setpoint_actual
topic_str = topic.decode('utf-8')
msg_str = msg.decode('utf-8')
print(f"Mensaje en topic {topic_str}: {msg_str}")
if topic_str == topic_setpoint:
setpoint_actual = float(msg_str)
print(f"Nuevo setpoint recibido: {setpoint_actual} °C")
#INTENTO DE CONEXION CON EL BROKER #
try:
conexionMQTT = MQTTClient(cliente_id, mqtt_server, user=usuario, password=contraseña, port=int(port))
conexionMQTT.set_callback(funcion_callback)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_setpoint)
print("Conectado con Broker MQTT")
except OSError as e:
print(f"Fallo la conexión al Broker: {e}, reiniciando...")
time.sleep(5)
machine.reset()
# Pines configurados
PIN_NTC = 1
PIN_RELE = 7
TEMPERATURA_DESEADA = 28.0
HISTEREIS = 0.5
sensor_adc_ntc = ADC(Pin(PIN_NTC))
control_rele = Pin(PIN_RELE, Pin.OUT)
control_rele.value(0) # Relé apagado al inicio
def leer_temperatura_ntc():
valor_analogico = sensor_adc_ntc.read() # Lectura entre 0 y 4095 para ESP32
if valor_analogico == 0 or valor_analogico == 4095:
return -273.15 # Evitar divisiones por 0 o log de 0
BETA = 3950
celsius = 1 / (math.log(1 / (4095. / valor_analogico - 1)) / BETA + 1.0 / 298.15) - 273.15
return celsius
setpoint_actual = 25.0 # Valor inicial por defecto
print("Sistema de Regulación de Temperatura de Pecera iniciado")
while True:
# Revisar si hay mensajes MQTT entrantes y llamar al callback si los hay
try:
conexionMQTT.check_msg()
except OSError as e:
print(f"Error al recibir mensaje MQTT: {e}")
# Leer la temperatura actual del sensor NTC
temperatura_actual = leer_temperatura_ntc()
print(f"Temperatura actual: {temperatura_actual:.2f} °C, Setpoint: {setpoint_actual:.2f} °C")
# Si la temperatura está por debajo del setpoint menos la histéresis, prender el calefactor
if temperatura_actual < (setpoint_actual - HISTEREIS):
control_rele.value(1) # Encender relé (calefactor)
conexionMQTT.publish(topic_estado_calefactor, "1") # Enviar estado ON al broker
print("Calefactor ENCENDIDO")
# Si la temperatura está por encima del setpoint más la histéresis, apagar el calefactor
else:
control_rele.value(0) # Apagar relé (calefactor)
conexionMQTT.publish(topic_estado_calefactor, "0") # Enviar estado OFF al broker
print("Calefactor APAGADO")
# Publicar la temperatura actual al broker MQTT en el feed correspondiente
conexionMQTT.publish(topic_ingreso_temp, str(temperatura_actual))
# Esperar 5 segundos antes de la siguiente lectura y publicación
time.sleep(5)