#include <WiFi.h>
#include <PubSubClient.h>
#include <math.h> // Diperlukan untuk fungsi pow()
#include <DHT.h> // Tambahkan pustaka untuk sensor DHT
// Pin definitions
#define LDR_PIN 34 // Pin untuk LDR
#define PIR_PIN 33 // Pin untuk PIR
#define RELAY_PIN 25 // Pin untuk Relay (mengontrol lampu)
#define LED_PIN 26 // Pin untuk LED sebagai indikator tambahan
#define CURRENT_SENSOR_PIN 36 // Pin untuk sensor arus (ACS712)
#define DHT_PIN 32 // Pin untuk sensor DHT
#define DHT_TYPE DHT22 // Tipe sensor DHT (DHT11 atau DHT22)
// Constants
int pirState = 0;
const float voltageSupply = 5.0; // Tegangan suplai LDR
const float rKnown = 2000.0; // Resistansi fixed resistor dalam ohm
const float voltage = 230.0; // Tegangan AC (asumsi 230V)
// DHT setup
DHT dht(DHT_PIN, DHT_TYPE);
// WiFi and MQTT Server details
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define TOKEN "HzoJ1a8RGDLtiFV14gxu" // Ganti dengan token asli Anda
#define THINGSBOARD_SERVER "thingsboard.cloud" // Ganti dengan alamat server ThingsBoard Anda
#define THINGSBOARD_PORT 1883 // Port default untuk MQTT non-SSL
const char* ssid = WIFI_SSID;
const char* password = WIFI_PASSWORD;
WiFiClient wifiClient;
PubSubClient client(wifiClient);
// Fungsi untuk setup WiFi
void setup_wifi() {
delay(10);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected");
}
// Fungsi untuk reconnect ke server MQTT
void reconnect() {
while (!client.connected()) {
Serial.println("Connecting to ThingsBoard...");
if (client.connect("ESP32", TOKEN, NULL)) {
Serial.println("Connected to ThingsBoard");
} else {
Serial.print("Failed to connect, rc=");
Serial.print(client.state());
delay(5000);
}
}
}
// Fungsi untuk membaca arus dari ACS712
float readCurrent() {
int sensorValue = analogRead(CURRENT_SENSOR_PIN);
float voltageReading = (sensorValue / 4095.0) * 5.0; // Sensor output in volts
float current = (voltageReading - 2.5) / 0.185; // Adjust this according to your sensor (e.g., ACS712-5A uses 0.185V per A)
return current;
}
// Fungsi untuk menghitung daya
float calculatePower(float current) {
return voltage * current; // Power in watts (W)
}
// Fungsi untuk menghitung lux dari LDR
float calculateLDRLux() {
// Baca nilai analog dari LDR
int analogValue = analogRead(LDR_PIN);
// Menghitung tegangan keluaran sensor
float voltageLDR = analogValue / 4096.0 * voltageSupply;
// Menghitung resistansi LDR
float resistance = rKnown * voltageLDR / (voltageSupply - voltageLDR);
// Menghitung lux dari resistansi menggunakan rumus eksponensial
float lux = pow((50.0 * 1e3 * pow(10, 0.7) / resistance), (1 / 0.7));
return lux;
}
// Fungsi untuk membaca suhu dari sensor DHT
float readTemperature() {
float temperature = dht.readTemperature();
if (isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
sendSystemAlert("DHT Sensor Failure"); // Mengirimkan alert ke ThingsBoard
return -999; // Return an error value
}
return temperature;
}
// Fungsi untuk mengirim notifikasi ke ThingsBoard
void sendSystemAlert(String message) {
String alertPayload = "{";
alertPayload += "\"alert\":\"";
alertPayload += message;
alertPayload += "\"}";
Serial.println("Sending alert: " + alertPayload);
client.publish("v1/devices/me/telemetry", alertPayload.c_str());
}
void setup() {
// Setup serial, WiFi, MQTT
Serial.begin(115200);
setup_wifi();
client.setServer(THINGSBOARD_SERVER, THINGSBOARD_PORT);
// Setup pin mode
pinMode(LDR_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(CURRENT_SENSOR_PIN, INPUT);
// Inisialisasi DHT sensor
dht.begin();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Baca nilai dari PIR
pirState = digitalRead(PIR_PIN);
// Hitung nilai lux dari LDR
float lux = calculateLDRLux();
// Baca arus dari sensor ACS712
float current = readCurrent();
float power = calculatePower(current); // Calculate power in watts
// Baca suhu dari sensor DHT
float temperature = readTemperature();
// Menentukan siang atau malam berdasarkan kombinasi suhu dan intensitas cahaya
String timeOfDay = "Unknown"; // Default jika belum ada status yang sesuai
if (temperature > 25.0 && lux >= 3000) {
timeOfDay = "Day"; // Siang
} else if (temperature <= 25.0 && lux <= 3000) {
timeOfDay = "Night"; // Malam
}
// Kontrol lampu: nyalakan jika kondisi malam, suhu rendah, dan lux rendah
if (timeOfDay == "Night" && temperature <= 25.0 && lux <= 3000) {
digitalWrite(RELAY_PIN, HIGH); // Nyalakan lampu (relay aktif rendah)
digitalWrite(LED_PIN, LOW); // Nyalakan LED sebagai indikator
} else {
// Jika kondisi siang atau status tidak diketahui, matikan lampu
digitalWrite(RELAY_PIN, LOW); // Matikan lampu (relay aktif rendah)
digitalWrite(LED_PIN, HIGH); // Matikan LED
}
// Kirim data ke ThingsBoard
String payload = "{";
payload += "\"lux\":"; payload += lux; payload += ",";
payload += "\"pir\":"; payload += pirState; payload += ",";
payload += "\"current\":"; payload += current; payload += ",";
payload += "\"power\":"; payload += power; payload += ",";
payload += "\"temperature\":"; payload += temperature; payload += ",";
payload += "\"time_of_day\":\""; payload += timeOfDay; payload += "\"";
payload += "}";
Serial.println("Sending payload: " + payload);
client.publish("v1/devices/me/telemetry", payload.c_str());
delay(1000); // Kirim data setiap 1 detik
}