from machine import Pin, PWM, SoftI2C, ADC
import dht
import ssd1306
import time
from hcsr04 import HCSR04
from servo import Servo
# Inisialisasi Sensor dan Aktuator
sensor_pir = Pin(13, Pin.IN)
sensor_ultrasonic = HCSR04(trigger_pin=12, echo_pin=14)
sensor_gas_analog = ADC(Pin(34)) # AOUT MQ-2
sensor_gas_analog.atten(ADC.ATTN_11DB)
sensor_dht = dht.DHT22(Pin(4))
# Inisialisasi OLED Display
i2c = SoftI2C(scl=Pin(22), sda=Pin(21))
display = ssd1306.SSD1306_I2C(128, 64, i2c)
# Inisialisasi Buzzer
buzzer = PWM(Pin(5))
buzzer.freq(1000)
# Inisialisasi Servo (Pintu Otomatis)
servo = Servo(2)
pintu_terkunci = False # Status pintu tertutup
# Threshold (Ambang Batas)
THRESHOLD_DISTANCE = 50 # cm (Ultrasonik, orang mendekat)
THRESHOLD_GAS_PERCENT = 85.4 # % (Gas berbahaya)
THRESHOLD_TEMP_MIN = 0 # °C
THRESHOLD_TEMP_MAX = 45 # °C
THRESHOLD_HUM_MIN = 20 # %
THRESHOLD_HUM_MAX = 90 # %
# Fungsi Konversi ADC ke Persentase Gas (Eksponensial)
def convert_adc_to_percent(adc_value):
percent = (adc_value / 4095) ** 0.5 * 100 # Eksponensial
return round(percent, 2)
# Fungsi Menampilkan Informasi di OLED
def update_oled(temp, hum, dist, gas_percent, warnings):
display.fill(0)
if warnings:
display.fill(1) # Layar hitam untuk mode peringatan
display.text("!!! WARNING !!!", 20, 0, 0)
y_offset = 20
for warning in warnings:
display.text(warning, 10, y_offset, 0)
y_offset += 10
else:
display.text("Sistem Keamanan", 10, 0)
display.text(f"Temp: {temp:.1f}C", 10, 10)
display.text(f"Hum: {hum:.1f}%", 10, 20)
display.text(f"Dist: {dist:.1f}cm", 10, 30)
display.text(f"Gas: {gas_percent:.1f}%", 10, 40)
display.show()
# Fungsi Alarm Buzzer
def security_alert():
buzzer.duty(512) # Nyalakan buzzer
time.sleep(1)
buzzer.duty(0) # Matikan buzzer
# Loop Program
while True:
try:
# Membaca Sensor DHT22
sensor_dht.measure()
temperature = sensor_dht.temperature()
humidity = sensor_dht.humidity()
# Membaca Sensor Ultrasonik
distance = sensor_ultrasonic.distance_cm()
# Membaca Sensor Gas & Konversi ke Persentase
gas_adc = sensor_gas_analog.read()
gas_percent = convert_adc_to_percent(gas_adc)
# Memeriksa Sensor PIR (Gerakan)
motion_detected = sensor_pir.value()
warnings = []
trigger_alarm = False
# Cek Gerakan (PIR) & Kunci Pintu
if motion_detected:
warnings.append("Gerakan Terdeteksi!")
trigger_alarm = True
pintu_terkunci = True # Pintu tetap terkunci
# Cek Ultrasonik
if distance < THRESHOLD_DISTANCE:
warnings.append("Seseorang Mendekat!")
trigger_alarm = True
pintu_terkunci = True # Pintu tetap tertutup
# Cek Gas Beracun
if gas_percent > THRESHOLD_GAS_PERCENT:
warnings.append("Gas Berbahaya!")
trigger_alarm = True
# Cek Suhu & Kelembaban
if temperature < THRESHOLD_TEMP_MIN or temperature > THRESHOLD_TEMP_MAX:
warnings.append("Suhu Berbahaya!")
trigger_alarm = True
if humidity < THRESHOLD_HUM_MIN or humidity > THRESHOLD_HUM_MAX:
warnings.append("Kelembaban Tidak Normal!")
trigger_alarm = True
# Kontrol Buzzer Jika Ada Ancaman
if trigger_alarm:
security_alert()
# Kontrol Servo (Pintu Otomatis)
if pintu_terkunci:
servo.write_angle(90) # Pintu Tetap Tertutup
else:
servo.write_angle(0) # Pintu Terbuka
# Update OLED Display
update_oled(temperature, humidity, distance, gas_percent, warnings)
time.sleep(2)
except Exception as e:
print("Error:", e)