ESP32 dengan Sensor Gerak PIR menggunakan Interupsi dan Timer

Tutorial ini menunjukkan cara mendeteksi gerakan dengan ESP32 menggunakan sensor gerak PIR. Dalam contoh ini, ketika gerakan terdeteksi (interupsi dipicu), ESP32 memulai pengatur waktu dan menyalakan LED selama beberapa detik yang telah ditentukan. Ketika penghitung waktu selesai menghitung mundur, LED mati secara otomatis.

Dengan contoh ini kita juga akan mengeksplorasi dua konsep penting: interupsi dan timer.

Sebelum melanjutkan dengan tutorial ini, Anda harus menginstal add-on ESP32 di Arduino IDE Anda. Ikuti salah satu tutorial berikut untuk menginstal ESP32 di Arduino IDE, jika Anda belum melakukannya.

    Memasang Papan ESP32 diArduino IDE (instruksi Windows)

    Memasang Papan ESP32 diArduino IDE (instruksi Mac dan Linux)

Tonton Video Tutorial dan Demo Proyek

Tutorial ini tersedia dalam format video (lihat di bawah) dan dalam format tertulis (lanjutkan membaca).

Bagian yang Diperlukan

Untuk mengikuti tutorial ini Anda memerlukan bagian-bagian berikut:

    Papan ESP32 DOIT DEVKIT V1baca Tinjauan dan Perbandingan Papan Pengembangan ESP32

    Sensor gerak Mini PIR(AM312) atau sensor gerak PIR (HC-SR501)

    LED 5mm

    330 Ohm resistor

     Kabel jumper

    Papan tempat memotong roti

Memperkenalkan Interupsi

Untuk memicu suatu peristiwa dengan sensor gerak PIR, Anda menggunakan interupsi. Interupsi berguna untuk membuat sesuatu terjadi secara otomatis dalam program mikrokontroler, dan dapat membantu memecahkan masalah waktu.

Dengan interupsi, Anda tidak perlu terus-menerus memeriksa nilai pin saat ini. Dengan interupsi, ketika perubahan terdeteksi, suatu peristiwa dipicu (fungsi dipanggil).

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

Gangguan GPIO

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

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 ke sensor PIR Motion.

Fungsi yang akan dipicu

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

Mode

Argumen ketiga adalah modus. Ada 5 mode berbeda:

    LOW : untuk memicu interupsi setiap kali pin LOW;

    HIGH : untuk memicu interupsi setiap kali pin HIGH;

    CHANGE : untuk memicu interupsi setiap kali pin mengubah nilai – misalnya dari HIGH ke LOW atau LOW ke HIGH;

     JATUH : ketika pin beralih dari TINGGI ke RENDAH;

    RISING : untuk memicu ketika pin beralih dari LOW ke HIGH.

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

Memperkenalkan Timer

Dalam contoh ini kami juga akan memperkenalkan timer. Kami ingin LED tetap menyala selama beberapa detik yang telah ditentukan setelah gerakan terdeteksi. Alih-alih menggunakan fungsi delay() yang memblokir kode Anda dan tidak memungkinkan Anda melakukan hal lain selama beberapa detik yang ditentukan, kita harus menggunakan timer.

Fungsi penundaan ()

Anda harus terbiasa dengan fungsi delay() karena banyak digunakan. Fungsi ini cukup mudah digunakan. Ia menerima nomor int tunggal sebagai argumen. Angka ini menunjukkan waktu dalam milidetik program harus menunggu sampai pindah ke baris kode berikutnya.

Ketika Anda melakukan delay(1000) program Anda berhenti pada baris itu selama 1 detik.

delay() adalah fungsi pemblokiran. Fungsi pemblokiran mencegah program melakukan hal lain sampai tugas tertentu selesai. Jika Anda memerlukan beberapa tugas untuk dilakukan pada saat yang sama, Anda tidak dapat menggunakan delay().

Untuk sebagian besar proyek, Anda harus menghindari penggunaan penundaan dan menggunakan pengatur waktu sebagai gantinya.

Fungsi milis()

Menggunakan fungsi yang disebut milis() Anda dapat mengembalikan jumlah milidetik yang telah berlalu sejak program pertama kali dimulai.

Mengapa fungsi itu berguna? Karena dengan menggunakan beberapa matematika, Anda dapat dengan mudah memverifikasi berapa banyak waktu yang telah berlalu tanpa memblokir kode Anda.

Mengedipkan LED dengan milis()

Cuplikan kode berikut menunjukkan bagaimana Anda dapat menggunakan fungsi milis() untuk membuat proyek LED berkedip. Itu menyalakan LED selama 1000 milidetik, dan kemudian mematikannya.

 

Cara kerja kode

Mari kita lihat lebih dekat sketsa kedipan ini yang bekerja tanpa fungsi delay() (sebagai gantinya menggunakan fungsi millis()).

Pada dasarnya, kode ini mengurangi waktu yang tercatat sebelumnya (previousMillis) dari waktu saat ini (currentMillis). Jika sisa lebih besar dari interval (dalam hal ini, 1000 milidetik), program memperbarui variabel previousMillis ke waktu saat ini, dan menyalakan atau mematikan LED.

Karena cuplikan ini tidak memblokir, kode apa pun yang terletak di luar pernyataan if pertama akan berfungsi secara normal.

