from machine import Pin, ADC, PWM, I2C
import dht
import time
import network
import blynklib as BlynkLib
from machine_i2c_lcd import I2cLcd
# =========================
# KONFIGURASI BLYNK & WIFI
# =========================
# Masukkan Token dari Blynk Console
BLYNK_AUTH = '4mGn4o_Je8O307Y4hc8ICz-LxGopM0wJ'
# Koneksi WiFi Wokwi
print("Menghubungkan ke WiFi...", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Terhubung!")
# Inisialisasi Blynk
blynk = BlynkLib.Blynk(BLYNK_AUTH)
# =========================
# PENGATURAN LCD I2C
# =========================
I2C_ADDR = 0x27
i2c = I2C(0, sda=Pin(21), scl=Pin(22), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)
# =========================
# PENGATURAN PIN
# =========================
pir = Pin(13, Pin.IN)
ldr = Pin(27, Pin.IN)
lamp = Pin(2, Pin.OUT)
fan = Pin(4, Pin.OUT)
fan.value(1) # OFF awal (Active Low)
buzzer = PWM(Pin(5))
dht_sensor = dht.DHT22(Pin(15))
# =========================
# THRESHOLD
# =========================
TEMP_FAN = 30
TEMP_BUZZER = 35
def buzzer_off():
buzzer.duty(0)
def beep_fast():
buzzer.freq(2000)
buzzer.duty(512)
time.sleep(0.1)
buzzer.duty(0)
# Tampilan Awal
lcd.clear()
lcd.putstr("Syamsul Arifin\nSystem Siap")
time.sleep(2)
last_blynk_update = 0
# =========================
# LOOP UTAMA
# =========================
while True:
# Jalankan Blynk
blynk.run()
try:
# Baca Sensor
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
motion = pir.value()
light = ldr.value()
# Logika Lampu
if motion == 1 and light == 1:
lamp.on()
status_lamp = 1 # Untuk Blynk (Gunakan Integer/Value)
str_lamp = "ON "
else:
lamp.off()
status_lamp = 0
str_lamp = "OFF"
# Logika Fan (Relay Active Low)
if temp > TEMP_FAN:
fan.value(0)
status_fan = 1
str_fan = "ON "
else:
fan.value(1)
status_fan = 0
str_fan = "OFF"
# Logika Buzzer
if temp > TEMP_BUZZER:
beep_fast()
else:
buzzer_off()
# Update LCD
lcd.move_to(0, 0)
lcd.putstr("T:{:.1f}C H:{:.0f}%".format(temp, hum))
lcd.move_to(0, 1)
lcd.putstr("L:{} F:{}".format(str_lamp, str_fan))
# Kirim data ke Blynk setiap 2 detik (agar tidak spamming/flood)
if time.ticks_ms() - last_blynk_update > 2000:
blynk.virtual_write(1, temp) # V1: Suhu
blynk.virtual_write(2, hum) # V2: Kelembapan
blynk.virtual_write(3, status_lamp) # V3: Status Lampu
blynk.virtual_write(4, status_fan) # V4: Status Kipas
last_blynk_update = time.ticks_ms()
print("Data terkirim ke Blynk: T:{} H:{}".format(temp, hum))
except Exception as e:
print("Error:", e)
time.sleep(1)
time.sleep(0.1) # Loop kecil agar Blynk tetap responsif