#include <WiFi.h>
#include <ThingsBoard.h>
#include "DHTesp.h"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define TOKEN "wza1n00omc7yq66merlp"
#define THINGSBOARD_SERVER "thingsboard.cloud"
#define DHT_PIN 15
#define LED_PIN 13
WiFiClient espClient;
ThingsBoard tb(espClient);
DHTesp dhtSensor;
bool ledState = false;
unsigned long lastSend = 0;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
Serial.println("Connecting to WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
Serial.println(WiFi.localIP());
}
void loop() {
// Reconnect to WiFi if disconnected
if (WiFi.status() != WL_CONNECTED) {
reconnectWiFi();
}
// Connect to ThingsBoard if disconnected
if (!tb.connected()) {
Serial.println("Connecting to ThingsBoard...");
if (tb.connect(THINGSBOARD_SERVER, TOKEN)) {
Serial.println("Connected to ThingsBoard!");
tb.RPC_Subscribe(handleRPC); // subscribe ke RPC
} else {
Serial.println("Failed to connect to ThingsBoard!");
delay(3000);
return;
}
}
// Kirim data setiap 10 detik
if (millis() - lastSend > 10000) {
sendSensorData();
lastSend = millis();
}
tb.loop(); // proses RPC dari ThingsBoard
}
// ========== Fungsi untuk mengirim data sensor ==========
void sendSensorData() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.print("Temperature: ");
Serial.print(data.temperature);
Serial.print(" °C, Humidity: ");
Serial.print(data.humidity);
Serial.println(" %");
tb.sendTelemetryFloat("temperature", data.temperature);
tb.sendTelemetryFloat("humidity", data.humidity);
tb.sendTelemetryBool("LED_state", ledState);
// LED otomatis menyala kalau suhu ekstrem
if (data.temperature > 35 || data.temperature < 12 || data.humidity > 70 || data.humidity < 40) {
digitalWrite(LED_PIN, HIGH);
ledState = true;
} else {
digitalWrite(LED_PIN, ledState ? HIGH : LOW); // biar manual tetap dihormati
}
}
// ========== Fungsi untuk reconnect WiFi ==========
void reconnectWiFi() {
Serial.println("Reconnecting WiFi...");
WiFi.disconnect();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nReconnected!");
}
// ========== Fungsi RPC (kontrol dari ThingsBoard) ==========
RPC_Response handleRPC(const RPC_Data &data) {
String methodName = data.getMethodName();
Serial.println("RPC call: " + methodName);
if (methodName == "setLED") {
bool state = data.getParameter("value").as<bool>();
digitalWrite(LED_PIN, state ? HIGH : LOW);
ledState = state;
Serial.println(String("LED set to: ") + (state ? "ON" : "OFF"));
return RPC_Response("LED_state", ledState);
}
return RPC_Response("error", "Unknown method");
}