#define PIR_PIN 2 // Pin digital untuk sensor gerak PIR
#define RELAY_PIN 4 // Pin digital untuk mengontrol relay
#define LED_PIN 16 // Pin digital untuk mengontrol LED
boolean motionDetected = false;
#include <WiFi.h>
#include <PubSubClient.h>
#define WIFISSID "Wokwi-GUEST"
#define PASSWORD ""
#define TOKEN "BBUS-dpsoVMd27biDX6b3ry0QaqEyHuU8bz"
#define MQTT_CLIENT_NAME "ESP32_joyan"
#define VARIABEL_LABEL "sensor-lampu"
#define VARIABEL_LABEL_SUBSCRIBE "sensor-lampu"
#define DEVICE_LABEL "ESP32_joyan"
char mqttBroker[] = "stem.ubidots.com";
char payload[100];
char topic[150];
char topicSubscribe[100];
String contextLamp;
WiFiClient ubidots;
PubSubClient client(ubidots);
unsigned long lastMotionTime = 0;
const unsigned long motionDelay = 5000; // Waktu hidup lampu (dalam milidetik), contoh: 300000 ms (5 menit)
void reconnect() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) {
Serial.println("Connected to MQTT broker");
client.subscribe(topicSubscribe);
} else {
Serial.print("Failed to connect to MQTT broker, rc=");
Serial.print(client.state());
Serial.println("Retrying in 2 seconds...");
delay(2000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
char p[length + 1];
memcpy(p, payload, length);
p[length] = NULL; // Menambahkan null terminator ke akhir string
String message(p);
//tambahkan logika jika ingin mengolah callback dari ubidots
}
void setup(){
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
WiFi.begin(WIFISSID, PASSWORD);
Serial.println();
Serial.print("Wait for wifi...");
while (WiFi.status() != WL_CONNECTED){
Serial.println(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi Connected");
Serial.println("IP Address: ");
Serial.println(WiFi.localIP());
client.setServer(mqttBroker, 1883);
client.setCallback(callback);
sprintf(topicSubscribe, "/v1.6/devices/%s/%s/lv", DEVICE_LABEL, VARIABEL_LABEL_SUBSCRIBE);
client.subscribe(topicSubscribe);
}
void loop(){
if (!client.connected()){
client.subscribe(topicSubscribe);
reconnect();
}
// Baca status sensor gerak
motionDetected = digitalRead(PIR_PIN);
// Jika gerakan terdeteksi, nyalakan lampu
if (motionDetected) {
Serial.println("Gerakan terdeteksi! Menyalakan lampu.");
digitalWrite(RELAY_PIN, HIGH); // Mengaktifkan relay
digitalWrite(LED_PIN, HIGH);
sendToUbidots(1);
lastMotionTime = millis();
}
// Jika tidak ada gerakan dan sudah melewati waktu hidup lampu, matikan lampu
else if (millis() - lastMotionTime > motionDelay) {
Serial.println("Tidak ada gerakan. Mematikan lampu.");
digitalWrite(RELAY_PIN, LOW); // Mematikan relay
digitalWrite(LED_PIN, LOW);
sendToUbidots(0);
}
delay(1000);
}
void sendToUbidots(int lampStatus) {
if (lampStatus == 0){
contextLamp = "Mati";
} else {
contextLamp = "Hidup";
}
sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL);
sprintf(payload, "{\"%s\":{\"value\":%d,\"context\":\"%s\"}}", VARIABEL_LABEL, lampStatus, contextLamp);
Serial.println("Publishing data to Ubidots Cloud");
client.publish(topic, payload);
// Tambahkan delay dan client.loop() untuk memastikan data terkirim
client.loop();
delay(1000);
}