from machine import Pin, PWM, ADC, I2C
from time import sleep
from i2c_lcd import I2cLcd
# Hardware setup
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
gas_sensor = ADC(Pin(26))
led_red = Pin(2, Pin.OUT)
button = Pin(20, Pin.IN, Pin.PULL_UP)
buzzer = PWM(Pin(3))
# Servo configuration
servo = PWM(Pin(16))
servo.freq(50)
def set_servo_angle(angle):
duty = int(1638 + (angle / 180) * (8192 - 1638))
servo.duty_u16(duty)
def sound_alarm(enable):
if enable:
buzzer.freq(1000)
buzzer.duty_u16(32768)
else:
buzzer.duty_u16(0)
# Initial states
set_servo_angle(0)
sound_alarm(False)
GAS_THRESHOLD = 40000
# Startup screen
lcd.clear()
lcd.putstr("System Ready\nStatus: Normal")
sleep(2)
while True:
gas_value = gas_sensor.read_u16()
# Gas alarm state
if gas_value > GAS_THRESHOLD:
led_red.value(1)
sound_alarm(True)
lcd.clear()
lcd.putstr("WARNING: GAS!")
lcd.move_to(0, 1)
lcd.putstr("Press BTN to Open")
# Open door on button press
if button.value() == 0:
lcd.clear()
lcd.putstr("Door Opening...")
set_servo_angle(90)
sound_alarm(False)
sleep(5)
lcd.clear()
lcd.putstr("Door Closing...")
set_servo_angle(0)
sleep(1)
# Normal state
else:
led_red.value(0)
sound_alarm(False)
set_servo_angle(0)
lcd.clear()
lcd.putstr("Air: Safe")
lcd.move_to(0, 1)
lcd.putstr(f"Gas Level: {gas_value}")
sleep(0.5)