#include <WiFi.h>
#include <PubSubClient.h>
// WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT broker privat (shiftr.io)
const char* mqtt_server = "pings-112.cloud.shiftr.io";
const int mqtt_port = 1883;
const char* mqtt_user = "pings-112"; // username broker
const char* mqtt_pass = "pinsss"; // password/token broker
// Topik
const char* topic_publish = "esp32/pir_sensor"; // publish status PIR
const char* topic_control = "esp32/alarm_control"; // subscribe kontrol alarm
// Pin
#define PIR_PIN 27
#define LED_ALARM 26
WiFiClient espClient;
PubSubClient client(espClient);
bool alarmAktif = false;
// Koneksi WiFi
void setup_wifi() {
Serial.print("Menghubungkan ke WiFi ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi terhubung!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
// Callback MQTT
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (unsigned int i = 0; i < length; i++) {
msg += (char)payload[i];
}
msg.trim();
Serial.print("Pesan diterima [");
Serial.print(topic);
Serial.print("] ");
Serial.println(msg);
// Kontrol reset alarm
if (String(topic) == topic_control) {
if (msg.equalsIgnoreCase("reset")) {
digitalWrite(LED_ALARM, LOW);
alarmAktif = false;
Serial.println("Alarm direset → LED mati");
}
}
}
// Reconnect MQTT
void reconnect() {
while (!client.connected()) {
Serial.print("Menghubungkan ke broker MQTT...");
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {
Serial.println("TERHUBUNG!");
client.subscribe(topic_control);
Serial.print("Subscribe ke topik: ");
Serial.println(topic_control);
} else {
Serial.print("Gagal, rc=");
Serial.print(client.state());
Serial.println(" coba lagi 2 detik...");
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(LED_ALARM, OUTPUT);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
int gerakan = digitalRead(PIR_PIN);
if (gerakan == HIGH && !alarmAktif) {
digitalWrite(LED_ALARM, HIGH);
alarmAktif = true;
client.publish(topic_publish, "Gerakan Terdeteksi!");
Serial.println("Gerakan Terdeteksi! → LED nyala");
}
delay(200);
}