Cara Menggunakan MQTT di ESP32 — Simulasi Online
MQTT adalah protokol kirim-terima pesan ringan untuk perangkat IoT. Di template ini ESP32 mengirim data suhu ke topik noviot/suhu setiap 2 detik, dan LED di GPIO2 bisa dinyalakan dari tab MQTT lewat topik noviot/lampu.
Komponen yang dipakai
- ESP32
- Breadboard (setengah)
- LED
- Resistor
Cara kerja
- ESP32 terhubung ke WiFi, lalu ke broker MQTT virtual di broker.noviot.local port 1883.
- Program berlangganan (subscribe) topik noviot/lampu dan menyiapkan fungsi callback untuk pesan masuk.
- Pesan ON atau OFF pada topik lampu menyalakan atau mematikan LED di GPIO2.
- Setiap 2 detik (diatur millis(), bukan delay) program menerbitkan (publish) nilai suhu ke topik noviot/suhu.
Konsep yang dipelajari
Kode program
#include <WiFi.h>
#include <PubSubClient.h>
#define WIFI_SSID "NOVIOT"
#define WIFI_PASSWORD "12345678"
// Broker MQTT virtual NOVIOT: alamat ini tidak perlu diganti.
// "Broker"-nya adalah tab MQTT yang muncul di samping editor saat simulasi jalan.
const char* MQTT_SERVER = "broker.noviot.local";
const int MQTT_PORT = 1883;
const char* TOPIK_SUHU = "noviot/suhu";
const char* TOPIK_LAMPU = "noviot/lampu";
const int LED_LAMPU = 2;
WiFiClient espClient;
PubSubClient client(espClient);
int suhu = 28;
unsigned long terakhirKirim = 0;
// Dipanggil setiap ada pesan masuk di topik yang di-subscribe.
void callback(char* topic, byte* payload, unsigned int length) {
String pesan;
for (unsigned int i = 0; i < length; i++) {
pesan += (char)payload[i];
}
Serial.print("Pesan masuk [");
Serial.print(topic);
Serial.print("]: ");
Serial.println(pesan);
if (String(topic) == TOPIK_LAMPU) {
if (pesan == "ON") {
digitalWrite(LED_LAMPU, HIGH);
Serial.println("Lampu dinyalakan dari MQTT");
} else if (pesan == "OFF") {
digitalWrite(LED_LAMPU, LOW);
Serial.println("Lampu dimatikan dari MQTT");
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_LAMPU, OUTPUT);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Menghubungkan ke WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Terhubung!");
client.setServer(MQTT_SERVER, MQTT_PORT);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
Serial.print("Menghubungkan ke broker MQTT... ");
if (client.connect("noviot-esp32")) {
Serial.println("Terhubung!");
client.subscribe(TOPIK_LAMPU);
Serial.print("Subscribe ke topik: ");
Serial.println(TOPIK_LAMPU);
} else {
Serial.println("gagal, coba lagi 1 detik...");
delay(1000);
return;
}
}
client.loop();
// Kirim contoh data suhu setiap 2 detik.
if (millis() - terakhirKirim >= 2000) {
terakhirKirim = millis();
suhu += 1;
if (suhu > 34) suhu = 28;
client.publish(TOPIK_SUHU, String(suhu).c_str());
Serial.print("Publish suhu: ");
Serial.println(suhu);
}
}