/*
Project : ESP32 MQTT Led - Publish
Jangan Lupa rubah Sub topic (esp32-arf/led1) sesuai SUb Topic masing2
App :
- MQTTdashboard
- IoT MQTT Panel ( test work in 2026 )
Setting app IoT MQTT Panel :
https://www.youtube.com/watch?v=jEaRXHiDUzQ
pada diagram.json gunakan ESP32 dengan type:wokwi-esp32-devkit-v1 agar sesuai dengan ESP32 yang ada dipasaran
By : Arif S
at : 2 Feb 2026
- Non-blocking delay
- add Publish // Pulish test in LED 1
*/
#include <WiFi.h>
#include <PubSubClient.h>
// Non Blocking Delay
unsigned long previousMillis = 0;
const long interval = 3000; // interval at which to blink (milliseconds)
boolean flagF = true;
// WiFi
const char* ssid ="Wokwi-GUEST";
const char* password = "";
// MQTT
const char* mqtt_server = "broker.mqttdashboard.com";
const char* SUBTOPIC_LED1 = "esp32-ngin/led1"; // arf sesuaikan chanel masing2
const char* SUBTOPIC_LED2 = "esp32-ngin/led2"; // arf sesuaikan chanel masing2
const char* SUBTOPIC_LED3 = "esp32-ngin/led3"; // arf sesuaikan chanel masing2
const char* SUBTOPIC_LED4 = "esp32-ngin/led4"; // arf sesuaikan chanel masing2
WiFiClient espClient;
PubSubClient client(espClient);
// LED
const int LED1_PIN = 13;
const int LED2_PIN = 12;
const int LED3_PIN = 14;
const int LED4_PIN = 27;
// BUTTON (sesuai dengan diagram.json yang sudah ada)
const int BUTTON1_PIN = 21; // btn1 -> D21 -> LED1 (merah)
const int BUTTON2_PIN = 19; // btn2 -> D19 -> LED2 (biru)
const int BUTTON3_PIN = 18; // btn3 -> D18 -> LED3 (hijau)
const int BUTTON4_PIN = 5; // btn4 -> D5 -> LED4 (ungu)
// Status LED
bool led1State = false;
bool led2State = false;
bool led3State = false;
bool led4State = false;
// Status tombol sebelumnya
bool button1Pressed = false;
bool button2Pressed = false;
bool button3Pressed = false;
bool button4Pressed = false;
void setup_wifi() {
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
String clientId = "esp32-clientId-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected");
client.subscribe(SUBTOPIC_LED1);
client.subscribe(SUBTOPIC_LED2);
client.subscribe(SUBTOPIC_LED3);
client.subscribe(SUBTOPIC_LED4);
} else {
delay(5000);
}
}
}
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Receive Topic: ");
Serial.println(topic);
Serial.print("Payload: ");
Serial.println((char *)payload);
if (!strcmp(topic, SUBTOPIC_LED1)) {
if (!strncmp((char *)payload, "1", length)) {
digitalWrite(LED1_PIN, HIGH);
led1State = true;
}
else if (!strncmp((char *)payload, "0", length)) {
digitalWrite(LED1_PIN, LOW);
led1State = false;
}
}
if (!strcmp(topic, SUBTOPIC_LED2)) {
if (!strncmp((char *)payload, "1", length)) {
digitalWrite(LED2_PIN, HIGH);
led2State = true;
}
else if (!strncmp((char *)payload, "0", length)) {
digitalWrite(LED2_PIN, LOW);
led2State = false;
}
}
if (!strcmp(topic, SUBTOPIC_LED3)) {
if (!strncmp((char *)payload, "1", length)) {
digitalWrite(LED3_PIN, HIGH);
led3State = true;
}
else if (!strncmp((char *)payload, "0", length)) {
digitalWrite(LED3_PIN, LOW);
led3State = false;
}
}
if (!strcmp(topic, SUBTOPIC_LED4)) {
if (!strncmp((char *)payload, "1", length)) {
digitalWrite(LED4_PIN, HIGH);
led4State = true;
}
else if (!strncmp((char *)payload, "0", length)) {
digitalWrite(LED4_PIN, LOW);
led4State = false;
}
}
}
void setup() {
Serial.begin(115200);
// Setup LED pins sebagai OUTPUT
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(LED4_PIN, OUTPUT);
// Setup Button pins sebagai INPUT_PULLUP
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
pinMode(BUTTON3_PIN, INPUT_PULLUP);
pinMode(BUTTON4_PIN, INPUT_PULLUP);
// Matikan semua LED di awal
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, LOW);
digitalWrite(LED3_PIN, LOW);
digitalWrite(LED4_PIN, LOW);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
unsigned long currentMillis = millis();
if (!client.connected()) {
reconnect();
}
client.loop();
// Button 1
if (digitalRead(BUTTON1_PIN) == LOW && !button1Pressed) {
button1Pressed = true;
led1State = !led1State;
digitalWrite(LED1_PIN, led1State);
if (client.connected()) {
client.publish(SUBTOPIC_LED1, led1State ? "1" : "0");
}
Serial.println("Button 1 pressed - LED1: " + String(led1State ? "ON" : "OFF"));
}
if (digitalRead(BUTTON1_PIN) == HIGH) {
button1Pressed = false;
}
// Button 2
if (digitalRead(BUTTON2_PIN) == LOW && !button2Pressed) {
button2Pressed = true;
led2State = !led2State;
digitalWrite(LED2_PIN, led2State);
if (client.connected()) {
client.publish(SUBTOPIC_LED2, led2State ? "1" : "0");
}
Serial.println("Button 2 pressed - LED2: " + String(led2State ? "ON" : "OFF"));
}
if (digitalRead(BUTTON2_PIN) == HIGH) {
button2Pressed = false;
}
// Button 3
if (digitalRead(BUTTON3_PIN) == LOW && !button3Pressed) {
button3Pressed = true;
led3State = !led3State;
digitalWrite(LED3_PIN, led3State);
if (client.connected()) {
client.publish(SUBTOPIC_LED3, led3State ? "1" : "0");
}
Serial.println("Button 3 pressed - LED3: " + String(led3State ? "ON" : "OFF"));
}
if (digitalRead(BUTTON3_PIN) == HIGH) {
button3Pressed = false;
}
// Button 4
if (digitalRead(BUTTON4_PIN) == LOW && !button4Pressed) {
button4Pressed = true;
led4State = !led4State;
digitalWrite(LED4_PIN, led4State);
if (client.connected()) {
client.publish(SUBTOPIC_LED4, led4State ? "1" : "0");
}
Serial.println("Button 4 pressed - LED4: " + String(led4State ? "ON" : "OFF"));
}
if (digitalRead(BUTTON4_PIN) == HIGH) {
button4Pressed = false;
}
delay(10); // Small delay untuk stabilitas
}Led : 1 - 2 - 3 - 4