from machine import Pin, ADC, SoftI2C, PWM
import time
import dht
from hcsr04 import HCSR04
from lcd_i2c import I2cLcd
# Inisialisasi sensor dan aktuator
sensor_pir = Pin(13, Pin.IN)
sensor_ultrasonic = HCSR04(trigger_pin=12, echo_pin=13)
sensor_dht = dht.DHT22(Pin(4))
gas_sensor_aout = ADC(Pin(34))
gas_sensor_aout.atten(ADC.ATTN_11DB)
gas_sensor_dout = Pin(14, Pin.IN)
ldr_sensor = ADC(Pin(35))
ldr_sensor.atten(ADC.ATTN_11DB)
buzzer_pwm = PWM(Pin(25), freq=1000, duty=0)
# LCD I2C
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
# Nada buzzer
NOTES = {
"REST": 0,
"C5": 523,
"D5": 587,
"E5": 659
}
melody = [NOTES["C5"], NOTES["D5"], NOTES["E5"]]
durations = [4, 4, 4]
def buzzer_on(freq=1000):
buzzer_pwm.freq(freq)
buzzer_pwm.duty(512)
def buzzer_off():
buzzer_pwm.duty(0)
def play_warning_melody():
for i in range(len(melody)):
if melody[i] > 0:
buzzer_pwm.freq(melody[i])
buzzer_pwm.duty(512)
else:
buzzer_pwm.duty(0)
time.sleep_ms(250)
buzzer_off()
while True:
try:
lcd.clear()
# Baca sensor
sensor_dht.measure()
suhu = sensor_dht.temperature()
hum = sensor_dht.humidity()
jarak = sensor_ultrasonic.distance_cm()
gas_digital = gas_sensor_dout.value()
ldr = ldr_sensor.read()
gerakan = sensor_pir.value()
# 1. Cek suhu dan kelembaban
if suhu > 35 or hum < 30:
lcd.putstr("Suhu >35C /")
lcd.move_to(0,1)
lcd.putstr("Hum <30%!")
# 2. Gas terdeteksi
if gas_digital == 1:
lcd.clear()
lcd.putstr("Gas Terdeteksi!")
buzzer_on()
time.sleep(1)
buzzer_off()
# 3. Gerakan + cahaya < 500
if gerakan and ldr < 500:
lcd.clear()
lcd.putstr("Gerakan + Gelap!")
play_warning_melody()
# 4. Jarak < 10 cm (misal lemari terbuka)
if jarak < 10:
lcd.clear()
lcd.putstr("Ada Yang Mendekat!")
time.sleep(2)
# Tampilkan status singkat
lcd.clear()
lcd.putstr("T:" + str(int(suhu)) + "C H:" + str(int(hum)) + "%")
lcd.move_to(0, 1)
lcd.putstr("LDR:" + str(ldr))
time.sleep(3)
except Exception as e:
print("Error:", e)
buzzer_off()
lcd.clear()
lcd.putstr("Error!")
time.sleep(2)