from machine import Pin, PWM
import time
print("===================================")
print(" SYSTEME D'ALARME PORTE/FENETRE ")
print(" Simulation Wokwi - Raspberry Pi Pico ")
print("===================================")
# =========================
# Configuration materielle
# =========================
led = Pin(5, Pin.OUT)
button = Pin(20, Pin.IN, Pin.PULL_DOWN) # bouton armement/desarmement
door = Pin(16, Pin.IN, Pin.PULL_DOWN) # bouton ouverture porte/fenetre
buzzer = PWM(Pin(10))
buzzer.duty_u16(0)
# =========================
# Etats du systeme
# =========================
DISARMED = 0
EXIT_DELAY = 1
ARMED = 2
ENTRY_DELAY = 3
ALARM = 4
state = DISARMED
exit_delay_duration = 3 # secondes avant armement effectif
entry_delay_duration = 3 # secondes avant declenchement alarme
exit_start = 0
entry_start = 0
last_blink = 0
led_state = 0
# anti-rebond logiciel
last_button_time = 0
last_door_time = 0
debounce_ms = 200
# =========================
# Fonctions
# =========================
def state_name():
if state == DISARMED:
return "DESARME"
elif state == EXIT_DELAY:
return "TEMP_SORTIE"
elif state == ARMED:
return "ARME"
elif state == ENTRY_DELAY:
return "TEMP_ENTREE"
elif state == ALARM:
return "ALARME"
return "INCONNU"
def log_event(message):
print("[EVENT]", message, "| Etat :", state_name())
def short_beep():
buzzer.freq(1500)
buzzer.duty_u16(20000)
time.sleep(0.1)
buzzer.duty_u16(0)
def double_beep():
short_beep()
time.sleep(0.1)
short_beep()
def alarm_sound_on():
buzzer.freq(1000)
buzzer.duty_u16(30000)
def alarm_sound_off():
buzzer.duty_u16(0)
def button_pressed():
global last_button_time
now = time.ticks_ms()
if button.value() == 1 and time.ticks_diff(now, last_button_time) > debounce_ms:
last_button_time = now
while button.value() == 1:
time.sleep_ms(10)
return True
return False
def door_opened():
global last_door_time
now = time.ticks_ms()
if door.value() == 1 and time.ticks_diff(now, last_door_time) > debounce_ms:
last_door_time = now
return True
return False
# =========================
# Initialisation
# =========================
led.value(0)
alarm_sound_off()
log_event("Systeme demarre")
# =========================
# Boucle principale
# =========================
while True:
now_ms = time.ticks_ms()
# -------- bouton vert : action globale --------
if button_pressed():
# Si systeme desarme -> lancer temporisation de sortie
if state == DISARMED:
state = EXIT_DELAY
exit_start = now_ms
log_event("Armement demande")
short_beep()
print("[INFO] Temporisation de sortie : 3 secondes")
# Si systeme arme ou temporisation entree/sortie ou alarme -> desarmer
else:
state = DISARMED
led.value(0)
alarm_sound_off()
log_event("Systeme DESARME")
double_beep()
# -------- mode DESARME --------
if state == DISARMED:
led.value(0)
alarm_sound_off()
# -------- temporisation de sortie --------
elif state == EXIT_DELAY:
alarm_sound_off()
# LED clignote lentement pendant temporisation de sortie
if time.ticks_diff(now_ms, last_blink) >= 300:
last_blink = now_ms
led_state = 0 if led.value() else 1
led.value(led_state)
if time.ticks_diff(now_ms, exit_start) >= exit_delay_duration * 1000:
state = ARMED
led.value(1)
log_event("Systeme ARME")
# -------- mode ARME --------
elif state == ARMED:
led.value(1)
alarm_sound_off()
if door_opened():
log_event("Ouverture detectee")
state = ENTRY_DELAY
entry_start = now_ms
print("[INFO] Temporisation d'entree : 3 secondes")
# -------- temporisation d'entree --------
elif state == ENTRY_DELAY:
alarm_sound_off()
# LED clignote plus vite pour avertir
if time.ticks_diff(now_ms, last_blink) >= 150:
last_blink = now_ms
led_state = 0 if led.value() else 1
led.value(led_state)
# Si la temporisation est finie, declencher l'alarme
if time.ticks_diff(now_ms, entry_start) >= entry_delay_duration * 1000:
state = ALARM
led.value(1)
log_event("ALARME DECLENCHEE")
# -------- mode ALARME --------
elif state == ALARM:
alarm_sound_on()
# LED clignotante en alarme
if time.ticks_diff(now_ms, last_blink) >= 200:
last_blink = now_ms
led_state = 0 if led.value() else 1
led.value(led_state)
time.sleep_ms(20)