#define BLYNK_TEMPLATE_ID "TMPL6a6_s_S8x"
#define BLYNK_TEMPLATE_NAME "UTP IOT DILVI YOLA"
#define BLYNK_AUTH_TOKEN "ez0sK2QNgNSkgUs08ko6FkY654AgNa1L"
#define BLYNK_PRINT Serial
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Pin komponen
int redled = 19;
int yellowled = 4;
int blueled = 15;
int buzzpin = 23;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
bool buzzerEnabled = true;
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
DHT dht(14, DHT22);
BlynkTimer timer;
float t, h; // Suhu dan kelembapan
// Mapping Virtual Pins
#define BUZZER_PIN V4
#define LED_RED_PIN V0
#define LED_YELLOW_PIN V1
#define LED_BLUE_PIN V2
#define TEMP_PIN V3
#define HUMIDITY_PIN V5
#define BUZZER_STATUS_PIN V6 // TAMBAHAN: Untuk menampilkan status "AMAN/WASPADA/TIDAK AMAN"
// Toggle dari Blynk untuk mengaktifkan/mematikan buzzer
BLYNK_WRITE(BUZZER_PIN) {
buzzerEnabled = param.asInt();
}
void setup() {
Serial.begin(115200);
Wire.begin();
Wire.setClock(400000);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Gagal memulai OLED"));
while (1);
}
Blynk.begin(auth, ssid, pass);
dht.begin();
pinMode(redled, OUTPUT);
pinMode(yellowled, OUTPUT);
pinMode(blueled, OUTPUT);
pinMode(buzzpin, OUTPUT);
timer.setInterval(2000L, sendSensorData); // Update data tiap 2 detik
}
void loop() {
Blynk.run();
timer.run();
}
void sendSensorData() {
t = dht.readTemperature();
h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println("Gagal membaca sensor DHT!");
return;
}
// Kirim data ke Blynk
Blynk.virtualWrite(TEMP_PIN, t);
Blynk.virtualWrite(HUMIDITY_PIN, h);
// Tampilkan di OLED
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(0, 2);
oled.print("Suhu: ");
oled.print(t);
oled.println(" *C");
oled.print("Kelembapan: ");
oled.print(h);
oled.println(" %");
oled.display();
// Reset LED dan buzzer
digitalWrite(blueled, LOW);
digitalWrite(yellowled, LOW);
digitalWrite(redled, LOW);
noTone(buzzpin);
// Reset LED Virtual
Blynk.virtualWrite(LED_RED_PIN, 0);
Blynk.virtualWrite(LED_YELLOW_PIN, 0);
Blynk.virtualWrite(LED_BLUE_PIN, 0);
// Logika kondisi pemantauan
if (t >= 25 && t <= 30 && h >= 55 && h <= 65) {
digitalWrite(blueled, HIGH);
Blynk.virtualWrite(LED_BLUE_PIN, 1);
Blynk.virtualWrite(BUZZER_STATUS_PIN, "AMAN");
Serial.println("Status: AMAN");
}
else if (t >= 31 && t <= 33 && h >= 66 && h <= 70) {
digitalWrite(yellowled, HIGH);
Blynk.virtualWrite(LED_YELLOW_PIN, 1);
Blynk.virtualWrite(BUZZER_STATUS_PIN, "WASPADA");
Serial.println("Status: WASPADA");
}
else if (t < 25 || t > 33 || h < 50 || h > 70) {
digitalWrite(redled, HIGH);
Blynk.virtualWrite(LED_RED_PIN, 1);
Blynk.virtualWrite(BUZZER_STATUS_PIN, "TIDAK AMAN");
Serial.println("Status: TIDAK AMAN");
if (buzzerEnabled) {
Serial.println("Buzzer diaktifkan");
tone(buzzpin, 500);
Blynk.logEvent("warning", "PERINGATAN! Kondisi TIDAK AMAN!");
} else {
Serial.println("Buzzer dinonaktifkan");
noTone(buzzpin);
}
}
}