Cara Mengirim Suhu dan Kelembapan ESP32 ke MQTT — Simulasi Online
Di proyek IoT sungguhan, data sensor dikirim ke server untuk dipantau sebagai grafik. Template ini menirunya: ESP32 menerbitkan suhu ke topik noviot/suhu dan kelembapan ke noviot/kelembapan setiap 2 detik, dan hasilnya digambar di tab Dashboard IoT.
Komponen yang dipakai
- ESP32
- Breadboard (setengah)
- LED
- Resistor
Cara kerja
- ESP32 terhubung ke WiFi lalu ke broker MQTT virtual broker.noviot.local port 1883.
- Setiap 2 detik (dijadwalkan dengan millis()) nilai suhu dan kelembapan simulasi berubah sedikit.
- Kedua nilai diterbitkan (publish) ke topiknya masing-masing; LED GPIO2 berkedip singkat tanda pengiriman.
- Buka tab Dashboard IoT untuk melihat grafik suhu dan kelembapan yang terus bergerak.
Konsep yang dipelajari
Kode program
#include <WiFi.h>
#include <PubSubClient.h>
#define WIFI_SSID "NOVIOT"
#define WIFI_PASSWORD "12345678"
// Broker MQTT virtual NOVIOT (tab MQTT di samping editor).
const char* MQTT_SERVER = "broker.noviot.local";
const int MQTT_PORT = 1883;
const char* TOPIK_SUHU = "noviot/suhu";
const char* TOPIK_LEMBAP = "noviot/kelembapan";
const int LED_AKTIVITAS = 2;
WiFiClient espClient;
PubSubClient client(espClient);
// Dua nilai sensor disimulasikan: berubah perlahan seperti ruangan asli.
int suhu = 28;
int kelembapan = 60;
int arah = 1;
unsigned long terakhirKirim = 0;
void setup() {
Serial.begin(115200);
pinMode(LED_AKTIVITAS, 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);
}
void loop() {
if (!client.connected()) {
Serial.print("Menghubungkan ke broker MQTT... ");
if (client.connect("noviot-iklim")) {
Serial.println("Terhubung!");
} else {
Serial.println("gagal, coba lagi 1 detik...");
delay(1000);
return;
}
}
client.loop();
if (millis() - terakhirKirim >= 2000) {
terakhirKirim = millis();
suhu += arah;
if (suhu >= 34) arah = -1;
if (suhu <= 28) arah = 1;
kelembapan += (arah > 0 ? -2 : 2);
if (kelembapan > 72) kelembapan = 72;
if (kelembapan < 54) kelembapan = 54;
// LED berkedip singkat setiap kali data dikirim.
digitalWrite(LED_AKTIVITAS, HIGH);
client.publish(TOPIK_SUHU, String(suhu).c_str());
client.publish(TOPIK_LEMBAP, String(kelembapan).c_str());
digitalWrite(LED_AKTIVITAS, LOW);
Serial.print("Publish: suhu=");
Serial.print(suhu);
Serial.print(" C, kelembapan=");
Serial.print(kelembapan);
Serial.println(" %");
Serial.println("Lihat grafiknya di tab Dashboard IoT!");
}
}