ESP32 dengan Sensor PIR Gerakan menggunakan Interupt dan Timer

Pada artikel ini, kita akan belajar bagaimana menghubungkan dan menggunakan sensor PIR (Passive Infrared) dengan ESP32 untuk mendeteksi gerakan. Kita akan memanfaatkan interupsi dan timer pada ESP32 untuk mendeteksi gerakan dan kemudian mengaktifkan aksi tertentu, seperti menyalakan LED atau mengirimkan pemberitahuan.

Apa itu Interupt
Untuk memicu sebuah kejadian dengan sensor gerak PIR, kita menggunakan interupsi. Interupsi berguna untuk membuat sesuatu terjadi secara otomatis dalam program mikrokontroler, dan dapat membantu menyelesaikan masalah pengaturan waktu.

Dengan interupsi, Anda tidak perlu terus-menerus memeriksa nilai saat ini dari sebuah pin. Ketika sebuah perubahan terdeteksi, sebuah kejadian akan dipicu (sebuah fungsi dipanggil).

Ads Jadwal Training bisaioti Offline
NoMateriTanggalWaktuHargaLokasiViewAction
1IOT PLC SCADA Siemens7-8 Juni 202508.00 - 16.002000000SurabayaSilabusDaftar Sekarang
2IOT PLC SCADA Omron14 - 15 Juni 202508.00 - 16.002000000SurabayaSilabusDaftar Sekarang
3IOT PLC SCADA Schneider21-22 Juni 202508.00 -16.002000000SurabayaSilabusDaftar Sekarang
4IOT PLC SCADA Allen Bradley28-29 Juni 202508.00-16.002000000SurabayaSilabusDaftar Sekarang

Untuk mengatur interupsi di Arduino IDE, Anda menggunakan fungsi attachInterrupt(), yang menerima argumen: pin GPIO, nama fungsi yang akan dijalankan, dan mode:

attachInterrupt(digitalPinToInterrupt(GPIO), function, mode);

Interupsi GPIO

Argumen pertama adalah nomor GPIO. Biasanya, Anda harus menggunakan digitalPinToInterrupt(GPIO) untuk mengatur GPIO yang sebenarnya sebagai pin interupsi. Sebagai contoh, jika Anda ingin menggunakan GPIO 27 sebagai interupsi, gunakan:

digitalPinToInterrupt(27)

Dengan papan ESP32, semua pin yang disorot dengan persegi panjang merah pada gambar berikut dapat dikonfigurasi sebagai pin interupsi. Dalam contoh ini, kita akan menggunakan GPIO 27 sebagai interupsi yang terhubung dengan sensor PIR (Passive Infrared).

Function to be triggered

Argumen kedua dari fungsi attachInterrupt() adalah nama fungsi yang akan dipanggil setiap kali interupsi dipicu.

Mode

Argumen ketiga adalah mode. Terdapat 5 mode yang berbeda:

  • LOW: untuk memicu interupsi setiap kali pin berada dalam keadaan LOW;
  • HIGH: untuk memicu interupsi setiap kali pin berada dalam keadaan HIGH;
  • CHANGE: untuk memicu interupsi setiap kali nilai pin berubah – misalnya dari HIGH ke LOW atau sebaliknya;
  • FALLING: untuk memicu interupsi ketika pin berubah dari HIGH ke LOW;
  • RISING: untuk memicu interupsi ketika pin berubah dari LOW ke HIGH.

Pada contoh ini, kita akan menggunakan mode RISING, karena ketika sensor gerak PIR mendeteksi gerakan, GPIO yang terhubung akan berubah dari LOW ke HIGH.

Apa itu Sensor PIR?

Sensor PIR (Passive Infrared) digunakan untuk mendeteksi gerakan berdasarkan perubahan radiasi inframerah dari objek yang ada di depannya, seperti tubuh manusia. Sensor ini sangat sering digunakan dalam aplikasi seperti sistem keamanan atau lampu otomatis.

Komponen yang Diperlukan:

  • ESP32 (misalnya, ESP32 DevKitC)
  • Sensor PIR
  • LED (untuk indikasi)
  • Resistor (untuk LED)

