import machine
import time
from machine import Pin, ADC
# ==========================================
# 1. HARDWARE CONFIGURATION & INITIALIZATION
# ==========================================
# --- Analog Inputs (ADC Pins) ---
# Pico ADC pins are GPIO 26, 27, 28.
pin_ldr = ADC(Pin(26)) # ADC0: LDR to simulate incoming glare
pin_blink_pot = ADC(Pin(27)) # ADC1: Potentiometer to simulate blink frequency
# --- Digital Input ---
# Pull-up resistor keeps the pin HIGH until pressed down to GND
pin_high_beam_btn = Pin(14, Pin.IN, Pin.PULL_UP)
# --- Digital Outputs (LEDs) ---
pin_led_glare = Pin(12, Pin.OUT) # LED 1: Excessive glare warning
pin_led_drowsy = Pin(13, Pin.OUT) # LED 2: Critical glare + drowsiness alert
# ==========================================
# 2. CALIBRATION THRESHOLDS
# ==========================================
# Pico ADCs read 16-bit values ranging from 0 to 65535
# (Unlike Arduino's 10-bit 0 to 1023 range)
EXCESSIVE_GLARE_THRES = 48000 # High value = bright light hitting the LDR
SLOW_BLINK_THRES = 20000 # Low value = slow blink rate (fatigue)
# State tracking variables
manual_high_beam_state = False
last_button_state = 1 # 1 is HIGH (unpressed) due to PULL_UP
print("Pico Safety Monitor Online...")
# ==========================================
# 3. MAIN SYSTEM LOOP
# ==========================================
while True:
# 1. Read Inputs
glare_value = pin_ldr.read_u16()
blink_value = pin_blink_pot.read_u16()
current_button_state = pin_high_beam_btn.value()
# 2. Button Logic: Toggle high-beams manually on a press (falling edge)
if current_button_state == 0 and last_button_state == 1:
manual_high_beam_state = not manual_high_beam_state
print("Manual High-Beam Toggled:", "ON" if manual_high_beam_state else "OFF")
time.sleep_ms(200) # Simple debounce delay
last_button_state = current_button_state
# 3. Safety Monitoring Logic
is_glare_excessive = glare_value >= EXCESSIVE_GLARE_THRES
is_blink_rate_slow = blink_value <= SLOW_BLINK_THRES
# LED 1 Output: Triggers if glare is excessive [cite: 14]
if is_glare_excessive:
pin_led_glare.value(1) # Turn ON
else:
pin_led_glare.value(0) # Turn OFF
# LED 2 Output: Triggers if glare is high AND blink rate is dangerously slow [cite: 15]
if is_glare_excessive and is_blink_rate_slow:
pin_led_drowsy.value(1) # Turn ON
else:
pin_led_drowsy.value(0) # Turn OFF
# Debugging output to Shell console
print(f"Glare ADC: {glare_value} | Blink ADC: {blink_value}")
time.sleep_ms(100) # Small stability loop delay