#Nombre y apellido:
#Rodriguez Oro Tobias Joel
#Romera Pecora Lourdes Natalie
#Fecha: 05/07/2024
#UNLAM
#PROYECTO: controlador de incubadora de huevos de gallina
import time
import machine
import micropython
import network
import dht
import tm1637
from machine import Pin,PWM
from umqtt.simple import MQTTClient
from tm1637 import TM1637
ssid = 'Wokwi-GUEST'
wifipassword = ''
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'JoelRodriguez'
password = 'aio_umTm94lpYJOU5aPM2KbcpxrzY2nt'
client_id = 'IncubadoraPollitos'
topic_sensorH = 'JoelRodriguez/feeds/SensorHum' #Sensor de Humedad
topic_sensorT='JoelRodriguez/feeds/SensorTemp'#Sensor de temperatura
topic_humect= 'JoelRodriguez/feeds/Sist_Humedad'#Led Sistema Humedad
topic_refrig= 'JoelRodriguez/feeds/Sist_Refrigeracion' #Led Sistema Refrigeracion
topic_display='JoelRodriguez/feeds/Display' #Display con los dias totales de incubacion
topic_FinCiclo= 'JoelRodriguez/feeds/FinIncubacion' #Led indica cambio de sector/Fin de la incubacion
topic_ALARMA = 'JoelRodriguez/feeds/AlarmaGeneral' #Alarma General
#Definicion de pines, estado, etc
ALARMA_ACTIVA=False #Estado Inicial de la alarma
display=TM1637(clk=Pin(27), dio=Pin(26))
contador=0 #DiasDeIncubacion
display.number(contador)
LedAzul= Pin(19,Pin.OUT) #Indica inicio de Sistema de refrigeracion
LedBlanco= Pin(21, Pin.OUT) #Indica inicio de Sistema de Humedad
LedAmarillo= Pin(5, Pin.OUT) #Indica Fin Del Ciclo de Incubacion
LedAlarma= Pin(17, Pin.OUT) #Define estado de la alarma
sensor= dht.DHT22(Pin(14))
alarma=PWM(Pin(18), freq=1200, duty_u16=32768)
alarma.duty(0)
#Conexion a internet
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(ssid, wifipassword)
print("Conectando")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("Conectado a Wifi!")
print(sta_if.ifconfig())
#Funcion para permitir un mensaje a la vez
def callback_alarma(topic, msg):
global ALARMA_ACTIVA,LedAlarma, contador, display
dato = msg.decode('utf-8')
topicRecibido = topic.decode('utf-8')
print("Cambio en: "+topicRecibido+":"+dato)
if(topicRecibido==topic_ALARMA and "OFF" in dato):
ALARMA_ACTIVA=False
elif (topicRecibido==topic_ALARMA and "ON" in dato):
ALARMA_ACTIVA=True
if(topicRecibido==topic_display and "ON" in dato):
contador=0
LedAlarma.value(ALARMA_ACTIVA)
#Conexion al cliente y subscripcion a topicos
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=user,password=password,port=int(port))
conexionMQTT.set_callback(callback_alarma)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_ALARMA)
conexionMQTT.subscribe(topic_humect)
conexionMQTT.subscribe(topic_refrig)
conexionMQTT.subscribe(topic_display)
conexionMQTT.subscribe(topic_FinCiclo)
conexionMQTT.subscribe(topic_sensorH)
conexionMQTT.subscribe(topic_sensorT)
print("Conectado con Broker MQTT")
except OSError as e:
#Si fallo la conexion, reiniciamos todo
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
#Funcion que retorna temperatura
def MideTemperatura():
sensor.measure()
temp=sensor.temperature()
return temp
#Funcion que retorna humedad
def MideHumedad():
sensor.measure()
hum=sensor.humidity()
return hum
#Establece limites maximos y minimos
tempMax=38.3
tempMin=36.6
humMax=50
humMin=40
temp=MideTemperatura()
hum=MideHumedad()
print("Temp= " +str(temp) )
print("hum= "+str(hum))
LedAzulAnt=LedAzul.value()
LedBlancoAnt=LedBlanco.value()
LedAmarilloAnt=LedAmarillo.value()
suenaTemp=False
suenaHum=False
suenaCont=False
LimDias=19 #Avisa porque pasa a otro sector
#LOOP PRINCIPAL
while True:
try:
conexionMQTT.check_msg()
time.sleep_ms(500)
NuevaTemp = MideTemperatura()
NuevaHum = MideHumedad()
Nuevcontador=contador
if ALARMA_ACTIVA:
if NuevaTemp<tempMin or NuevaTemp>tempMax:
suenaTemp=True
LedAzul.value(1)
if not LedAzulAnt:
conexionMQTT.publish(topic_refrig, str(1))
else:
suenaTemp=False
LedAzul.value(0)
if LedAzulAnt:
conexionMQTT.publish(topic_refrig, str(0))
if NuevaTemp != temp:
print("Hubo una variacion en la temperatura ambiente")
conexionMQTT.publish(topic_sensorT, str(NuevaTemp))
if NuevaHum<humMin or NuevaHum>humMax:
LedBlanco.value(1)
suenaHum=True
if not LedBlancoAnt:
conexionMQTT.publish(topic_humect, str(1))
else:
suenaHum=False
LedBlanco.value(0)
if LedBlancoAnt:
conexionMQTT.publish(topic_humect, str(0))
if NuevaHum != hum:
print("Hubo una variacion en la humedad")
conexionMQTT.publish(topic_sensorH, str(NuevaHum))
if contador < LimDias:
Nuevcontador+=1
display.number(Nuevcontador)
LedAmarillo.value(0)
suenaCont=False
if LedAmarilloAnt:
conexionMQTT.publish(topic_FinCiclo, str(0))
elif contador==LimDias:
LedAmarillo.value(1)
suenaCont=True
if not LedAmarilloAnt:
conexionMQTT.publish(topic_FinCiclo, str(1))
else:
suenaTemp=False
suenaHum=False
suenaCont=False
LedBlanco.value(0)
LedAzul.value(0)
LedAmarillo.value(0)
temp=NuevaTemp
hum=NuevaHum
contador=Nuevcontador
LedAzulAnt=LedAzul.value()
LedBlancoAnt=LedBlanco.value()
LedAmarilloAnt=LedAmarillo.value()
if suenaTemp or suenaHum or suenaCont:
alarma.duty(512)
else:
alarma.duty(0)
except OSError as e:
print("Error ",e)
time.sleep(5)
machine.reset()