The circuit in question is designed to interface an ESP8266 NodeMCU microcontroller with a set of sensors and actuators to create a smart lighting system. The system uses a PIR motion sensor to detect movement and a photocell (LDR) to measure ambient light levels. Depending on these inputs, a blue LED is controlled to illuminate an area when motion is detected in low light conditions. The ESP8266 NodeMCU is also programmed to connect to a WiFi network and send sensor data to a specified server API.
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
int ldrPin = A0; // Pin LDR
int pirPin = D5; // Pin PIR sensor
int ledPin = D2; // Pin untuk LED
int ldrThreshold = 5; // Kalibrasi ambang batas terang
int pirState = LOW; // Status PIR (LOW = tidak ada gerakan, HIGH = ada gerakan)
unsigned long pirLastTriggered = 0; // Waktu terakhir PIR mendeteksi gerakan
unsigned long pirDelay = 2500; // Delay 2.5 detik untuk PIR
const char* ssid = "cm@wifi.id"; // Ganti dengan SSID Wi-Fi
const char* password = "Admin#123"; // Ganti dengan password Wi-Fi
const char* serverName = "http://192.168.100.4/IOT_API/api.php"; // Ganti dengan alamat server API lokal
WiFiClient client;
int lastLedStatus = LOW; // Variabel untuk menyimpan status LED sebelumnya
void setup() {
pinMode(ledPin, OUTPUT); // Mengatur pin LED sebagai output
pinMode(pirPin, INPUT); // Mengatur pin PIR sebagai input
Serial.begin(115200); // Memulai komunikasi serial dengan baud rate 115200
// Menghubungkan ke WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
// Membaca nilai dari LDR
int ldrValue = analogRead(ldrPin);
Serial.print("LDR Value: ");
Serial.println(ldrValue);
// Membaca status dari PIR sensor
pirState = digitalRead(pirPin);
// Jika ruangan terang, matikan LED dan abaikan PIR
if (ldrValue <= ldrThreshold) { // Ruangan terang
digitalWrite(ledPin, LOW); // Matikan LED
int currentLedStatus = LOW; // Status LED saat ini
// Kirim data hanya jika ada perubahan
if (currentLedStatus != lastLedStatus) {
lastLedStatus = currentLedStatus; // Update status LED
sendDataToAPI(ldrValue, pirState == HIGH ? 1 : 0, lastLedStatus); // Kirim data
}
Serial.println("Ruangan terang, LED mati");
} else {
// Jika ruangan gelap dan ada gerakan, nyalakan LED
if (pirState == HIGH) {
delay(100); // Debounce delay
pirState = digitalRead(pirPin); // Baca lagi setelah delay
if (pirState == HIGH) {
pirLastTriggered = millis(); // Simpan waktu saat gerakan terdeteksi
digitalWrite(ledPin, HIGH); // Nyalakan LED
int currentLedStatus = HIGH; // Status LED saat ini
// Kirim data hanya jika ada perubahan
if (currentLedStatus != lastLedStatus) {
lastLedStatus = currentLedStatus; // Update status LED
sendDataToAPI(ldrValue, 1, lastLedStatus); // Kirim data
}
Serial.println("Ruangan gelap dan ada gerakan, LED nyala");
}
}
// Jika tidak ada gerakan dalam waktu pirDelay, matikan LED
if (millis() - pirLastTriggered >= pirDelay) {
digitalWrite(ledPin, LOW); // Matikan LED setelah pirDelay tanpa gerakan
int currentLedStatus = LOW; // Status LED saat ini
// Kirim data hanya jika ada perubahan
if (currentLedStatus != lastLedStatus) {
lastLedStatus = currentLedStatus; // Update status LED
sendDataToAPI(ldrValue, 0, lastLedStatus); // Kirim data
}
Serial.println("Tidak ada gerakan, LED mati");
}
}
delay(2000); // Sensor readings setiap 2 detik
}
// Fungsi untuk mengirim data ke API
void sendDataToAPI(int ldrValue, int pirStatus, int ledStatus) {
if (WiFi.status() == WL_CONNECTED) { // Cek apakah terhubung ke WiFi
WiFiClient client;
HTTPClient http;
// Ubah serverName menjadi tipe String agar dapat digabungkan dengan string lain
String serverPath = String(serverName) + "?ldr=" + String(ldrValue) + "&pir=" + String(pirStatus) + "&led=" + String(ledStatus);
http.begin(client, serverPath.c_str());
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String payload = http.getString();
Serial.println(httpResponseCode);
Serial.println(payload);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end(); // Bebaskan resource
} else {
Serial.println("WiFi Disconnected");
}
}
Note: The code provided is for the ESP8266 NodeMCU microcontroller. It includes WiFi connectivity setup, sensor reading, LED control based on sensor input, and data transmission to a server API. The code is written in Arduino C/C++ and is intended to be compiled and uploaded to the microcontroller using the Arduino IDE or a similar development environment.