// === WOKWI 2: KIPAS (CORRECTED LOGIC) ===
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io";
const char* topic_suhu = "proyek3/kelompok_3/suhu";
const char* topic_manual = "proyek3/kelompok_3/manual";
WiFiClient espClient;
PubSubClient client(espClient);
#define PIR_PIN 13
#define RELAY_PIN 2
float suhuTerakhir = 0.0;
bool modeManual = false;
void setup_wifi() {
delay(10);
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" WiFi Connected!");
}
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message received ["); Serial.print(topic); Serial.print("]: ");
Serial.println(message);
if (String(topic) == topic_suhu) {
suhuTerakhir = message.toFloat();
Serial.print("Temperature updated: "); Serial.println(suhuTerakhir);
} else if (String(topic) == topic_manual) {
if (message == "ON") {
digitalWrite(RELAY_PIN, HIGH); // ⚡ UBAH KE HIGH
modeManual = true;
Serial.println("⚠️ MANUAL MODE: Fan ON");
} else if (message == "OFF") {
digitalWrite(RELAY_PIN, LOW); // ⚡ UBAH KE LOW
modeManual = false;
Serial.println("✅ AUTO MODE: Fan OFF");
}
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting MQTT...");
String clientId = "ESP32Client-Fan-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println(" Connected!");
client.subscribe(topic_suhu);
client.subscribe(topic_manual);
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retry in 5s...");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
// ⚡ UBAH: Matikan relay saat startup (LOW)
digitalWrite(RELAY_PIN, LOW);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
// Debug info
Serial.print("Temp: "); Serial.print(suhuTerakhir);
Serial.print("°C | Motion: "); Serial.print(digitalRead(PIR_PIN));
Serial.print(" | Manual: "); Serial.println(modeManual);
if (!modeManual) {
int motion = digitalRead(PIR_PIN);
if (suhuTerakhir > 30.0 && motion == HIGH) {
digitalWrite(RELAY_PIN, HIGH); // ⚡ NYALA = HIGH
Serial.println("🔥 HOT & MOTION → Fan ON");
} else {
digitalWrite(RELAY_PIN, LOW); // ⚡ MATI = LOW
if (suhuTerakhir <= 30) {
Serial.println("❄️ Cool temp → Fan OFF");
} else {
Serial.println("👻 No motion → Fan OFF");
}
}
} else {
Serial.println("⚠️ Manual mode active");
}
delay(1000);
}