Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

ESP8266 NodeMCU Controlled Smart Lighting with Motion Detection and Ambient Light Sensing

View and Edit Project In Cirkit DesignerImage of ESP8266 NodeMCU Controlled Smart Lighting with Motion Detection and Ambient Light Sensing

Circuit Documentation

Summary

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.

Component List

Resistor (220 Ohms)

Resistor (10k Ohms)

ESP8266 NodeMCU

PIR Motion Sensor (Wokwi Compatible)

Photocell (LDR)

LED: Two Pin (blue)

Wiring Details

Resistor (220 Ohms)

Resistor (10k Ohms)

ESP8266 NodeMCU

PIR Motion Sensor (Wokwi Compatible)

Photocell (LDR)

LED: Two Pin (blue)

Documented Code

#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.