#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <LiquidCrystal_I2C.h>
#define WIFI_AP "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define TOKEN "monitoringkipasangin"
#define DHT_PIN 15
#define RELAY_PIN 17
#define DHTTYPE DHT22
char thingsboardServer[] = "thingsboard.cloud";
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
DHT dht(DHT_PIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
int status = WL_IDLE_STATUS;
unsigned long lastSend;
void setup() {
Serial.begin(115200);
dht.begin();
delay(10);
InitWiFi();
mqttClient.setServer(thingsboardServer, 1883);
lastSend = 0;
pinMode(RELAY_PIN, OUTPUT);
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temperature:");
}
/////
void loop() {
if (!mqttClient.connected()) {
reconnect();
}
if (millis() - lastSend > 1000) { // Update dan kirim tiap 1 detik
kirimDataKeThingsboard();
lastSend = millis();
}
mqttClient.loop();
delay(2000);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" C, Humidity: ");
Serial.print(humidity);
Serial.println(" %");
lcd.setCursor(12, 0);
lcd.print(temperature);
if (temperature <= 37.0) {
Serial.println("Dingin, lampu nyala...");
digitalWrite(RELAY_PIN, HIGH);
lcd.setCursor(0, 3);
lcd.print("Light: ON ");
}
else if (temperature >= 39.0) {
Serial.println("Panas, Lampu Mati...");
digitalWrite(RELAY_PIN, LOW);
lcd.setCursor(0, 3);
lcd.print("Light: OFF ");
}
}
//////
void kirimDataKeThingsboard()
{
Serial.println("Mengambil data sensor");
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
int relayStatus = digitalRead(RELAY_PIN); // Membaca status lampu
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Gagal membaca sensor DHT!");
return;
}
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" °C\t");
Serial.print("Light Status: ");
Serial.println(relayStatus);
String relayStatusString; // Variabel untuk menyimpan status lampu sebagai string
// Konversi nilai relayStatus ke string "nyala" atau "mati"
if (relayStatus == 1) {
relayStatusString = "ON";
} else if (relayStatus == 0) {
relayStatusString = "OFF";
} else {
relayStatusString = "tidak valid"; // Jika nilai relayStatus tidak valid
}
// Membuat JSON Object
StaticJsonDocument<200> jsonBuffer;
jsonBuffer["temperature"] = temperature;
jsonBuffer["humidity"] = humidity;
jsonBuffer["light_status"] = relayStatusString; // Menambahkan status lampu sebagai string
char JSONmessageBuffer[100];
serializeJson(jsonBuffer, JSONmessageBuffer);
mqttClient.publish("v1/devices/me/telemetry", JSONmessageBuffer);
}
/////
void InitWiFi()
{
Serial.println("Menghubungkan ...");
WiFi.begin(WIFI_AP, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Berhasil terhubung!");
}
//////
void reconnect() {
while (!mqttClient.connected()) {
Serial.print("Menghubungkan ke ThingsBoard server...");
// Menggunakan token sebagai ID klien MQTT
if (mqttClient.connect("DHTClientID", TOKEN, NULL)) {
Serial.println("[BERHASIL]");
} else {
Serial.print("[GAGAL] [ rc = ");
Serial.print(mqttClient.state());
Serial.println(" ] [Coba lagi dalam 5 detik]");
// Tunggu 5 detik sebelum mencoba lagi
delay(5000);
}
}
}