from machine import Pin, ADC
from utime import sleep
import dht
import time

class LDR:
    def __init__(self, pin):
        self.ldr_pin = ADC(Pin(pin))
        
    def get_raw_value(self):
        return self.ldr_pin.read_u16()
    
    def get_light_percentage(self):
        return 100 - round(self.get_raw_value()/65535*100,2) 

print("Hello, ESP32!")

th_sensor_1 = dht.DHT22(Pin(26))
th_sensor_2 = dht.DHT22(Pin(32))
light = Pin(25, Pin.OUT)
heater = Pin(14, Pin.OUT)
light_sensor = LDR(15)
valve = Pin(12, Pin.OUT)
fan = Pin(27, Pin.OUT)
program1 = Pin(4, Pin.IN)
program2 = Pin(21, Pin.IN)

selectedProgram = 1

programs = { 
    1: {
        "fan": {
            "max": 35,
            "min": 33
        },
        "light": {
            "max": 50,
            "min": 40
        },
        "heater": {
            "max": 33,
            "min": 30
        },
        "valve": {
            "max": 50,
            "min": 5
        },
        "refresh": 1
    },
    2: {
        "fan": {
            "max": 33,
            "min": 30
        },
        "light": {
            "max": 50,
            "min": 40
        },
        "heater": {
            "max": 31,
            "min": 28
        },
        "valve": {
            "max": 50,
            "min": 20
        },
        "refresh": 5
    }
}


def handleLight():
    percentage = light_sensor.get_light_percentage()
    if percentage > programs[selectedProgram]["light"]["max"]:
        light.off()
    if percentage < programs[selectedProgram]["light"]["min"]:
        light.on()


def handleFan():
    temperatures = [th_sensor_1.temperature(), th_sensor_2.temperature()]
    for temperature in temperatures:
        if temperature > programs[selectedProgram]["fan"]["max"]:
            fan.on()
        if temperature < programs[selectedProgram]["fan"]["min"]:
            fan.off()


def handleHeater():
    temperatures = [th_sensor_1.temperature(), th_sensor_2.temperature()]
    for temperature in temperatures:
        if temperature > programs[selectedProgram]["heater"]["max"]:
            heater.off()
        if temperature < programs[selectedProgram]["heater"]["min"]:
            heater.on()


def handleValve():
    humidities = [th_sensor_1.humidity(), th_sensor_2.humidity()]
    for humidity in humidities:
        if humidity > programs[selectedProgram]["valve"]["max"]:
            valve.off()
        if humidity < programs[selectedProgram]["valve"]["min"]:
            valve.on()


def handleProgram():
    if program1.value() == 1:
        globals()["selectedProgram"] = 1
    elif program2.value() == 1:
        globals()["selectedProgram"] = 2


while True:
    try:
        th_sensor_1.measure()     # Recuperère les mesures du capteur
        th_sensor_2.measure()     # Recuperère les mesures du capteur
        print(f"Temperature : {th_sensor_1.temperature():.1f}°C, {th_sensor_2.temperature():.1f}°C")
        print(f"Humidite    : {th_sensor_1.humidity():.1f}%, {th_sensor_2.humidity():.1f}%")
        print(f"Lightning   : {light_sensor.get_light_percentage():.1f}%")
        print(f"Program     : {selectedProgram}")
        handleProgram()
        handleFan()
        handleLight()
        handleHeater()
        handleValve()
        sleep(programs[selectedProgram]["refresh"])
        print(f"Time        : {time.time()}")
    except Exception as e:
        print(e)
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module