from time import sleep, ticks_ms
from machine import SoftI2C, Pin
from lcd_i2c import I2cLcd
from blynklib import Blynk
import dht
import ds1307
import network
# Blynk configuration
BLYNK_AUTH = 'alJw5A9PyLxavLjtCNUgbTLcMUbXw8sS' # Masukkan Auth Token dari Blynk
# Setup koneksi WiFi
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect("Wokwi-GUEST", "")
while not wifi.isconnected():
pass
print("WiFi Connected Successfully")
# Inisialisasi Blynk
blynk = Blynk(BLYNK_AUTH)
# Alamat I2C untuk LCD
alamat_lcd = 0x27
# Inisialisasi I2C untuk LCD
i2c = SoftI2C(scl=Pin(18), sda=Pin(19), freq=100000)
lcd = I2cLcd(i2c, alamat_lcd, 2, 16)
# Inisialisasi RTC DS1307 pada pin tertentu
jam_rtc = ds1307.DS1307(SoftI2C(scl=Pin(22), sda=Pin(21)))
# Inisialisasi sensor DHT22 pada Pin 15
sensor_dht = dht.DHT22(Pin(15))
# Inisialisasi sensor PIR pada Pin 13
sensor_pir = Pin(13, Pin.IN)
# Inisialisasi relay pada Pin 4 untuk mengontrol LED
relay = Pin(4, Pin.OUT)
# Ambang suhu untuk menyalakan LED
ambang_suhu = 30.0
# Status awal
status_lampu = "OFF"
waktu_gerakan_terakhir = ticks_ms()
status_lampu_terakhir = status_lampu
# Fungsi untuk memperbarui tampilan LCD
def update_lcd(suhu, kelembapan, status_lampu):
lcd.clear()
lcd.move_to(11, 0)
lcd.putstr(f'{suhu:.1f}C')
lcd.move_to(2, 1)
lcd.putstr(f'humid:{kelembapan:.1f}%')
lcd.move_to(0, 0)
lcd.putstr('LED:' + status_lampu)
# Fungsi untuk mencatat waktu perubahan status lampu
def catat_waktu():
waktu_rtc = jam_rtc.datetime
waktu_format = f"{waktu_rtc[0]:04}-{waktu_rtc[1]:02}-{waktu_rtc[2]:02} {waktu_rtc[3]:02}:{waktu_rtc[4]:02}:{waktu_rtc[5]:02}"
print("Status lampu berubah pada:", waktu_format)
return waktu_format
# Loop utama program
while True:
# Membaca suhu dan kelembapan dari sensor DHT22
sensor_dht.measure()
suhu = sensor_dht.temperature()
kelembapan = sensor_dht.humidity()
# Cek apakah suhu di atas ambang batas atau ada gerakan
if suhu > ambang_suhu or sensor_pir.value() == 1:
relay.value(1) # Nyalakan LED
status_lampu = "ON"
waktu_gerakan_terakhir = ticks_ms() # Perbarui waktu gerakan terakhir
else:
# Matikan LED jika tidak ada gerakan dan suhu di bawah ambang setelah 10 detik
if ticks_ms() - waktu_gerakan_terakhir > 10000:
relay.value(0)
status_lampu = "OFF"
# Catat waktu jika status lampu berubah
if status_lampu != status_lampu_terakhir:
waktu_format = catat_waktu()
status_lampu_terakhir = status_lampu
lcd.move_to(0, 1)
lcd.putstr("Waktu: " + waktu_format)
# Perbarui LCD dengan data terbaru
update_lcd(suhu, kelembapan, status_lampu)
# Kirim data ke Blynk
blynk.virtual_write(1, suhu) # Kirim suhu ke Virtual Pin V1
blynk.virtual_write(2, kelembapan) # Kirim kelembapan ke Virtual Pin V2
blynk.virtual_write(3, status_lampu) # Kirim status lampu ke Virtual Pin V3
# Jalankan Blynk
blynk.run()
sleep(1) # Tunggu 1 detik sebelum mengulang