from machine import Pin, I2C
import dht
from time import ticks_ms, ticks_diff, sleep
from servo import Servo
from i2c_lcd import I2cLcd
import network
import ufirebase as firebase

# --- Connexion Wi-Fi ---
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect("Wokwi-GUEST", "")
while not wifi.isconnected():
    print("Connexion Wi-Fi...")
    sleep(1)
print("Connecté au Wi-Fi")

# --- Firebase ---
firebase.setURL("https://ceiture-chauffante-default-rtdb.firebaseio.com/")

# --- Initialisation composants ---
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
lcd = I2cLcd(i2c, i2c.scan()[0], 2, 16)
sensor = dht.DHT22(Pin(18))   # Capteur 1
sensor2 = dht.DHT22(Pin(19))  # Capteur 2
peltier_led = Pin(4, Pin.OUT)
ventilateur_led = Pin(5, Pin.OUT)
radiateur_led = Pin(17, Pin.OUT)
motor = Servo(pin=16)
btn = Pin(34, Pin.IN, Pin.PULL_DOWN)

# --- États ---
etat_systeme = False
etat_pause = False
cycle_etape = 0  # 0: Refroidir1, 1: Chauffer, 2: Refroidissement2
temps_ecoule = 0
dernier_etat_bouton = 0
dernier_temps_bouton = 0
delai_debouncing = 200  # ms

# --- Constantes ---
DUREES_PHASES = [10000, 20000, 10000]  # Durée en ms pour chaque phase
T_MIN = [-1, 39, -1]
T_MAX = [1, 41, 1]
TITRES = ["Refroidissement", "Chauffage", "Refroidissement final"]

# --- Fonctions ---
def attendre(duree_ms, deja_passe=0):
    debut = ticks_ms()
    while ticks_diff(ticks_ms(), debut) + deja_passe < duree_ms:
        if btn.value() == 1:
            return False, ticks_diff(ticks_ms(), debut) + deja_passe
        restant = (duree_ms - (ticks_diff(ticks_ms(), debut) + deja_passe)) // 1000
        lcd.move_to(0, 1)
        lcd.putstr("Temps: {}s     ".format(restant))
        sleep(0.5)
    return True, 0

def lire_bouton():
    global dernier_temps_bouton
    if btn.value() == 1:
        temps_actuel = ticks_ms()
        if temps_actuel - dernier_temps_bouton > delai_debouncing:
            dernier_temps_bouton = temps_actuel
            return True
    return False

# --- Boucle principale ---
while True:
    etat_bouton = btn.value()

    # --- Gestion bouton ON/OFF et Pause ---
    if lire_bouton() and dernier_etat_bouton == 0:
        if etat_systeme:
            etat_pause = not etat_pause
            lcd.clear()
            lcd.putstr("Pause..." if etat_pause else "Reprise...")
            sleep(1)
        else:
            etat_systeme = True
            etat_pause = False
            cycle_etape = 0
            temps_ecoule = 0
            lcd.clear()
            lcd.putstr("Systeme Active")
            sleep(1)

    dernier_etat_bouton = etat_bouton

    if etat_systeme and not etat_pause:
        try:
            sensor.measure()
            sensor2.measure()
            temp = sensor.temperature()
            hum = sensor.humidity()
            temp2 = sensor2.temperature()
            hum2 = sensor2.humidity()

            firebase.put("Temperature", temp, bg=0)
            firebase.put("Temperature2", temp2, bg=0)

            # Sécurité température extrême
            if temp < -5 or temp > 45:
                lcd.clear()
                lcd.putstr("Erreur: Hors plage")
                peltier_led.off()
                ventilateur_led.off()
                radiateur_led.off()
                motor.move(0)
                etat_systeme = False
                sleep(2)
                lcd.clear()
                lcd.putstr("Systeme Off")
                continue

            # Affichage
            lcd.move_to(0, 0)
            lcd.putstr(TITRES[cycle_etape])
            lcd.move_to(0, 1)
            lcd.putstr("T1:{:.0f} T2:{:.0f}".format(temp, temp2))

            # Ventilation normale
            ventilateur_led.value(True)
            radiateur_led.value(True)

            # Vérification température selon étape
            if not (T_MIN[cycle_etape] <= temp <= T_MAX[cycle_etape]):
                lcd.clear()
                lcd.putstr("Erreur Temp")
                peltier_led.off()
                motor.move(0)
                etat_systeme = False
                sleep(2)
                continue

            # Activation
            peltier_led.on()
            motor.move(180)

            # Attente avec gestion pause
            termine, temps_ecoule = attendre(DUREES_PHASES[cycle_etape], temps_ecoule)
            if not termine:
                etat_pause = True
                continue

            # Étape suivante
            cycle_etape = (cycle_etape + 1) % 3
            temps_ecoule = 0

            # Transitions
            if cycle_etape == 1:
                lcd.clear()
                lcd.putstr("Transition vers \nchauffage...")
                sleep(10)
            elif cycle_etape == 2:
                lcd.clear()
                lcd.putstr("Transition vers \nrefroidir...")
                sleep(10)

            if cycle_etape == 0:
                lcd.clear()
                lcd.putstr("Cycle Terminé")
                peltier_led.off()
                ventilateur_led.off()
                radiateur_led.off()
                motor.move(0)
                etat_systeme = False
                sleep(2)
                lcd.clear()
                lcd.putstr("Systeme Off")

        except OSError:
            lcd.clear()
            lcd.putstr("Erreur capteur")
            peltier_led.off()
            motor.move(0)
            etat_systeme = False
            sleep(2)
            lcd.clear()
            lcd.putstr("Systeme Off")

    elif etat_pause:
        lcd.move_to(0, 1)
        lcd.putstr("Pause...        ")
        peltier_led.off()
        motor.move(0)
        try:
            sensor2.measure()
            temp2 = sensor2.temperature()
            ventilateur_led.value(temp2 > 15)
            radiateur_led.value(temp2 > 15)
        except OSError:
            ventilateur_led.off()
            radiateur_led.off()
        sleep(0.5)

    elif not etat_systeme:
        peltier_led.off()
        ventilateur_led.off()
        radiateur_led.off()
        motor.move(0)

    sleep(0.1)
$abcdeabcde151015202530fghijfghij