from machine import Pin, ADC, time_pulse_us
import time
from lcd import lcd_init, lcd_print, lcd_clear
# source: https://wokwi.com/projects/462793394742436865
# -----------------------------
# Smart Safety Monitor System
# -----------------------------
# Ultrasonic Sensor
trig = Pin(12, Pin.OUT)
echo = Pin(14, Pin.IN)
# Gas Sensor
gas_sensor = ADC(Pin(34))
gas_sensor.atten(ADC.ATTN_11DB)
# -----------------------------
# Threshold Settings
# -----------------------------
SAFE_DISTANCE = 35
WARNING_DISTANCE = 20
SAFE_GAS = 1300
WARNING_GAS = 2200
# -----------------------------
# LCD Startup
# -----------------------------
lcd_init()
lcd_print("Safety System")
time.sleep(2)
# -----------------------------
# Functions
# -----------------------------
def get_distance():
"""Measure distance using ultrasonic sensor"""
trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)
duration = time_pulse_us(echo, 1, 30000)
if duration < 0:
return None
distance = (duration * 0.0343) / 2
return round(distance, 1)
def get_gas():
"""Read gas level"""
return gas_sensor.read()
def check_status(distance, gas):
"""Determine system state"""
if distance is None:
return "NO SIGNAL"
if distance < WARNING_DISTANCE or gas > WARNING_GAS:
return "DANGER"
elif distance < SAFE_DISTANCE or gas > SAFE_GAS:
return "WARNING"
else:
return "SAFE"
def show_lcd(status):
"""Display status on LCD"""
lcd_clear()
if status == "SAFE":
lcd_print("ALL SAFE")
elif status == "WARNING":
lcd_print("CHECK AREA")
elif status == "DANGER":
lcd_print("ALERT NOW!")
else:
lcd_print("NO SIGNAL")
def serial_output(status, distance, gas):
"""Print full data"""
if distance is None:
print("No Signal | Gas:", gas)
else:
print("Status:", status,
"| Distance:", distance, "cm",
"| Gas:", gas)
# -----------------------------
# Main Program
# -----------------------------
while True:
distance_value = get_distance()
gas_value = get_gas()
system_status = check_status(distance_value, gas_value)
show_lcd(system_status)
serial_output(system_status, distance_value, gas_value)
time.sleep(1)