Koneksi Hardware:

  1. PIR Sensor:
    • VCC ke 3.3V pada ESP32
    • GND ke GND pada ESP32
    • OUT ke salah satu pin GPIO, misalnya GPIO 13
  2. LED:
    • Anoda (positif) ke GPIO (misalnya GPIO 12) melalui resistor 220Ω
    • Katoda (negatif) ke GND

Penjelasan Penggunaan Interupsi dan Timer:

  • Interupsi (Interrupts): Interupsi memungkinkan ESP32 untuk segera merespons suatu peristiwa tanpa menunggu program berjalan sampai selesai. Dalam kasus ini, kita akan menggunakan interupsi untuk mendeteksi sinyal HIGH (gerakan terdeteksi) dari pin OUT sensor PIR.
  • Timer: Setelah mendeteksi gerakan, kita bisa menggunakan timer untuk menentukan berapa lama LED akan menyala sebelum dimatikan secara otomatis.

Skema Koneksi:

  • Sensor PIR OUT ke GPIO 13
  • LED ke GPIO 12

Program untuk ESP32:

// Definisikan pin untuk sensor PIR dan LED
const int pirPin = 13; // Pin untuk sensor PIR
const int ledPin = 12; // Pin untuk LED

// Variabel untuk timer
hw_timer_t * timer = NULL; // Timer

// Flag untuk status gerakan
volatile bool motionDetected = false;

// Fungsi untuk interupsi PIR
void IRAM_ATTR pirInterrupt() {
motionDetected = true; // Gerakan terdeteksi
digitalWrite(ledPin, HIGH); // Menyalakan LED
timerWrite(timer, 0); // Reset timer
timerAlarmEnable(timer); // Aktifkan timer
}

void setup() {
Serial.begin(115200);

pinMode(pirPin, INPUT); // Set pin PIR sebagai input
pinMode(ledPin, OUTPUT); // Set pin LED sebagai output

// Set interupsi pada pin PIR
attachInterrupt(digitalPinToInterrupt(pirPin), pirInterrupt, RISING);

// Set up timer untuk mematikan LED setelah 5 detik
timer = timerBegin(0, 80, true); // Timer 0, prescaler 80 (1 us per tick)
timerAttachInterrupt(timer, onTimer, true); // Fungsi yang dipanggil saat timer berakhir
timerAlarmWrite(timer, 5000000, false); // Timer 5 detik (5.000.000 microseconds)
}

void loop() {
// Jika gerakan terdeteksi, LED akan menyala dan timer akan menghitung mundur
if (motionDetected) {
Serial.println("Motion Detected!");
motionDetected = false; // Reset flag setelah menangkap gerakan
}
}

// Fungsi untuk mematikan LED setelah timer habis
void IRAM_ATTR onTimer() {
digitalWrite(ledPin, LOW); // Mematikan LED
timerAlarmDisable(timer); // Nonaktifkan timer setelah selesai
}

Penjelasan Kode:

  1. Definisi Pin:
    • pirPin: Pin GPIO yang terhubung ke sensor PIR (misalnya GPIO 13).
    • ledPin: Pin GPIO yang terhubung ke LED (misalnya GPIO 12).
  2. Interupsi PIR:
    • Fungsi pirInterrupt() dipanggil ketika pin sensor PIR mengirimkan sinyal HIGH, menandakan adanya gerakan.
    • LED akan menyala, dan timer akan dihitung mundur.
  3. Timer:
    • Timer diatur untuk menghitung mundur selama 5 detik setelah mendeteksi gerakan. Setelah timer selesai, LED akan dimatikan.
  4. Fungsi Timer:
    • Fungsi onTimer() dipanggil ketika timer mencapai waktu yang telah ditentukan (5 detik dalam kasus ini). LED dimatikan setelah waktu habis.

Penjelasan Interupsi:

  • attachInterrupt(): Fungsi ini digunakan untuk mengatur pin GPIO yang akan dipantau, dan akan memanggil fungsi yang ditentukan (pirInterrupt) setiap kali sinyal HIGH terdeteksi di pin tersebut.
  • IRAM_ATTR: Digunakan untuk menandai fungsi interupsi agar dapat dijalankan di memori yang tepat di ESP32.

Hasil:

  • Ketika sensor PIR mendeteksi gerakan, LED akan menyala.
  • Timer mulai menghitung mundur setelah deteksi gerakan dan LED akan dimatikan setelah 5 detik jika tidak ada gerakan lebih lanjut.

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Daftar Sekarang