from machine import Pin, ADC, PWM, I2C
import time
import dht
from i2c_lcd import I2cLcd
# Inisialisasi LCD I2C
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
lcd = I2cLcd(i2c, 0x27, 2, 16)
# Inisialisasi Sensor & Aktuator
pir = Pin(2, Pin.IN)
mq2 = ADC(Pin(34))
mq2.atten(ADC.ATTN_11DB)
trig = Pin(5, Pin.OUT)
echo = Pin(18, Pin.IN)
dht_sensor = dht.DHT22(Pin(4))
buzzer = PWM(Pin(15))
buzzer.freq(1000)
servo = PWM(Pin(13), freq=50)
ldr = ADC(Pin(35))
ldr.atten(ADC.ATTN_11DB)
led = Pin(25, Pin.OUT) # Sesuai pin LED di diagram
# LCD page control
page = 0
last_switch_time = time.ticks_ms()
last_buzzer_time = 0
buzzer_active = False
# Fungsi membaca jarak
def get_distance():
trig.off()
time.sleep_us(2)
trig.on()
time.sleep_us(10)
trig.off()
while echo.value() == 0:
pass
start = time.ticks_us()
while echo.value() == 1:
pass
end = time.ticks_us()
return (end - start) * 0.0343 / 2
# Fungsi menampilkan data di LCD
def display_lcd(page, motion, gas, distance, temperature, humidity):
lcd.clear()
if motion:
lcd.putstr("Gerakan Terdeteksi!")
lcd.move_to(0, 1)
lcd.putstr("Pintu dibuka!")
elif distance < 50:
lcd.putstr("Orang terdeteksi!")
lcd.move_to(0, 1)
lcd.putstr("Pintu dibuka!")
elif gas > 2500:
lcd.putstr("Gas berbahaya!")
lcd.move_to(0, 1)
lcd.putstr("Waspada!")
else:
if page == 0:
lcd.putstr("Gas Level:")
lcd.move_to(0, 1)
lcd.putstr(str(gas))
elif page == 1:
lcd.putstr("Jarak:")
lcd.move_to(0, 1)
lcd.putstr(str(int(distance)) + " cm")
elif page == 2:
lcd.putstr("Suhu:")
lcd.move_to(0, 1)
lcd.putstr(str(temperature) + " C")
elif page == 3:
lcd.putstr("Kelembaban:")
lcd.move_to(0, 1)
lcd.putstr(str(humidity) + " %")
# Fungsi aktifkan buzzer
def play_buzzer():
global buzzer_active, last_buzzer_time
buzzer.duty_u16(30000)
buzzer_active = True
last_buzzer_time = time.ticks_ms()
# Fungsi mengatur servo
def set_servo(open_pintu):
servo.duty(40 if open_pintu else 90)
# Loop utama
while True:
motion = pir.value()
gas_value = mq2.read()
distance = get_distance()
# Membaca suhu & kelembaban
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
except:
temp, hum = 0, 0
# Baca cahaya dari LDR
ldr_value = ldr.read()
print("Cahaya:", ldr_value)
if ldr_value > 1500:
led.on()
else:
led.off()
# Prioritaskan PIR
if motion:
print("Gerakan terdeteksi!")
play_buzzer()
set_servo(True)
elif distance < 50:
print("Terdeteksi Objek mendekat!")
set_servo(True)
else:
set_servo(False)
# Deteksi gas
print("Gas Level:", gas_value)
if gas_value > 2500:
print("Gas berbahaya!")
play_buzzer()
# Matikan buzzer setelah 0.5 detik
if buzzer_active and time.ticks_ms() - last_buzzer_time > 500:
buzzer.duty_u16(0)
buzzer_active = False
# Update tampilan LCD tiap 2 detik
if time.ticks_ms() - last_switch_time > 2000:
page = (page + 1) % 4
last_switch_time = time.ticks_ms()
# Tampilkan informasi
display_lcd(page, motion, gas_value, distance, temp, hum)
time.sleep(1)