from machine import Pin, ADC, PWM
import time
import dht
# Inisialisasi sensor dan aktuator
sensor_dht = dht.DHT22(Pin(4)) # Data pin DHT22 -> GPIO4
ldr_sensor = ADC(Pin(34)) # LDR ke ADC GPIO34
ldr_sensor.atten(ADC.ATTN_11DB) # Rentang ADC penuh (3.3V)
# Ultrasonic HC-SR04 pins
trigger = Pin(5, Pin.OUT) # TRIG -> GPIO5
echo = Pin(18, Pin.IN) # ECHO -> GPIO18
# Servo PWM (duty dari 40 sampai 115 untuk 0-180 derajat kira-kira)
servo_pwm = PWM(Pin(21), freq=50) # Servo ke GPIO21
# LED Biru (lampu tumbuh)
led_blue = Pin(22, Pin.OUT) # LED Biru -> GPIO22
# LED Merah (peringatan air kurang)
led_red = Pin(19, Pin.OUT) # LED Merah -> GPIO19
def ultrasonic_distance():
# Mengirim pulsa trigger 10us
trigger.value(0)
time.sleep_us(2)
trigger.value(1)
time.sleep_us(10)
trigger.value(0)
# Mengukur waktu pulse echo (max 38ms untuk jarak 6.5m)
while echo.value() == 0:
pass
start = time.ticks_us()
while echo.value() == 1:
pass
end = time.ticks_us()
duration = time.ticks_diff(end, start)
distance_cm = (duration / 2) / 29.1 # Kecepatan suara 343m/s
return distance_cm
def servo_open():
# Posisi buka ventilasi ~90 derajat
duty = 77 # sesuaikan sesuai servo, contoh: 77 ~ 90°
servo_pwm.duty(duty)
def servo_close():
# Posisi tutup ventilasi ~0 derajat
duty = 40 # sesuaikan servo
servo_pwm.duty(duty)
def motor_on():
# Misal duty cycle 512 dari max 1023 untuk PWM motor kipas
# Karena belum ada PWM motor di diagram, ini contoh kontrol servo saja
pass
def motor_off():
pass
while True:
try:
# Baca DHT22
sensor_dht.measure()
suhu = sensor_dht.temperature()
kelembaban = sensor_dht.humidity()
# Baca LDR (nilai ADC 0-4095)
ldr = ldr_sensor.read()
# Baca jarak ultrasonic (cm)
jarak_air = ultrasonic_distance()
print("Suhu:", suhu, "C Humidity:", kelembaban, "% LDR:", ldr, "Jarak air:", jarak_air, "cm")
# Kondisi 1: Jika suhu > 30 dan kelembaban > 70
if suhu > 30 and kelembaban > 70:
servo_open()
# Di sini bisa ditambahkan kontrol motor kipas jika ada PWM motor
print("Ventilasi terbuka, motor nyala")
else:
servo_close()
print("Ventilasi tertutup, motor mati")
# Kondisi 2: Jika cahaya < 250 (nilai ADC)
if ldr < 250:
led_blue.value(1) # LED nyala
print("LED lampu tumbuh ON")
else:
led_blue.value(0) # LED mati
print("LED lampu tumbuh OFF")
# Kondisi 3: Jika air kurang dari 6 cm
if jarak_air < 6:
led_red.value(1) # LED peringatan nyala
print("Peringatan: Air kurang!")
else:
led_red.value(0) # LED peringatan mati
time.sleep(2)
except Exception as e:
print("Error:", e)
servo_close()
led_blue.value(0)
led_red.value(0)
time.sleep(2)