#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include "RTClib.h"
// Konfigurasi WiFi
String wifiSSID = "Wokwi-GUEST";
String wifiPassword = "";
// Konfigurasi ThingsBoard
String tbHost = "thingsboard.cloud";
String tbToken = "onnFMLVrYjgtmIHJnsYJ";
// Pin LDR, Lampu, PIR dan variabel kalkulasi
#define ldrPin 34
#define lampPin 13 // Ganti dengan pin yang sesuai untuk lampu LED utama
#define pirPin 12 // Pin untuk sensor PIR
#define lampPinPIR 14 // Pin untuk lampu LED yang dikendalikan oleh PIR
const float gama = 0.7;
const float rl10 = 50;
// Asumsi konsumsi daya dalam watt
const float lampPower = 5.0; // Konsumsi daya lampu LED utama (misal 5W)
const float pirLampPower = 2.0; // Konsumsi daya lampu LED yang dikendalikan oleh PIR (misal 2W)
const float pirSensorPower = 0.06; // Konsumsi daya sensor PIR (misal 60mW)
const float ldrSensorPower = 0.01; // Konsumsi daya sensor LDR (misal 10mW)
// RTC instance
RTC_DS3231 rtc;
void connectWifi() {
WiFi.begin(wifiSSID.c_str(), wifiPassword.c_str());
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
}
void sendDataToThingsBoard(String kecerahan, String komentar, String statusPIR, float dayaTotal, String musim) {
HTTPClient http;
String url = "http://" + tbHost + "/api/v1/" + tbToken + "/telemetry";
String payload = "{\"kecerahan\":" + kecerahan + ",\"komentar\":\"" + komentar + "\",\"statusPIR\":\"" + statusPIR + "\",\"dayaTotal\":" + String(dayaTotal) + ",\"musim\":\"" + musim + "\"}";
http.begin(url);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.println("Data sent to ThingsBoard successfully");
} else {
Serial.println("Error sending data to ThingsBoard");
}
http.end();
}
void setup() {
Serial.begin(115200);
connectWifi();
pinMode(lampPin, OUTPUT); // Set lampPin sebagai OUTPUT
pinMode(pirPin, INPUT); // Set pirPin sebagai INPUT
pinMode(lampPinPIR, OUTPUT); // Set lampPinPIR sebagai OUTPUT
// Initialize RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
// Set the time to the current time (e.g., time when code was compiled)
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
// Get the current time
DateTime now = rtc.now();
// Adjust lighting system based on time and season
bool isDrySeason = (now.month() >= 5 && now.month() <= 10); // May to October
String musim = isDrySeason ? "Musim kemarau" : "Musim hujan";
int nilaiLDR = analogRead(ldrPin);
nilaiLDR = map(nilaiLDR, 4095, 0, 1024, 0); // Mengubah nilai pembacaan sensor LDR dari nilai ADC arduino menjadi nilai ADC ESP32
float voltase = nilaiLDR / 1024.0 * 5;
float resistansi = 2000 * voltase / (1 - voltase / 5);
float kecerahan = pow(rl10 * 1e3 * pow(10, gama) / resistansi, (1 / gama));
Serial.print("Kecerahan = ");
Serial.println(kecerahan);
String kecerahan1 = String(kecerahan, 2);
String komentar;
// Menentukan komentar dan mengontrol lampu LED berdasarkan nilai kecerahan
bool lampStatus = false;
bool pirLampStatus = false;
if (kecerahan < 5) {
komentar = "Gelap";
digitalWrite(lampPin, HIGH); // Nyalakan lampu LED utama
lampStatus = true;
} else if (kecerahan <= 15) {
komentar = "Kecerahan normal";
digitalWrite(lampPin, LOW); // Matikan lampu LED utama
} else if (kecerahan > 15) {
komentar = "Tingkat kecerahan tinggi";
digitalWrite(lampPin, LOW); // Matikan lampu LED utama
}
// Membaca status PIR
int pirValue = digitalRead(pirPin);
String statusPIR;
if (pirValue == HIGH) {
statusPIR = "Gerakan terdeteksi";
digitalWrite(lampPinPIR, HIGH); // Nyalakan lampu LED yang dikendalikan oleh PIR
pirLampStatus = true;
} else {
statusPIR = "Tidak ada gerakan";
digitalWrite(lampPinPIR, LOW); // Matikan lampu LED yang dikendalikan oleh PIR
}
Serial.println("Komentar: " + komentar);
Serial.println("Status PIR: " + statusPIR);
Serial.println("Musim saat ini: " + musim);
// Menghitung daya total yang digunakan
float dayaTotal = ldrSensorPower + pirSensorPower; // Konsumsi daya sensor
if (lampStatus) {
dayaTotal += lampPower;
}
if (pirLampStatus) {
dayaTotal += pirLampPower;
}
Serial.print("Daya total yang digunakan: ");
Serial.println(dayaTotal);
// Mengirim data ke ThingsBoard
sendDataToThingsBoard(kecerahan1, komentar, statusPIR, dayaTotal, musim);
delay(1000); // Tunggu 1 detik
}