/*
* ESP32 dengan PIR Motion Sensor: Interrupts dan Timers
* Deteksi gerakan otomatis dengan LED timer
*
* Hardware: ESP32 DEVKIT V1, PIR AM312, LED, Resistor 330Ω
* Berdasarkan: Random Nerd Tutorials
*/
// ===== KONFIGURASI WAKTU =====
#define timeSeconds 10
// ===== PIN ASSIGNMENT =====
const int led = 26; // Pin LED output
const int motionSensor = 27; // Pin PIR motion sensor
// ===== VARIABEL TIMER =====
unsigned long now = millis(); // Waktu sekarang
unsigned long lastTrigger = 0; // Waktu terakhir motion terdeteksi
boolean startTimer = false; // Flag untuk memulai timer
boolean motion = false; // Flag status motion
// ===== INTERRUPT SERVICE ROUTINE =====
// Fungsi ini dipanggil ketika PIR mendeteksi gerakan
void IRAM_ATTR detectsMovement() {
digitalWrite(led, HIGH); // Nyalakan LED
startTimer = true; // Mulai timer
lastTrigger = millis(); // Catat waktu trigger
}
// ===== SETUP FUNCTION =====
void setup() {
// Inisialisasi Serial Monitor
Serial.begin(115200);
// Setup PIR Motion Sensor sebagai input pullup
pinMode(motionSensor, INPUT_PULLUP);
// Daftarkan interrupt pada PIR sensor
// GPIO 27, fungsi detectsMovement, mode RISING
attachInterrupt(digitalPinToInterrupt(motionSensor),
detectsMovement, RISING);
// Setup LED sebagai output dan matikan
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.println("ESP32 PIR Motion Sensor Ready!");
}
// ===== MAIN LOOP =====
void loop() {
// Update waktu saat ini
now = millis();
// Cek apakah LED nyala dan motion baru terdeteksi
if((digitalRead(led) == HIGH) && (motion == false)) {
Serial.println("MOTION DETECTED!!!");
motion = true;
}
// Matikan LED setelah waktu yang ditentukan
if(startTimer && (now - lastTrigger > (timeSeconds*1000))) {
Serial.println("Motion stopped...");
digitalWrite(led, LOW); // Matikan LED
startTimer = false; // Stop timer
motion = false; // Reset flag motion
}
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4