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)