// ==============================================
// ==> GANTI 3 BARIS INI DENGAN KREDENSIAL ANDA <==
// ==============================================
#define BLYNK_TEMPLATE_ID "TMPL69q_WrpIX"
#define BLYNK_TEMPLATE_NAME "SMART WARNING SYSTEM"
#define BLYNK_AUTH_TOKEN "x2oSlFf5zP9FuU0mNwe1BfLpY1kxx6sr"
// ==============================================
#include <Arduino.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <BlynkTimer.h>
// WiFi untuk simulasi Wokwi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// ==== Virtual Pins ====
#define vPIN_TEMP V0 // Labeled Value suhu (DOUBLE)
#define vPIN_LED V1 // Button switch ON/OFF LED (INTEGER)
#define vPIN_BRIGHTNESS V2 // Slider PWM brightness (0–255)
#define vPIN_STATUS V3 // Value Display teks "ON"/"OFF" (STRING)
#define vPIN_MUTE V4 // Button switch mute notifikasi (INTEGER)
// ==== Hardware (ESP32) ====
const int LED_PIN = 2;
const int PWM_CHANNEL = 0;
const int PWM_FREQ = 5000;
const int PWM_RESOLUTION = 8;
// ==== Logika Aplikasi ====
BlynkTimer timer;
float temperature = 0.0;
const float TEMP_THRESHOLD = 30.0;
bool isAboveThreshold = false;
bool muteNotifications = false;
int ledOn = 0;
int brightness = 128;
const char EVENT_HIGH_TEMP[] = "high_temp_warning";
// Helper: terapkan output LED sesuai ledOn & brightness
void applyLedOutput() {
int duty = (ledOn ? brightness : 0);
ledcWrite(PWM_CHANNEL, duty);
}
// Helper: update teks status ke V3
void updateStatusText() {
const char* txt = (ledOn && brightness > 0) ? "ON" : "OFF";
Blynk.virtualWrite(vPIN_STATUS, txt);
}
// Kirim suhu berkala + logika warna & event
void sendTemperature() {
temperature = random(250, 350) / 10.0; // 25.0–35.0°C
Blynk.virtualWrite(vPIN_TEMP, temperature);
if (temperature > TEMP_THRESHOLD && !isAboveThreshold) {
isAboveThreshold = true;
Blynk.setProperty(vPIN_TEMP, "color", "#FF0000");
if (!muteNotifications) {
String msg = String("Peringatan! Suhu: ") + temperature + " °C";
Blynk.logEvent(EVENT_HIGH_TEMP, msg);
}
} else if (temperature <= TEMP_THRESHOLD && isAboveThreshold) {
isAboveThreshold = false;
Blynk.setProperty(vPIN_TEMP, "color", "#23C48E"); // hijau
}
}
// Sinkronisasi saat terkoneksi
BLYNK_CONNECTED() {
Blynk.syncVirtual(vPIN_LED, vPIN_BRIGHTNESS, vPIN_MUTE);
}
// V1: ON/OFF LED
BLYNK_WRITE(vPIN_LED) {
ledOn = param.asInt();
applyLedOutput();
updateStatusText();
}
// V2: Brightness Slider
BLYNK_WRITE(vPIN_BRIGHTNESS) {
int val = param.asInt();
if (val < 0) val = 0;
if (val > 255) val = 255;
brightness = val;
applyLedOutput();
updateStatusText();
}
// V4: Mute notifikasi
BLYNK_WRITE(vPIN_MUTE) {
muteNotifications = (param.asInt() == 1);
}
void setup() {
Serial.begin(115200);
delay(100);
// PWM setup
ledcSetup(PWM_CHANNEL, PWM_FREQ, PWM_RESOLUTION);
ledcAttachPin(LED_PIN, PWM_CHANNEL);
applyLedOutput();
// Koneksi ke Blynk Cloud
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Jadwalkan pengiriman suhu tiap 2 detik
timer.setInterval(2000L, sendTemperature);
// Warna awal suhu: hijau
Blynk.setProperty(vPIN_TEMP, "color", "#23C48E");
}
void loop() {
Blynk.run();
timer.run();
}