from machine import Pin, SoftI2C, ADC, PWM
import time
from ssd1306 import SSD1306_I2C
import dht
# Initialisation des composants
sensor = dht.DHT22(Pin(12))
sys = Pin(0, Pin.IN, Pin.PULL_UP) # Bouton système pour activer/désactiver le système
light_sensor = ADC(27)
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=400000)
width, height = 128, 64 # Dimensions de l'écran OLED
Pir_sensor = Pin(34, Pin.IN) # Capteur PIR
step = Pin(17, Pin.OUT, value=0)
Dir = Pin(16, Pin.OUT, value=0) # Sens de rotation
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)
# Servo pour ouvrir/fermer le port
servo = PWM(Pin(15), freq=50) # Utilisez un pin PWM pour contrôler le servo
# Lampes (relais ou transistors) pour contrôler deux lampes
lamp1 = Pin(32, Pin.OUT) # Lamp 1
lamp2 = Pin(33, Pin.OUT) # Lamp 2
# Capteur de flamme (analogique)
flame_sensor = ADC(Pin(34)) # Capteur de flamme sur une entrée analogique
# Buzzer pour l'alarme
buzzer = Pin(25, Pin.OUT) # Buzzer sur la broche 25
oled = SSD1306_I2C(width, height, i2c)
oled.invert(True) # Inversion initiale de l'écran (peut être ajustée en fonction de la lumière)
# Fonction pour contrôler le servo (ouverture/fermeture du port)
def ouvrir_port():
servo.duty(40) # Angle ouvert, ajustez la valeur pour votre servo
print("Port ouvert")
def fermer_port():
servo.duty(115) # Angle fermé, ajustez la valeur pour votre servo
print("Port fermé")
# Fonction pour faire tourner le moteur
def rotate(DIR, steps, speed, mode, t):
# Configurer les modes de pas
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()
elif mode == 3: # Step / 4
ena.off()
ms1.off()
ms2.on()
ms3.off()
elif mode == 4: # Step / 8
ena.off()
ms1.on()
ms2.on()
ms3.off()
elif mode == 5: # Step / 16
ena.off()
ms1.on()
ms2.on()
ms3.on()
else:
ena.on() # Mode invalide
print('Mode invalide')
return
Dir.value(DIR) # Sens de rotation (1 ou 0)
# Boucle pour effectuer les étapes
for i in range(steps):
step.on()
time.sleep_ms(speed) # La vitesse est inversée: plus la valeur est faible, plus le moteur est rapide
step.off()
time.sleep_ms(speed)
time.sleep(t) # Temps de pause après la rotation
# Fonction pour allumer les lampes si la luminosité est faible
def controle_lampes():
light_value = 65535 - light_sensor.read_u16() # Lecture du capteur de lumière (inversée)
light_percent = int(light_value * (100 / 65535))
if light_percent < 30: # Si la luminosité est faible (moins de 30%)
lamp1.on()
lamp2.on()
else:
lamp1.off()
lamp2.off()
return light_percent
# Fonction pour gérer l'alarme incendie
def alarme_incendie():
flame_value = flame_sensor.read() # Lecture de la valeur du capteur de flamme
if flame_value > 2000: # Valeur seuil, ajustez selon votre capteur de flamme
buzzer.on() # Activer le buzzer
print("ALERTE INCENDIE !")
else:
buzzer.off() # Désactiver le buzzer
# Boucle principale
while True:
# Lire l'état du bouton sys (pour activer ou désactiver le système)
reading = sys.value() # Si sys est 0, alors le système est éteint
if reading == 0: # Si le système est éteint (bouton appuyé)
print('Système éteint')
time.sleep(1) # Petite pause pour éviter une boucle infinie
continue # Passer à la prochaine itération de la boucle
else: # Si le système est allumé (bouton non appuyé)
print('Système allumé')
# Mesures du capteur DHT22
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
# Mesure de la lumière
light_percent = controle_lampes() # Contrôler les lampes en fonction de la luminosité
# Affichage des données sur l'écran OLED
oled.fill(0) # Effacer l'écran avant d'afficher de nouvelles informations
oled.text(f'Temp: {t} C', 10, 10)
oled.text(f'Hum: {h} %', 10, 20)
oled.text(f'Light: {light_percent} %', 10, 30)
oled.show() # Afficher les nouvelles informations
# Inverser l'affichage en fonction de la lumière
if light_percent > 30:
oled.invert(False)
else:
oled.invert(True)
time.sleep_ms(10) # Attente pour limiter la vitesse d'affichage
# Gestion du capteur PIR (ouverture/fermeture du port)
pir_reading = Pir_sensor.value() # Lire l'état du capteur PIR
if pir_reading == 1: # Si mouvement détecté
print("Mouvement détecté : Ouverture de la porte")
rotate(DIR=1, steps=200, speed=10, mode=1, t=2) # Faire tourner le moteur pour ouvrir la porte (200 pas dans un sens)
ouvrir_port() # Ouvrir le port avec le servo
time.sleep(5) # Maintenir la porte ouverte pendant 5 secondes
fermer_port() # Fermer le port avec le servo
rotate(DIR=0, steps=200, speed=10, mode=1, t=2) # Faire tourner le moteur dans l'autre sens pour fermer la porte (200 pas)
print("Porte fermée")
else: # Si pas de mouvement
fermer_port() # Fermer le port si aucun mouvement n'est détecté
print("Aucun mouvement détecté : Porte fermée")
# Vérifier s'il y a un incendie
alarme_incendie()