Anda sekarang seharusnya dapat memahami bahwa Anda dapat menambahkan tugas lain ke fungsi loop() dan kode Anda akan tetap mengedipkan LED setiap satu detik.

Anda dapat mengunggah kode ini ke ESP32 Anda dan merakit diagram skematik berikut untuk mengujinya dan mengubah jumlah milidetik untuk melihat cara kerjanya.

Catatan : Jika Anda mengalami masalah saat mengunggah kode ke ESP32 Anda, lihat Panduan Pemecahan Masalah ESP32.

ESP32 dengan Sensor Gerak PIR

Setelah memahami konsep-konsep ini : interupsi dan pengatur waktu, mari kita lanjutkan dengan proyek ini.

Skema

Rangkaian yang akan kita buat mudah untuk dirakit, kita akan menggunakan LED dengan resistor. LED terhubung ke GPIO 26. Kami akan menggunakan Sensor Gerak Mini AM312 PIR yang beroperasi pada 3.3V. Ini akan terhubung ke GPIO 27. Cukup ikuti diagram skema berikutnya.

Penting : Sensor Gerak Mini AM312 PIR yang digunakan dalam proyek ini beroperasi pada 3.3V. Namun, jika Anda menggunakan sensor gerak PIR lain seperti HC-SR501, ia beroperasi pada 5V. Anda dapat memodifikasinya untuk beroperasi pada 3.3V atau cukup menyalakannya menggunakan pin Vin.

Gambar berikut menunjukkan pinout sensor gerak AM312 PIR.

Mengunggah Kode

Setelah memasang kabel sirkuit seperti yang ditunjukkan pada diagram skematik, salin kode yang diberikan ke Arduino IDE Anda.

Anda dapat mengunggah kode apa adanya, atau Anda dapat mengubah jumlah detik LED menyala setelah mendeteksi gerakan. Cukup ubah variabel timeSeconds dengan jumlah detik yang Anda inginkan.

 

Catatan : jika Anda mengalami masalah saat mengunggah kode ke ESP32 Anda, lihat Panduan Pemecahan Masalah ESP32.

Cara Kerja Kode

Mari kita lihat kodenya. Mulailah dengan menetapkan dua pin GPIO ke variabel led dan motionSensor.

Kemudian, buat variabel yang memungkinkan Anda mengatur timer untuk mematikan LED setelah gerakan terdeteksi.

Variabel sekarang memegang waktu saat ini. Variabel lastTrigger menahan waktu ketika sensor PIR mendeteksi gerakan. StartTimer adalah variabel boolean yang memulai timer ketika gerakan terdeteksi.

setup()

Di setup(), mulailah dengan menginisialisasi port Serial pada 115200 baud rate.

Atur sensor Gerak PIR sebagai INPUT PULLUP.

Untuk menyetel pin sensor PIR sebagai interupsi, gunakan fungsi attachInterrupt() seperti yang dijelaskan sebelumnya.

Pin yang akan mendeteksi gerakan adalah GPIO 27 dan akan memanggil fungsi detectsMovement() pada mode RISING.

LED adalah OUTPUT yang statusnya dimulai dari LOW.

loop()

Fungsi loop() terus berjalan berulang-ulang. Di setiap loop, variabel sekarang diperbarui dengan waktu saat ini.

Tidak ada lagi yang dilakukan di loop().

Namun, ketika gerakan terdeteksi, fungsi detectsMovement() dipanggil karena kita telah menyetel interupsi sebelumnya pada setup().

Fungsi detectsMovement() mencetak pesan di Serial Monitor, menyalakan LED, menyetel variabel boolean startTimer ke true dan memperbarui variabel LastTrigger dengan waktu saat ini.

Catatan : IRAM_ATTR digunakan untuk menjalankan kode interupsi di RAM, jika tidak, kode disimpan dalam flash dan lebih lambat.

Setelah langkah ini, kode kembali ke loop().

Kali ini, variabel startTimer benar. Jadi, ketika waktu yang ditentukan dalam detik telah berlalu (sejak gerakan terdeteksi), pernyataan if berikut akan benar.

Pesan “Motion stopped…” akan tercetak di Serial Monitor, LED dimatikan, dan variabel startTimer disetel ke false.

Demonstrasi

Unggah kode ke papan ESP32 Anda. Pastikan Anda memilih papan dan port COM yang tepat.

Buka Serial Monitor pada baud rate 115200.

Gerakkan tangan Anda di depan sensor PIR. LED akan menyala, dan sebuah pesan tercetak di Serial Monitor yang mengatakan “MOTION DETECTED!!!”. Setelah 10 detik, LED akan mati.

Membungkus

Sebagai penutup, interupsi digunakan untuk mendeteksi perubahan status GPIO tanpa perlu terus-menerus membaca nilai GPIO saat ini. Dengan interupsi, ketika perubahan terdeteksi, fungsi dipicu. Anda juga telah mempelajari cara menyetel penghitung waktu sederhana yang memungkinkan Anda memeriksa apakah jumlah detik yang telah ditentukan telah berlalu tanpa harus memblokir kode Anda.

Kami memiliki tutorial lain yang terkait dengan ESP32 yang mungkin juga Anda sukai:

    • Server Web ESP32 – Arduino IDE

    • Suhu Pencatatan Data ESP32 ke Kartu MicroSD

    • Cara Menggunakan LCD I2C dengan ESP32 di Arduino IDE

    • ESP32 vs ESP8266 – Pro dan Kontra

Posting Komentar

0 Komentar