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.

Board: ESP323 komponen

Komponen yang dipakai

  • ESP32
  • Breadboard (setengah)
  • LED
  • Resistor

Cara kerja

  1. ESP32 terhubung ke WiFi, lalu ke broker MQTT virtual di broker.noviot.local port 1883.
  2. Program berlangganan (subscribe) topik noviot/lampu dan menyiapkan fungsi callback untuk pesan masuk.
  3. Pesan ON atau OFF pada topik lampu menyalakan atau mematikan LED di GPIO2.
  4. Setiap 2 detik (diatur millis(), bukan delay) program menerbitkan (publish) nilai suhu ke topik noviot/suhu.

Konsep yang dipelajari

MQTT publish dan subscribeTopik dan broker MQTTPustaka PubSubClientPengiriman berkala dengan millis()

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);
  }
}

Template ESP32 lainnya