#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <ArduinoJson.h>
// Konfigurasi WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Konfigurasi MQTT Broker
const char* mqtt_server = "mqttmuti.sija-bridge.tech";
const int mqtt_port = 1808; // Port MQTT standar
// Topik MQTT
const char* mqttTopic = "naufel/device"; // Topik untuk mengirim data suhu dan status LED
const char* mqttControlTopic = "naufel/control"; // Topik untuk mengontrol sensor dan LED
// Konfigurasi Sensor DHT
#define DHTPIN 4 // Pin untuk sensor DHT22
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
// Ambang batas suhu
const float temperatureThreshold = 30.0; // Ganti sesuai kebutuhan
bool sensorActive = true; // Status aktif/mati sensor
// Callback function for MQTT messages
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// Handling control messages from the "naufel/control" topic
if (String(topic) == mqttControlTopic) {
if (messageTemp == "ON") {
sensorActive = true; // Mengaktifkan sensor
digitalWrite(2, HIGH); // Menyalakan LED
} else if (messageTemp == "OFF") {
sensorActive = false; // Mematikan sensor
digitalWrite(2, LOW); // Mematikan LED
}
}
}
void setup() {
Serial.begin(115200);
// Inisialisasi sensor DHT
dht.begin();
// Inisialisasi LED
pinMode(2, OUTPUT);
// Koneksi ke WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Koneksi ke MQTT Broker
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback); // Set the callback function
reconnect(); // Initial connection attempt
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if (sensorActive) {
// Baca suhu dari sensor
float temperature = dht.readTemperature();
if (!isnan(temperature)) {
// Membuat objek JSON untuk data suhu dan status LED
StaticJsonDocument<200> doc;
doc["temperature"] = temperature;
doc["led"] = (temperature > temperatureThreshold) ? "ON" : "OFF";
// Mengubah JSON menjadi string
char jsonBuffer[512];
serializeJson(doc, jsonBuffer);
// Kirim data suhu dalam format JSON ke MQTT Broker
client.publish(mqttTopic, jsonBuffer);
Serial.print("Temperature: ");
Serial.println(jsonBuffer);
// Periksa apakah suhu melebihi ambang batas
if (temperature > temperatureThreshold) {
digitalWrite(2, HIGH); // Nyalakan LED
} else {
digitalWrite(2, LOW); // Matikan LED
}
} else {
Serial.println("Failed to read from DHT sensor!");
}
}
delay(5000); // Tunggu 5 detik sebelum mengirim data berikutnya
}
void reconnect() {
// Loop sampai koneksi kembali
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("connected");
// Subscribe to control topic after reconnecting
client.subscribe(mqttControlTopic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000); // Longer delay between connection attempts
}
}
}