import machine
from machine import Pin, I2C, PWM
import dht
import time
from i2c_lcd import I2cLcd
import network
import BlynkLib
# Konfigurasi WiFi
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
#define BLYNK_TEMPLATE_ID "TMPL6hCjoWGiO"
#define BLYNK_TEMPLATE_NAME "Fire Detector"
#define BLYNK_AUTH_TOKEN "CYAu-I9kQ1kmmHAt-mrZ0igu8VLjEpsb"
# Konfigurasi Blynk
BLYNK_AUTH_TOKEN = "CYAu-I9kQ1kmmHAt-mrZ0igu8VLjEpsb"
# Setup WiFi
def connect_wifi():
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
if not wifi.isconnected():
print('Menghubungkan ke WiFi...')
wifi.connect(WIFI_SSID, WIFI_PASSWORD)
while not wifi.isconnected():
pass
print('Terhubung ke WiFi')
print('IP Address:', wifi.ifconfig()[0])
# Hubungkan ke WiFi saat startup
connect_wifi()
# Inisialisasi Blynk
blynk = BlynkLib.Blynk(BLYNK_AUTH_TOKEN)
# Setup I2C dan LCD
i2c = I2C(scl=Pin(19), sda=Pin(21), freq=400000)
lcd = I2cLcd(i2c, I2cLcd.LCD_I2C_ADDR, 4, 20)
# Setup alarm dan sensor
alarm_pin = machine.Pin(15, machine.Pin.OUT)
sensor = dht.DHT22(Pin(13))
# Setup servo dengan frekuensi 50Hz
servo = PWM(Pin(17), freq=50)
def set_servo_angle(angle):
min_duty = 20
max_duty = 120
duty = int(((max_duty - min_duty) * angle / 180) + min_duty)
servo.duty(duty)
# Inisialisasi status api dan posisi awal servo
fire_detected = False
current_angle = 90 # Posisi awal 90 derajat (kondisi normal)
set_servo_angle(current_angle) # Set posisi awal servo
# Variable untuk tracking waktu notifikasi terakhir
last_notification_time = 0
NOTIFICATION_INTERVAL = 2 # Interval minimal antar notifikasi (dalam detik)
while True:
try:
# Jalankan Blynk untuk memastikan koneksi tetap aktif
blynk.run()
# Baca data sensor suhu dan kelembapan
current_time = time.time()
sensor.measure()
temp = sensor.temperature()
humi = sensor.humidity()
# Menampilkan data suhu dan kelembapan pada LCD
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Temp: {:.1f}C".format(temp))
lcd.move_to(0, 1)
lcd.putstr("Humidity: {:.1f}%".format(humi))
# Mengirim data suhu dan kelembapan ke Blynk
blynk.virtual_write(0, temp) # Virtual Pin V0 untuk suhu
blynk.virtual_write(1, humi) # Virtual Pin V1 untuk kelembapan
# Kondisi deteksi api
if temp >= 60 or humi <= 20:
if not fire_detected: # Status baru berubah menjadi terdeteksi api
fire_detected = True
alarm_pin.value(1)
set_servo_angle(180)
current_angle = 180
# Kirim notifikasi ke aplikasi Blynk
if current_time - last_notification_time >= NOTIFICATION_INTERVAL:
blynk.notify("⚠️ PERINGATAN KEBAKARAN! Suhu: {:.1f}°C, Kelembaban: {:.1f}%".format(temp, humi))
last_notification_time = current_time
lcd.move_to(0, 2)
lcd.putstr("Status: Fire!")
else:
if fire_detected: # Status baru berubah menjadi normal
fire_detected = False
alarm_pin.value(0)
set_servo_angle(90)
current_angle = 90
# Kirim notifikasi kondisi aman ke aplikasi Blynk
if current_time - last_notification_time >= NOTIFICATION_INTERVAL:
blynk.notify("✅ Kondisi Kembali Normal: Suhu: {:.1f}°C, Kelembaban: {:.1f}%".format(temp, humi))
last_notification_time = current_time
lcd.move_to(0, 2)
lcd.putstr("Status: Normal")
time.sleep(1)
except Exception as e:
print("Error:", e)
time.sleep(2)
continue