#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "3note"; // Ganti dengan nama SSID WiFi kamu
const char* password = "mastin85"; // Ganti dengan password WiFi kamu
const int sensorPin = 33; // Pin sensor fotolistrik
const int pirPin = 32; // Pin sensor gerak PIR
const int relayPin = 2; // Pin kontrol relay
const int ledPin = 13; // Pin kontrol LED dengan PWM
const float R = 10.0; // Resistance value of LDR (in kΩ)
const int threshold = 500; // Nilai threshold untuk mendeteksi cahaya
const float calibrationFactor = 1.2; // Faktor kalibrasi sensor
const int pwmMax = 255; // Nilai PWM maksimal
const int pwmHalf = 127; // Nilai PWM setengah
unsigned long previousMillis = 0; // Penyimpanan waktu sebelumnya
const long interval = 30000; // Interval waktu 30 detik
void setup() {
pinMode(sensorPin, INPUT); // Set pin sensor sebagai input
pinMode(pirPin, INPUT); // Set pin PIR sebagai input
pinMode(relayPin, OUTPUT); // Set pin kontrol relay sebagai output
pinMode(ledPin, OUTPUT); // Set pin kontrol LED sebagai output
Serial.begin(115200); // Inisialisasi serial monitor
// Set PWM awal ke setengah nilai
analogWrite(ledPin, pwmHalf);
Serial.println("Initial PWM set to Half");
// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
// Baca nilai sensor fotolistrik (cahaya sekitar)
int sensorValue = analogRead(sensorPin);
float voltage = sensorValue * (3.3 / 4095.0); // Konversi nilai sensor ke tegangan (untuk ESP32 dengan resolusi ADC 12-bit)
float lux = (voltage * 1000) / (0.01 * R); // Hitung nilai lux berdasarkan rumus
lux = lux * calibrationFactor; // Terapkan faktor kalibrasi
// Kontrol relay berdasarkan nilai sensor fotolistrik (cahaya sekitar)
if (sensorValue > threshold) { // Jika sensor fotolistrik mendeteksi cahaya terang
digitalWrite(relayPin, LOW); // Matikan relay
Serial.print("Lux: ");
Serial.print(lux);
Serial.println(" - Relay OFF");
} else { // Jika sensor fotolistrik mendeteksi cahaya redup
digitalWrite(relayPin, HIGH); // Nyalakan relay
Serial.print("Lux: ");
Serial.print(lux);
Serial.println(" - Relay ON");
}
// Baca nilai sensor gerak PIR
int pirValue = digitalRead(pirPin);
unsigned long currentMillis = millis();
if (pirValue == HIGH) { // Jika sensor PIR mendeteksi gerakan
previousMillis = currentMillis; // Reset waktu
analogWrite(ledPin, pwmMax); // Atur PWM ke nilai maksimal
Serial.println("Motion detected - PWM Max");
}
// Hitung waktu yang tersisa sampai PWM turun setengahnya
unsigned long timeLeft = (previousMillis + interval) - currentMillis;
// Jika tidak ada gerakan selama lebih dari 30 detik
if (currentMillis - previousMillis >= interval) {
analogWrite(ledPin, pwmHalf); // Atur PWM ke setengah nilai
Serial.println("No motion - PWM Half");
} else {
// Tampilkan waktu yang tersisa pada serial monitor
Serial.print("Time left: ");
Serial.print(timeLeft / 1000); // Konversi milidetik ke detik
Serial.println(" seconds");
}
// Indikasi status PWM sebelum dan sesudah mendeteksi gerakan
Serial.print("Current PWM: ");
if (pirValue == HIGH) {
Serial.println(pwmMax);
} else if (currentMillis - previousMillis >= interval) {
Serial.println(pwmHalf);
} else {
Serial.println(pwmMax);
}
// Kirim data ke server XAMPP
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String serverPath = "http://192.168.1.100/iot_project/data_receiver.php?lux=" + String(lux) + "&pwm=" + String((pirValue == HIGH || (currentMillis - previousMillis < interval)) ? pwmMax : pwmHalf);
http.begin(serverPath.c_str());
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println(httpResponseCode);
Serial.println(response);
} else {
Serial.print("Error on sending GET request: ");
Serial.println(httpResponseCode);
}
http.end();
}
delay(500); // Tunggu 100 milidetik sebelum melakukan pengukuran ulang
}