#include "DHT.h"
#include <WiFi.h>
#include <PubSubClient.h>
// WiFi
#define WIFI_AP "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Token ThingsBoard
#define TOKEN "wza1n00omc7yq66merlp"
// Server ThingsBoard
const char* THINGSBOARD_SERVER = "thingsboard.cloud";
// DHT
#define DHTPIN 15
#define DHTTYPE DHT22
// LED
#define LED_PIN 13
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
unsigned long lastSend = 0;
bool ledState = false;
// --- Deklarasi fungsi ---
void InitWiFi();
void reconnect();
void kirimDataKeThingsboard();
void callback(char* topic, byte* payload, unsigned int length);
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
InitWiFi();
client.setServer(THINGSBOARD_SERVER, 1883);
client.setCallback(callback);
reconnect();
Serial.println("Setup selesai, siap menerima RPC!");
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if (millis() - lastSend > 10000) {
kirimDataKeThingsboard();
lastSend = millis();
}
}
// --- Kirim data sensor ---
void kirimDataKeThingsboard() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Gagal membaca sensor DHT!");
return;
}
String payload = "{\"temperature\":";
payload += String(temperature, 2);
payload += ",\"humidity\":";
payload += String(humidity, 2);
payload += ",\"LED_state\":";
payload += (ledState ? "true" : "false");
payload += "}";
Serial.println("Mengirim data: " + payload);
client.publish("v1/devices/me/telemetry", payload.c_str());
}
// --- Callback untuk menerima RPC dari ThingsBoard ---
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Pesan RPC diterima di topic: ");
Serial.println(topic);
String message;
for (unsigned int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println("Isi pesan: " + message);
// Contoh payload: {"method":"setLED","params":true}
if (message.indexOf("\"setLED\"") != -1) {
bool state = message.indexOf("true") != -1;
ledState = state;
digitalWrite(LED_PIN, ledState ? HIGH : LOW);
Serial.println(ledState ? "LED dinyalakan!" : "LED dimatikan!");
// Kirim status balik
String response = "{\"LED_state\":";
response += (ledState ? "true" : "false");
response += "}";
client.publish("v1/devices/me/telemetry", response.c_str());
}
}
// --- Koneksi WiFi ---
void InitWiFi() {
Serial.println("Menghubungkan ke WiFi...");
WiFi.begin(WIFI_AP, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi tersambung!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
// --- Reconnect ThingsBoard ---
void reconnect() {
while (!client.connected()) {
Serial.print("Menghubungkan ke ThingsBoard...");
if (client.connect("ESP32_Device", TOKEN, NULL)) {
Serial.println(" [TERHUBUNG]");
// Subscribe ke RPC request
client.subscribe("v1/devices/me/rpc/request/+");
} else {
Serial.print(" [GAGAL], rc=");
Serial.print(client.state());
Serial.println(" retry dalam 5 detik...");
delay(5000);
}
}
}