// MQTT LED Node-Red Control
// Nama : Mochammad Faisal
// NIM : 121203006
#include <WiFi.h>
#include <PubSubClient.h>
// Definisi pin LED
#define LED1 15
#define LED2 2
#define LED3 4
#define LED4 22
// Informasi jaringan WiFi
// const char* ssid = "Zerobyte";
// const char* password = "zeropower";
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Alamat server MQTT
// const char* mqtt_server = "192.168.248.1";
const char* mqtt_server = "broker.emqx.io";
// Definisi variabel untuk topik MQTT
const char* topic_led1 = "device/salz/led1";
const char* topic_led2 = "device/salz/led2";
const char* topic_led3 = "device/salz/led3";
const char* topic_led4 = "device/salz/led4";
// Nilai Switch Sebelumnya
int switch_prev_1 = 0;
int switch_prev_2 = 0;
int switch_prev_3 = 0;
int switch_prev_4 = 0;
WiFiClient espClient;
PubSubClient client(espClient);
// Fungsi untuk menghubungkan ESP32 ke jaringan WiFi
void setup_wifi() {
delay(10);
Serial.print("Connecting to WiFi ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// Loop hingga terhubung ke WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected"); // Koneksi WiFi berhasil
Serial.print("IP Address: ");
Serial.println(WiFi.localIP()); // Menampilkan alamat IP
}
// Fungsi callback yang dipanggil saat pesan diterima dari topik yang di-subscribe
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0'; // Mengakhiri payload agar bisa diperlakukan sebagai string
Serial.print("Message received on topic: ");
Serial.print(topic);
Serial.print(". Payload: ");
Serial.println((char*)payload);
// Konversi payload menjadi variabel status LED
bool ledState = ((char)payload[0] == '1');
// Kontrol LED berdasarkan topik dan payload
// TOPIC LED 1
if (strstr(topic, topic_led1)) {
digitalWrite(LED1, ledState ? HIGH : LOW);
Serial.print("Callback : LED 1 state changed to ");
Serial.println(ledState ? "ON" : "OFF");
}
else if (strstr(topic, topic_led2)) {
// TOPIC LED 2
digitalWrite(LED2, ledState ? HIGH : LOW);
Serial.print("Callback : LED 2 state changed to ");
Serial.println(ledState ? "ON" : "OFF");
} else if (strstr(topic, topic_led3)) {
// TOPIC LED 3
digitalWrite(LED3, ledState ? HIGH : LOW);
Serial.print("Callback : LED 3 state changed to ");
Serial.println(ledState ? "ON" : "OFF");
} else if (strstr(topic, topic_led4)) {
// TOPIC LED 4
digitalWrite(LED4, ledState ? HIGH : LOW);
Serial.print("Callback : LED 4 state changed to ");
Serial.println(ledState ? "ON" : "OFF");
} else {
Serial.println("unsubscribed topic");
}
}
// Fungsi untuk menghubungkan ESP32 ke broker MQTT dan subscribe topik
void reconnect() {
while (!client.connected()) { // Loop hingga terhubung ke broker MQTT
String clientId = "ESPClient-";
clientId += String(random(0xffff), HEX); // Membuat ID klien unik untuk setiap koneksi
Serial.print("Attempting MQTT connection...");
if (client.connect(clientId.c_str())) { // Coba koneksi ke broker MQTT
Serial.println("connected");
// Subscribe ke topik-topik kontrol LED
client.subscribe(topic_led1);
client.subscribe(topic_led2);
client.subscribe(topic_led3);
client.subscribe(topic_led4);
Serial.println("Subscribed to topics: device led1, led2, led3, led4");
} else {
Serial.print("failed, rc = ");
Serial.print(client.state());
Serial.println(" | trying again in 5 seconds");
delay(5000); // Tunggu 5 detik sebelum mencoba kembali
}
}
}
// Fungsi setup untuk inisialisasi sistem
void setup() {
Serial.begin(115200); // Inisialisasi Serial Monitor dengan baud rate 115200
setup_wifi(); // Panggil fungsi untuk koneksi WiFi
client.setServer(mqtt_server, 1883); // Set server MQTT
client.setCallback(callback); // Set fungsi callback untuk MQTT
// Inisialisasi pin LED sebagai output
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
Serial.println("Setup complete. Waiting for MQTT messages...");
}
// Fungsi loop utama yang akan dijalankan berulang kali
void loop() {
if (!client.connected()) {
Serial.println("MQTT Disconnected. Reconnecting...");
reconnect(); // Jika tidak terhubung ke broker MQTT, panggil fungsi reconnect
}
client.loop(); // Mengecek dan memproses pesan MQTT yang diterima
// manual_switch();
}
void manual_switch() {
if (digitalRead(LED1) == HIGH) {
if (switch_prev_1 == 1) {
digitalWrite(LED1, LOW);
client.publish(topic_led1, "0");
Serial.println("LED 1 state changed to OFF");
switch_prev_1 = 0;
}
}
if (digitalRead(LED1) == LOW) {
if (switch_prev_1 == 0) {
digitalWrite(LED1, HIGH);
client.publish(topic_led1, "1");
Serial.println("LED 1 state changed to ON");
switch_prev_1 = 1;
}
}
// TOPIC LED 2
if (digitalRead(LED2) == HIGH) {
if (switch_prev_2 == 1) {
digitalWrite(LED2, LOW);
client.publish(topic_led2, "0");
Serial.println("LED 2 state changed to OFF");
switch_prev_2 = 0;
}
}
if (digitalRead(LED2) == LOW) {
if (switch_prev_2 == 0) {
digitalWrite(LED2, HIGH);
client.publish(topic_led2, "1");
Serial.println("LED 2 state changed to ON");
switch_prev_2 = 1;
}
}
// TOPIC LED 3
if (digitalRead(LED3) == HIGH) {
if (switch_prev_3 == 1) {
digitalWrite(LED3, LOW);
client.publish(topic_led3, "0");
Serial.println("LED 3 state changed to OFF");
switch_prev_3 = 0;
}
}
if (digitalRead(LED3) == LOW) {
if (switch_prev_3 == 0) {
digitalWrite(LED3, HIGH);
client.publish(topic_led3, "1");
Serial.println("LED 3 state changed to ON");
switch_prev_3 = 1;
}
}
// TOPIC LED 4
if (digitalRead(LED4) == HIGH) {
if (switch_prev_4 == 1) {
digitalWrite(LED4, LOW);
client.publish(topic_led4, "0");
Serial.println("LED 4 state changed to OFF");
switch_prev_4 = 0;
}
}
if (digitalRead(LED4) == LOW) {
if (switch_prev_4 == 0) {
digitalWrite(LED4, HIGH);
client.publish(topic_led4, "1");
Serial.println("LED 4 state changed to ON");
switch_prev_4 = 1;
}
}
}