from machine import ADC, Pin, PWM, I2C
from dht import DHT22
from ds3231 import DS3231
from i2c_lcd import I2cLcd
import utime
# === Inisialisasi Hardware ===
ldr = ADC(28) # LDR di GPIO28
pot = ADC(26) # Potensiometer tanah di GPIO26
dht = DHT22(Pin(22)) # DHT22 di GPIO22
servo_udara = PWM(Pin(10)) # Servo udara di GPIO10
servo_udara.freq(50)
relay_tanah = Pin(11, Pin.OUT) # Relay tanah di GPIO11 (menggantikan servo tanah)
led1 = Pin(14, Pin.OUT) # LED 1 di GPIO14
led2 = Pin(15, Pin.OUT) # LED 2 di GPIO15
# I2C untuk LCD (SDA=GPIO0, SCL=GPIO1)
i2c_lcd = I2C(0, sda=Pin(0), scl=Pin(1))
lcd = I2cLcd(i2c_lcd, 0x27, 2, 16)
# I2C untuk RTC (SDA=GPIO6, SCL=GPIO7)
i2c_rtc = I2C(1, sda=Pin(6), scl=Pin(7))
rtc = DS3231(i2c_rtc)
# === Fungsi Tambahan ===
def adc_to_lux(adc_val):
return int((adc_val / 65535) * 30000)
def adc_to_persen(adc_val):
return int((adc_val / 65535) * 100)
def buka_servo(servo):
servo.duty_u16(8192)
print(">>> Servo BUKA")
def tutup_servo(servo):
servo.duty_u16(1638)
print(">>> Servo TUTUP")
# === Loop Utama ===
while True:
try:
# Baca waktu dari RTC
jam, menit, detik = rtc.get_time()
print(f"[Waktu] {jam:02}:{menit:02}:{detik:02}")
# Baca LDR dan kontrol lampu jika jam 7–15
if 7 <= jam < 15:
lux = adc_to_lux(ldr.read_u16())
led1.value(lux >= 18000)
led2.value(lux < 18000)
else:
lux = 0
led1.value(0)
led2.value(0)
print(f"[LDR] Lux = {lux}, LED1 = {led1.value()}, LED2 = {led2.value()}")
# Baca suhu dan kelembapan udara dari DHT22
dht.measure()
utime.sleep(2)
suhu = dht.temperature
hum = dht.humidity
print(f"[DHT22] T = {suhu:.1f}°C, H = {hum:.1f}%")
# === Logika Servo Udara ===
if suhu > 30 and hum < 50:
buka_servo(servo_udara)
else:
tutup_servo(servo_udara)
# === Kelembapan tanah & Relay ===
kelembapan_tanah = adc_to_persen(pot.read_u16())
print(f"[Soil] Kelembapan Tanah = {kelembapan_tanah}%")
if kelembapan_tanah < 40:
relay_tanah.value(1) # Aktifkan relay
print(">>> Relay TANAH AKTIF")
else:
relay_tanah.value(0) # Matikan relay
print(">>> Relay TANAH NON-AKTIF")
# === Tampilkan ke LCD ===
lcd.clear()
lcd.putstr(f"T:{suhu:.1f}C H:{hum:.1f}%")
lcd.move_to(0, 1)
lcd.putstr(f"L:{lux} {jam:02}:{menit:02}")
print(f"[LCD] T:{suhu:.1f} H:{hum:.1f} L:{lux} {jam:02}:{menit:02}")
print("-" * 40)
utime.sleep(5)
except Exception as e:
print("!!! Error:", e)
utime.sleep(3)