from machine import Pin, SoftI2C, ADC, PWM
import time
from ssd1306 import SSD1306_I2C
import dht
# Initialisation des composants
sensor = dht.DHT22(Pin(12)) # Capteur de température et d'humidité
sys = Pin(0, Pin.IN, Pin.PULL_UP) # Bouton système pour activer/désactiver le système
light_sensor = ADC(Pin(27)) # Capteur de lumière
flame_sensor = ADC(Pin(25)) # Capteur de flamme
gas_sensor = ADC(Pin(35)) # Capteur de gaz
Pir_sensor = Pin(34, Pin.IN) # Capteur PIR (mouvement)
buzzer = Pin(25, Pin.OUT) # Buzzer pour alarme
lamp1 = Pin(32, Pin.OUT) # Lampe 1
lamp2 = Pin(33, Pin.OUT) # Lampe 2
servo = PWM(Pin(15), freq=50) # Servo moteur pour ouverture/fermeture
step = Pin(17, Pin.OUT, value=0) # Moteur pas à pas
Dir = Pin(16, Pin.OUT, value=0) # Direction du moteur pas à pas
ms1 = Pin(19, Pin.OUT, value=0)
ms2 = Pin(18, Pin.OUT, value=0)
ms3 = Pin(5, Pin.OUT, value=0)
ena = Pin(4, Pin.OUT, value=0)
# Initialisation de l'écran OLED
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=400000)
width, height = 128, 64
oled = SSD1306_I2C(width, height, i2c)
oled.invert(True) # Inverser les couleurs par défaut
# Fonction pour contrôler le servo
def ouvrir_port():
servo.duty(40) # Ajuster pour ouvrir la porte
print("Port ouvert")
def fermer_port():
servo.duty(115) # Ajuster pour fermer la porte
print("Port fermé")
# Fonction pour faire tourner le moteur pas à pas
def rotate(DIR, steps, speed, mode, t):
if mode == 1: # Full step
ena.off()
ms1.off()
ms2.off()
ms3.off()
elif mode == 2: # Half step
ena.off()
ms1.on()
ms2.off()
ms3.off()
else:
ena.on()
print("Mode de pas invalide")
return
Dir.value(DIR) # Sens de rotation
for _ in range(steps):
step.on()
time.sleep_ms(speed)
step.off()
time.sleep_ms(speed)
time.sleep(t)
# Fonction pour allumer/éteindre les lampes en fonction de la luminosité
def controle_lampes():
light_value = light_sensor.read_u16()
light_percent = int(light_value * 100 / 65535)
if light_percent < 30: # Seuil de faible luminosité
lamp1.on()
lamp2.on()
print(f"Luminosité : {light_percent}% - Lampes allumées")
else:
lamp1.off()
lamp2.off()
print(f"Luminosité : {light_percent}% - Lampes éteintes")
return light_percent
# Fonction pour gérer les alarmes d'incendie et de gaz
def alarme_dangers():
flame_value = flame_sensor.read()
gas_value = gas_sensor.read()
danger_detected = False
if flame_value > 2000:
print(f"ALERTE : Flamme détectée ! Valeur : {flame_value}")
danger_detected = True
if gas_value > 1500:
print(f"ALERTE : Gaz détecté ! Valeur : {gas_value}")
danger_detected = True
if danger_detected:
buzzer.on() # Activer le buzzer
else:
buzzer.off() # Désactiver le buzzer
print("Aucun danger détecté")
# Boucle principale
while True:
if not sys.value(): # Système désactivé si bouton appuyé
print("Système désactivé")
time.sleep(1)
continue
print("Système activé")
# Lire les valeurs du capteur DHT22
try:
sensor.measure()
temperature = sensor.temperature()
humidity = sensor.humidity()
except Exception as e:
temperature, humidity = None, None
print("Erreur de lecture du capteur DHT22 :", e)
# Contrôler les lampes
light_percent = controle_lampes()
# Gérer le capteur PIR et la porte
pir_reading = Pir_sensor.value()
if pir_reading == 1:
print("Mouvement détecté")
ouvrir_port()
rotate(DIR=1, steps=200, speed=10, mode=1, t=2)
time.sleep(5)
fermer_port()
rotate(DIR=0, steps=200, speed=10, mode=1, t=2)
else:
fermer_port()
print("Aucun mouvement détecté")
# Gérer les alarmes incendie et gaz
alarme_dangers()
# Afficher les données sur l'écran OLED
oled.fill(0)
oled.text(f"Temp: {temperature}C", 0, 0)
oled.text(f"Hum: {humidity}%", 0, 10)
oled.text(f"Light: {light_percent}%", 0, 20)
oled.text("System OK", 0, 30)
oled.show()
# Pause pour éviter un rafraîchissement excessif
time.sleep(1)