#include <WiFi.h> //library Wi-Fi
#include <AViShaMQTT.h> //library Avisha mqtt
const char *ssid = "Wokwi-GUEST"; //2.4
const char *password = "";
const char *mqtt_server = "broker.hivemq.com"; //server lain: broker.emqx.com
AViShaMQTT mqtt(ssid, password, mqtt_server); //menyambungkan ke wifi dan mqtt
//topik setiap relay disimpan dalam array
const char *topics[] = {
"relay1", "relay2", "relay3", "relay4",
"relay5", "relay6", "relay7", "relay8"
};
int relays[] = {17, 5, 4, 2, 16, 14, 13, 12}; //variabel pin
unsigned long timer, intervalKirim = 1000; //millisecond
void setup() {
Serial.begin(115200);
mqtt.begin(); //memulai mqtt
// set pinMode untuk semua relay
for (int i = 0; i < 8; i++) { //0,1,2,3,4,5,6,7 //do..while, while, for
pinMode(relays[i], OUTPUT);
mqtt.subscribe(topics[i], 1); // (topik,QoS 1) Quality Of Service 0,1,2
}
}
void loop() {
mqtt.loop();
String pesan = mqtt.getIncomingMessage(); //inisiasi pesan
String topik = mqtt.getIncomingTopic(); //inisiasi topik
//melakukan subscribe untuk kendali relay
if (pesan != "") {
for (int i = 0; i < 8; i++) {
if (topik == topics[i]) {
digitalWrite(relays[i], pesan.toInt()); // 0 = mati, 1 = nyala
Serial.println("Relay " + String(i + 1) + " = " + pesan);
break; // langsung keluar setelah ketemu
}
}
mqtt.setIncomingMessage(""); // reset buffer pesan
}
for (int i = 0; i < 8; i++) {
mqtt.subscribe(topics[i], 1); // (topik,QoS 1)
//Level QoS 0: Pesan dikirimkan sekali dan tidak ada konfirmasi yang diperlukan.
//Level QoS 1: Pesan dijamin sampai ke penerima setidaknya satu kali.
//Level QoS 2: Pesan dijamin sampai ke penerima tepat satu kali.
}
}
//Sudah dijelaskan: XI 4 (28/08/2025)
//Sudah dijelaskan: XI 3 (29/08/2025)
//Sudah dijelaskan: XI 5 (30/08/2025)