// --- KELAYAKAN BLYNK ANDA ---
#define BLYNK_TEMPLATE_ID "TMPLxxxxxx" // Tukar TMPLxxxxxx ini dengan Template ID anda
#define BLYNK_TEMPLATE_NAME "Pemantauan Motor 3-Fasa" // Nama template anda
#define BLYNK_AUTH_TOKEN "fohhcbIxJVaUMPWF60oRd0ErvpRAthKG" // Token anda telah dimasukkan di sini!
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Tetapan WiFi Maya Khas Wokwi (WAJIB kekal seperti ini):
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Definisi Pin
#define ONE_WIRE_BUS 4
#define CURRENT_ADC GPIO_NUM_36 // Potentiometer 1
#define VOLTAGE_ADC GPIO_NUM_39 // Potentiometer 2
#define RELAY_PIN 2
#define BUZZER_PIN 5
BlynkTimer timer;
// Setup Sensor Suhu
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Pembolehubah Global
float temperature = 0.0;
float current = 0.0;
float voltage = 0.0;
bool isTripped = false;
void myTimerEvent();
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Status Awal Motor OFF (Relay Active Low dalam Wokwi)
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(BUZZER_PIN, LOW);
sensors.begin();
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Sediakan fungsi pemantauan setiap 1 saat
timer.setInterval(1000L, myTimerEvent);
}
void loop() {
Blynk.run();
timer.run();
}
// --- FUNGSI PEMANTAUAN SETIAP 1 SAAT ---
void myTimerEvent() {
// 1. Baca Sensor Suhu
sensors.requestTemperatures();
temperature = sensors.getTempCByIndex(0);
if (temperature == -127.00) temperature = 0.0;
// 2. Baca Arus & Voltan (Simulasi Potentiometer 0-5V Analog)
int currentRaw = analogRead(CURRENT_ADC);
int voltageRaw = analogRead(VOLTAGE_ADC);
// Tukar ADC Raw ke nilai simulasi (Laras formula mengikut keperluan simulasi)
current = (currentRaw / 4095.0) * 30.0; // Anggap potentiometer penuh = 30A
voltage = (voltageRaw / 4095.0) * 300.0; // Anggap potentiometer penuh = 300V
// 3. Logik Keselamatan (Trip/Latch)
if (temperature > 50.0 || current > 5.0) {
if (!isTripped) {
isTripped = true;
digitalWrite(RELAY_PIN, HIGH); // Matikan Motor
digitalWrite(BUZZER_PIN, HIGH); // Bunyikan Buzzer Amaran
Blynk.virtualWrite(V3, 0); // Kemaskini suis Blynk ke OFF
Serial.println("AMARAN: TRIP TERCETUS! Motor dimatikan.");
}
}
// 4. Hantar Data ke Widget Blynk
Blynk.virtualWrite(V0, temperature);
Blynk.virtualWrite(V1, current);
Blynk.virtualWrite(V2, voltage);
Blynk.virtualWrite(V4, isTripped ? 1 : 0); // Indikator Trip di App
}
// --- FUNGSI KAWALAN SUIS MOTOR (V3) ---
BLYNK_WRITE(V3) {
int switchState = param.asInt();
if (switchState == 1) {
if (!isTripped) {
digitalWrite(RELAY_PIN, LOW); // Hidupkan Motor (Active LOW)
Serial.println("Motor: DIHIDUPKAN");
} else {
Serial.println("Gagal Hidupkan! Sistem masih dalam keadaan Trip.");
Blynk.virtualWrite(V3, 0); // Paksa suis Blynk ke OFF semula
}
} else {
digitalWrite(RELAY_PIN, HIGH); // Matikan Motor
Serial.println("Motor: DIMATIKAN");
}
}
// --- FUNGSI BUTANG RESET (V5) ---
BLYNK_WRITE(V5) {
int resetVal = param.asInt();
if (resetVal == 1) {
if (temperature <= 50.0 && current <= 5.0) {
isTripped = false;
digitalWrite(BUZZER_PIN, LOW); // Matikan Buzzer
Blynk.virtualWrite(V4, 0); // Padam indikator Trip di App
Serial.println("RESET BERJAYA: Sistem kembali Normal.");
} else {
Serial.println("RESET GAGAL: Suhu/Arus masih dalam keadaan bahaya!");
}
}
}