from machine import Pin, I2C, ADC
from pico_i2c_lcd import I2cLcd
import time
import dht
import skfuzzy as fuzz
from skfuzzy import control as ctrl
# Configuración de pines
led25 = Pin(25, Pin.OUT)
pir_pin = Pin(13, Pin.IN)
relay_pin = Pin(12, Pin.OUT)
Sensor = dht.DHT22(Pin(2))
sensor = ADC(26)
# Inicialización del objeto I2C
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
address = i2c.scan()[0]
# Inicialización del objeto LCD
lcd = I2cLcd(i2c, address, 4, 20)
# Crear objetos para las variables de entrada y salida difusa
temperatura = ctrl.Antecedent(np.arange(0, 101, 1), 'temperatura')
humedad = ctrl.Antecedent(np.arange(0, 101, 1), 'humedad')
luz = ctrl.Antecedent(np.arange(0, 101, 1), 'luz')
movimiento = ctrl.Antecedent(np.arange(0, 2, 1), 'movimiento')
aire_acondicionado = ctrl.Consequent(np.arange(0, 2, 1), 'aire_acondicionado')
# Definir funciones de membresía
temperatura['baja'] = fuzz.trimf(temperatura.universe, [0, 0, 50])
temperatura['alta'] = fuzz.trimf(temperatura.universe, [0, 50, 100])
humedad['baja'] = fuzz.trimf(humedad.universe, [0, 0, 50])
humedad['alta'] = fuzz.trimf(humedad.universe, [0, 50, 100])
luz['baja'] = fuzz.trimf(luz.universe, [0, 0, 50])
luz['alta'] = fuzz.trimf(luz.universe, [0, 50, 100])
movimiento['no_detectado'] = fuzz.trimf(movimiento.universe, [0, 0, 1])
movimiento['detectado'] = fuzz.trimf(movimiento.universe, [0, 1, 1])
aire_acondicionado['apagado'] = fuzz.trimf(aire_acondicionado.universe, [0, 0, 1])
aire_acondicionado['encendido'] = fuzz.trimf(aire_acondicionado.universe, [0, 1, 1])
# Definir reglas difusas
rule1 = ctrl.Rule(temperatura['baja'] & humedad['baja'] & luz['baja'] & movimiento['detectado'], aire_acondicionado['encendido'])
rule2 = ctrl.Rule(temperatura['alta'] | humedad['alta'] | luz['alta'] | movimiento['no_detectado'], aire_acondicionado['apagado'])
# Crear el sistema de control difuso
sistema_control = ctrl.ControlSystem([rule1, rule2])
controlador = ctrl.ControlSystemSimulation(sistema_control)
cont = 0 # Contador de encendidos y apagados del aire acondicionado
while 1:
# Lecturas de sensores
signal = int(sensor.read_u16() * (100 / 65535))
Sensor.measure()
h = Sensor.humidity()
t = Sensor.temperature()
# Mostrar lecturas en LCD
lcd.move_to(0, 0)
lcd.putstr("Temp: {:.2f} C".format(t))
lcd.move_to(0, 1)
lcd.putstr("Humedad: {:.2f}%".format(h))
lcd.move_to(0, 2)
lcd.putstr("Luz: {}".format(signal))
lcd.move_to(0, 3)
lcd.putstr("Movimiento: {}".format("Detectado" if pir_pin.value() else "No detectado"))
# Evaluar el sistema de control difuso
controlador.input['temperatura'] = t
controlador.input['humedad'] = h
controlador.input['luz'] = signal
controlador.input['movimiento'] = 1 if pir_pin.value() else 0
# Computar la salida del sistema de control difuso
controlador.compute()
# Obtener el valor de salida
valor_salida = controlador.output['aire_acondicionado']
if pir_pin.value() == 1:
# Detección de movimiento
if valor_salida > 0.5:
# Encender el aire acondicionado
cont += 1
relay_pin.value(1)
lcd.move_to(0, 0)
lcd.putstr("AC Encendido: {}".format(cont))
lcd.move_to(0, 3)
lcd.putstr("Climatizando")
else:
# Apagar el aire acondicionado
relay_pin.value(0)
lcd.move_to(0, 0)
lcd.putstr("AC Apagado: {}".format(cont))
lcd.move_to(0, 3)
lcd.putstr("Esperando")
else:
# No hay detección de movimiento
# Apagar el aire acondicionado
relay_pin.value(0)
lcd.move_to(0, 0)
lcd.putstr("AC Apagado: {}".format(cont))
lcd.move_to(0, 3)
lcd.putstr("Esperando")
# Resto del código original
print("\nAire Acondicionado Apagado:{}".format(cont))
print("No se ha detectado Movimiento") # No se detecta presencia de personas