code esteban

This commit is contained in:
2026-03-27 13:29:22 +01:00
parent 1f84b5bc09
commit f5ba39da8d
5 changed files with 293 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
import time
from thermostat import SystemeThermostat
from lumieres import SystemeLumieres
from volets import SystemeVolets
from etatsysteme import EtatSysteme
thermostat = SystemeThermostat()
lumieres = SystemeLumieres()
volets = SystemeVolets()
etat = EtatSysteme()
try:
while True:
erreurThermostat = thermostat.mettreAJour()
erreurLumieres = lumieres.mettreAJour()
erreurVolets = volets.mettreAJour()
if erreurThermostat or erreurLumieres or erreurVolets:
etat.signalerProbleme()
else:
etat.signalerOk()
time.sleep(0.2)
except KeyboardInterrupt:
print("\nArrêt du programme.")
finally:
thermostat.cleanup()
lumieres.cleanup()
volets.cleanup()
etat.cleanup()

View File

@@ -0,0 +1,25 @@
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
class EtatSysteme:
def __init__(self):
self.pinLedRouge = 35
self.pinLedVerte = 37
GPIO.setup(self.pinLedRouge, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(self.pinLedVerte, GPIO.OUT, initial=GPIO.LOW)
def signalerOk(self):
GPIO.output(self.pinLedVerte, GPIO.HIGH)
GPIO.output(self.pinLedRouge, GPIO.LOW)
def signalerProbleme(self):
GPIO.output(self.pinLedVerte, GPIO.LOW)
GPIO.output(self.pinLedRouge, GPIO.HIGH)
def cleanup(self):
GPIO.output(self.pinLedRouge, GPIO.LOW)
GPIO.output(self.pinLedVerte, GPIO.LOW)

View File

@@ -0,0 +1,87 @@
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
class SystemeLumieres:
def __init__(self):
# la pin de la 2e photorésistance manque sur le schéma
# donc ici on met une valeur temporaire
# elle apparaîtra peut-être un jour, comme la motivation en fin de projet
self.pinPhotoInterieure = 29
self.led1 = 21
self.led2 = 31
self.led3 = 33
self.boutonManuel = 36
self.modeManuel = False
self.lumieresAllumees = False
GPIO.setup(self.pinPhotoInterieure, GPIO.IN)
GPIO.setup(self.led1, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(self.led2, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(self.led3, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(self.boutonManuel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
self.derniereLectureBouton = 0
self.delaiLectureBouton = 0.25
def lireLuminositeInterieure(self):
return GPIO.input(self.pinPhotoInterieure)
def allumerLumieres(self):
GPIO.output(self.led1, GPIO.HIGH)
GPIO.output(self.led2, GPIO.HIGH)
GPIO.output(self.led3, GPIO.HIGH)
self.lumieresAllumees = True
def eteindreLumieres(self):
GPIO.output(self.led1, GPIO.LOW)
GPIO.output(self.led2, GPIO.LOW)
GPIO.output(self.led3, GPIO.LOW)
self.lumieresAllumees = False
def gererBoutonManuel(self):
maintenant = time.time()
if maintenant - self.derniereLectureBouton < self.delaiLectureBouton:
return
if GPIO.input(self.boutonManuel):
self.modeManuel = not self.modeManuel
self.derniereLectureBouton = maintenant
if self.modeManuel:
self.lumieresAllumees = not self.lumieresAllumees
if self.lumieresAllumees:
self.allumerLumieres()
else:
self.eteindreLumieres()
else:
print("Lumières : retour en auto")
def mettreAJour(self):
self.gererBoutonManuel()
if self.modeManuel:
return False
luminosite = self.lireLuminositeInterieure()
if luminosite == 0:
self.allumerLumieres()
print("Lumières : on allume")
else:
self.eteindreLumieres()
print("Lumières : on coupe")
return False
def cleanup(self):
self.eteindreLumieres()

View File

@@ -0,0 +1,76 @@
import time
import RPi.GPIO as GPIO
import Adafruit_DHT
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
class SystemeThermostat:
def __init__(self):
self.capteur = Adafruit_DHT.DHT11
self.pinDht = 22
self.boutonPlus = 16
self.boutonMoins = 18
# display 4 digits
# à brancher proprement quand le module exact sera fixé
self.pinDisplayClk = 7
self.pinDisplayDio = 11
self.temperatureCible = 18
self.temperatureReelle = None
self.derniereLectureBouton = 0
self.delaiLectureBouton = 0.25
GPIO.setup(self.boutonPlus, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(self.boutonMoins, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
def lireTemperature(self):
humidite, temperature = Adafruit_DHT.read_retry(self.capteur, self.pinDht)
if temperature is None:
print("Thermostat : lecture DHT11 impossible")
return None
return temperature
def lireBoutons(self):
maintenant = time.time()
if maintenant - self.derniereLectureBouton < self.delaiLectureBouton:
return
if GPIO.input(self.boutonPlus):
self.temperatureCible += 1
self.derniereLectureBouton = maintenant
print("Consigne :", self.temperatureCible, "°C")
elif GPIO.input(self.boutonMoins):
self.temperatureCible -= 1
self.derniereLectureBouton = maintenant
print("Consigne :", self.temperatureCible, "°C")
def afficherTemperatures(self):
# pour l'instant on affiche dans la console
# le vrai code du display ira ici
if self.temperatureReelle is None:
print("Temp réelle : -- | cible :", self.temperatureCible)
else:
print("Temp réelle :", str(self.temperatureReelle) + "°C", "| cible :", str(self.temperatureCible) + "°C")
def mettreAJour(self):
self.lireBoutons()
self.temperatureReelle = self.lireTemperature()
self.afficherTemperatures()
if self.temperatureReelle is None:
return True
return False
def cleanup(self):
# rien à éteindre ici, incroyable mais vrai
pass

View File

@@ -0,0 +1,73 @@
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
class SystemeVolets:
def __init__(self):
self.pinPhotoExterieure = 32
self.pinServo = 12
self.boutonManuel = 13
self.modeManuel = False
self.voletsOuverts = True
GPIO.setup(self.pinPhotoExterieure, GPIO.IN)
GPIO.setup(self.pinServo, GPIO.OUT)
GPIO.setup(self.boutonManuel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
self.pwm = GPIO.PWM(self.pinServo, 50)
self.pwm.start(0)
self.derniereLectureBouton = 0
self.delaiLectureBouton = 0.25
def ouvrirVolets(self):
self.pwm.ChangeDutyCycle(7)
self.voletsOuverts = True
print("Volets : ouverts")
def fermerVolets(self):
self.pwm.ChangeDutyCycle(2)
self.voletsOuverts = False
print("Volets : fermés")
def gererBoutonManuel(self):
maintenant = time.time()
if maintenant - self.derniereLectureBouton < self.delaiLectureBouton:
return
if GPIO.input(self.boutonManuel):
self.derniereLectureBouton = maintenant
if self.voletsOuverts:
self.fermerVolets()
else:
self.ouvrirVolets()
self.modeManuel = True
print("Volets : mode manuel")
def lireLuminositeExterieure(self):
return GPIO.input(self.pinPhotoExterieure)
def mettreAJour(self):
self.gererBoutonManuel()
if self.modeManuel:
return False
luminosite = self.lireLuminositeExterieure()
if luminosite == 1:
self.fermerVolets()
else:
self.ouvrirVolets()
return False
def cleanup(self):
self.pwm.stop()