From f5ba39da8d19b06dfb3b6c61a3688e8c30ac98d6 Mon Sep 17 00:00:00 2001 From: maxime Date: Fri, 27 Mar 2026 13:29:22 +0100 Subject: [PATCH] code esteban --- composants/byPanda/board2main.py | 32 ++++++++++++ composants/byPanda/etatsysteme.py | 25 +++++++++ composants/byPanda/lumieres.py | 87 +++++++++++++++++++++++++++++++ composants/byPanda/thermostat.py | 76 +++++++++++++++++++++++++++ composants/byPanda/volets.py | 73 ++++++++++++++++++++++++++ 5 files changed, 293 insertions(+) create mode 100644 composants/byPanda/board2main.py create mode 100644 composants/byPanda/etatsysteme.py create mode 100644 composants/byPanda/lumieres.py create mode 100644 composants/byPanda/thermostat.py create mode 100644 composants/byPanda/volets.py diff --git a/composants/byPanda/board2main.py b/composants/byPanda/board2main.py new file mode 100644 index 0000000..51469b1 --- /dev/null +++ b/composants/byPanda/board2main.py @@ -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() diff --git a/composants/byPanda/etatsysteme.py b/composants/byPanda/etatsysteme.py new file mode 100644 index 0000000..28c7804 --- /dev/null +++ b/composants/byPanda/etatsysteme.py @@ -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) diff --git a/composants/byPanda/lumieres.py b/composants/byPanda/lumieres.py new file mode 100644 index 0000000..1401243 --- /dev/null +++ b/composants/byPanda/lumieres.py @@ -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() diff --git a/composants/byPanda/thermostat.py b/composants/byPanda/thermostat.py new file mode 100644 index 0000000..475ea6d --- /dev/null +++ b/composants/byPanda/thermostat.py @@ -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 diff --git a/composants/byPanda/volets.py b/composants/byPanda/volets.py new file mode 100644 index 0000000..7c6b5e8 --- /dev/null +++ b/composants/byPanda/volets.py @@ -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()