from machine import Pin, PWM, SoftI2C, ADC
import dht
import ssd1306
import time
from hcsr04 import HCSR04
from servo import Servo
# Inisialisasi Sensor
sensor_dht = dht.DHT22(Pin(4))
sensor_ultrasonic = HCSR04(trigger_pin=12, echo_pin=14)
sensor_gas = ADC(Pin(34))
sensor_gas.atten(ADC.ATTN_11DB)
sensor_ldr = ADC(Pin(35))
sensor_water = ADC(Pin(32))
sensor_water.atten(ADC.ATTN_11DB)
# Inisialisasi OLED
i2c = SoftI2C(scl=Pin(22), sda=Pin(21))
display = ssd1306.SSD1306_I2C(128, 64, i2c)
# Inisialisasi Aktuator
buzzer = PWM(Pin(5))
buzzer.freq(1000)
ventilasi = Servo(2) # Servo Ventilasi
# Threshold Parameter
PARAMETER = {
"LUX_MIN": 1300,
"GAS_MAX": 30,
"TEMP_MIN": 15,
"TEMP_MAX": 35,
"HUM_MIN": 40,
"HUM_MAX": 80,
"WATER_MIN": 30
}
# Variabel paging OLED
page = 0
last_page_switch = time.ticks_ms()
def map_value(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
def read_sensors():
sensor_dht.measure()
return {
"temp": sensor_dht.temperature(),
"hum": sensor_dht.humidity(),
"water_level": sensor_ultrasonic.distance_cm(),
"gas": map_value(sensor_gas.read(), 0, 4095, 0, 100),
"lux": sensor_ldr.read(),
"water_analog": sensor_water.read()
}
def control_system(data):
warnings = []
# Servo selalu buka ventilasi 90 derajat
ventilasi.write_angle(90)
# Warning Level Air
if data['water_level'] < PARAMETER["WATER_MIN"]:
buzzer.duty(512)
warnings.append("Air Rendah!")
else:
buzzer.duty(0)
if data['lux'] < PARAMETER["LUX_MIN"]:
warnings.append("Cahaya Kurang!")
if data['gas'] > PARAMETER["GAS_MAX"]:
warnings.append("Gas Tinggi!")
if data['temp'] < PARAMETER["TEMP_MIN"] or data['temp'] > PARAMETER["TEMP_MAX"]:
warnings.append(f"Suhu Tidak Normal! {data['temp']:.1f}C")
if data['hum'] < PARAMETER["HUM_MIN"] or data['hum'] > PARAMETER["HUM_MAX"]:
warnings.append(f"Hum Tidak Normal! {data['hum']:.1f}%")
return warnings
def update_display(data, warnings):
global page, last_page_switch
display.fill(0)
if time.ticks_diff(time.ticks_ms(), last_page_switch) > 3000:
page = (page + 1) % 3
last_page_switch = time.ticks_ms()
if page == 0:
display.text("Sensor Monitor", 0, 0)
display.text(f"Temp: {data['temp']:.1f}C", 0, 12)
display.text(f"Hum : {data['hum']:.1f}%", 0, 22)
display.text(f"Air : {data['water_level']:.1f}cm", 0, 32)
display.text(f"Gas : {data['gas']:.1f}%", 0, 42)
display.text(f"Lux : {data['lux']}", 0, 52)
elif page == 1:
display.text("Info Suhu & Hum", 0, 0)
display.text(f"Suhu : {data['temp']:.1f} C", 0, 20)
display.text(f"Kelembaban: {data['hum']:.1f} %", 0, 35)
else:
display.text("!! PERINGATAN !!", 0, 0)
if warnings:
for i, warn in enumerate(warnings[:4]):
display.text(f"- {warn}", 0, 12 + i * 10)
else:
display.text("Tidak Ada!", 0, 20)
display.show()
# Main Loop
while True:
try:
data = read_sensors()
warnings = control_system(data)
update_display(data, warnings)
time.sleep(1)
except Exception as e:
print("Error:", e)
time.sleep(1)