#include <WiFi.h> // Library untuk koneksi Wi-Fi
#include <PubSubClient.h> // Library untuk koneksi MQTT
// Data akun koneksi ke SSID (Wi-Fi)
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Data akun MQTT server/broker
const char* mqttServer = "mqttmuti.sija-bridge.tech";
int mqttPort = 1808;
const char* topicMQTT = "esp32/led";
// Membuat objek untuk mengelola koneksi Wi-Fi
WiFiClient espClient;
// Membuat objek untuk mengelola layanan MQTT
PubSubClient clientMQTT(espClient);
// LED
#define ungu 18 // Alias untuk pin 18
// Fungsi callback() untuk membaca data dari publisher
void callback(char* topic, byte* payload, unsigned int length) {
String messageTemp; // Variabel untuk menyimpan data sementara dalam tipe string
Serial.print("Pesan diterima di topic: ");
Serial.println(topic);
Serial.print("Isi pesan yang diterima: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
messageTemp += (char)payload[i];
}
Serial.println("");
// LED Control berdasarkan pesan yang diterima
if (String(topic) == topicMQTT) {
if (messageTemp == "true") {
Serial.println("Status LED: ON");
digitalWrite(ungu, HIGH); // Menyalakan LED
clientMQTT.publish("esp32/status", "ON");
} else if (messageTemp == "false") {
Serial.println("Status LED: OFF");
digitalWrite(ungu, LOW); // Mematikan LED
clientMQTT.publish("esp32/status", "OFF");
}
}
}
// Fungsi untuk menghubungkan ke Wi-Fi
void connectToInternet() {
Serial.print("Connecting to Wi-Fi...");
WiFi.begin(ssid, password); // Mencoba connect ke Wi-Fi
unsigned long startTime = millis(); // Mulai menghitung waktu
// Melakukan pengecekan terhadap status koneksi ke Wi-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (millis() - startTime > 10000) { // Timeout 10 detik
Serial.println(" Failed to connect to Wi-Fi");
return;
}
}
Serial.println("");
Serial.println("Connected to Wi-Fi");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
// Fungsi untuk menghubungkan ke broker MQTT
void reconnectMQTT() {
while (!clientMQTT.connected()) {
Serial.print("Connecting to MQTT Broker...");
// Membuat Client ID untuk setiap device
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
// Menampilkan pesan jika koneksi ke MQTT broker sukses
if (clientMQTT.connect(clientId.c_str())) {
Serial.println(" Connected to MQTT Broker.");
// Publish pesan ke topic esp32/led
clientMQTT.publish(topicMQTT, "LED Ready to control");
// Subscribe ke topic esp32/led
clientMQTT.subscribe(topicMQTT);
} else {
Serial.print(" Failed, rc=");
Serial.print(clientMQTT.state());
Serial.println(" Try again in 5 seconds");
delay(5000); // Tunggu 5 detik sebelum mencoba lagi
}
}
}
// Fungsi untuk mengatur dan menginisialisasi koneksi ke broker MQTT
void setupMQTT() {
clientMQTT.setServer(mqttServer, mqttPort); // Mengatur detail broker target yang digunakan
clientMQTT.setCallback(callback);
}
// Setup untuk inisialisasi awal
void setup() {
Serial.begin(115200); // Konfigurasi Serial Monitor
pinMode(ungu, OUTPUT); // Inisialisasi pin LED sebagai output
connectToInternet(); // Konek ke Wi-Fi
setupMQTT(); // Konek ke MQTT Broker
}
// Loop utama
void loop() {
// Cek koneksi Wi-Fi dan lakukan reconnect jika terputus
if (WiFi.status() != WL_CONNECTED) {
connectToInternet();
}
// Cek koneksi ke MQTT dan lakukan reconnect jika terputus
if (!clientMQTT.connected()) {
reconnectMQTT();
}
clientMQTT.loop(); // Proses komunikasi MQTT
}