/******************************************************
* Project Name : Project IOT Platform kelas X
* Group Members :
* - Henrie Lapu (6022241085)
* - Kennedy (6022241009)
* - Suandronikus Hande (6022241078)
* - Bagus Handoko (6022241034)
******************************************************/
#include <DHTesp.h>
#include <WiFi.h>
#include <ThingsBoard.h>
#include <Arduino_MQTT_Client.h>
#include <ArduinoJson.h>
#define pinDht 15
DHTesp dhtSensor;
// Data WiFi Wokwi
#define WIFI_AP "Wokwi-GUEST"
#define WIFI_PASS ""
#define TB_SERVER "thingsboard.cloud"
#define TOKEN "quK042qguvflxFmQ8JW0"
// Ukuran maksimum pesan MQTT
constexpr uint16_t MAX_MESSAGE_SIZE = 512U;
// Inisialisasi koneksi MQTT dan ThingsBoard
WiFiClient espClient;
Arduino_MQTT_Client mqttClient(espClient);
ThingsBoard tb(mqttClient, MAX_MESSAGE_SIZE);
void connectToWiFi() {
Serial.println("Connecting to WiFi...");
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
WiFi.begin(WIFI_AP, WIFI_PASS, 6);
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nConnected to WiFi!");
} else {
Serial.println("\nFailed to connect to WiFi.");
}
}
// Fungsi koneksi ke ThingsBoard
void connectToThingsBoard() {
if (!tb.connected()) {
Serial.println("Connecting to ThingsBoard server...");
if (!tb.connect(TB_SERVER, TOKEN)) {
Serial.println("Failed to connect to ThingsBoard!");
} else {
Serial.println("Connected to ThingsBoard");
}
}
}
void sendDataToThingsBoard(float temp, int hum) {
StaticJsonDocument<512> doc;
doc["temperature"] = temp;
doc["humidity"] = hum;
size_t jsonSize = measureJson(doc); // ukur panjang JSON
tb.sendTelemetryJson(doc, jsonSize); // gunakan dua argumen sesuai yang diminta
Serial.println("Data sent");
}
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
dhtSensor.setup(pinDht, DHTesp::DHT22);
connectToWiFi(); // Panggil fungsi koneksi WiFi
connectToThingsBoard();
}
bool wifiWasConnected = false;
void loop() {
// Jika WiFi putus, sambungkan kembali
if (WiFi.status() != WL_CONNECTED) {
connectToWiFi();
wifiWasConnected = false;
}
// Jika WiFi baru saja reconnect → reset MQTT
if (!wifiWasConnected && WiFi.status() == WL_CONNECTED) {
Serial.println("WiFi reconnected. Reconnecting to ThingsBoard...");
tb.disconnect(); // tambahkan ini
connectToThingsBoard(); // paksa koneksi ulang
wifiWasConnected = true;
}
// Cek koneksi MQTT sebelum kirim data
if (!tb.connected()) {
connectToThingsBoard();
}
// Baca data sensor
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float temp = data.temperature;
int hum = data.humidity;
// Tampilkan ke Serial Monitor di Wokwi
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print(" °C | Humidity: ");
Serial.print(hum);
Serial.println(" %");
// Kirim ke ThingsBoard
sendDataToThingsBoard(temp, hum);
tb.loop(); // jaga koneksi tetap hidup
delay(5000);
}