from machine import Pin
import time
# --------------------
# SETUP PINS
# --------------------
led = Pin(2, Pin.OUT)
buzzer = Pin(3, Pin.OUT)
# Button uses pull-up (pressed = 0)
button = Pin(4, Pin.IN, Pin.PULL_UP)
# --------------------
# SYSTEM STATE
# --------------------
# 0 = normal, 1 = warning, 2 = urgent
state = 0
interval = 5
last_time = time.ticks_ms()
# --------------------
# OUTPUT CONTROL
# --------------------
def turn_off():
led.value(0)
buzzer.value(0)
def alert_pattern():
global state
# NORMAL MODE (slow calm pulse)
if state == 0:
led.value(1)
time.sleep(0.3)
led.value(0)
time.sleep(0.3)
# WARNING MODE (double pulse)
elif state == 1:
for i in range(2):
led.value(1)
time.sleep(0.2)
led.value(0)
time.sleep(0.2)
# URGENT MODE (fast flashing + buzzer)
elif state == 2:
for i in range(10):
led.value(1)
buzzer.value(1)
time.sleep(0.1)
led.value(0)
buzzer.value(0)
time.sleep(0.1)
# --------------------
# ADAPTIVE LOGIC
# --------------------
def update(responded):
global state, interval
# Increase urgency if no response
if not responded and state < 2:
state += 1
# Decrease urgency if user responds
elif responded and state > 0:
state -= 1
# Adjust timing based on state
if state == 0:
interval = 5
elif state == 1:
interval = 3
else:
interval = 2
# --------------------
# MAIN LOOP
# --------------------
while True:
now = time.ticks_ms()
# Run alert cycle based on interval
if time.ticks_diff(now, last_time) > interval * 1000:
alert_pattern()
last_time = now
responded = False
start = time.ticks_ms()
# 2-second response window
while time.ticks_diff(time.ticks_ms(), start) < 2000:
if button.value() == 0: # pressed
turn_off()
update(True)
responded = True
time.sleep(0.3) # debounce
break
if not responded:
update(False)
turn_off()
time.sleep(0.05)