ESP32 dengan PIR Motion Sensor menggunakan Interrupts dan Timer – Arduino IDE

Esp32 Dengan Pir Motion Sensor Menggunakan Interrupts Dan Timer Arduino Ide



ESP32 ialah papan mikropengawal berasaskan IoT yang boleh digunakan untuk antara muka, mengawal dan membaca penderia yang berbeza. PIR atau penderia gerakan adalah salah satu peranti yang kita boleh antara muka dengan ESP32 untuk mengesan pergerakan objek dalam julat penderia gerakan menggunakan ESP32.

Sebelum kita memulakan antara muka ESP32 dengan sensor PIR, kita mesti tahu cara gangguan berfungsi dan cara membaca dan mengendalikannya dalam ESP32. Seterusnya kita mesti memahami konsep teras fungsi delay() dan millis() dalam pengaturcaraan ESP32.







Mari kita bincangkan cara kerja PIR dengan ESP32 secara terperinci.



Berikut ialah kandungan untuk artikel ini:



  1. Apa Itu Gangguan
  • Pemasa dalam Pengaturcaraan ESP32
  • Mengantaramuka Penderia PIR dengan ESP32

    1: Apakah Gangguan

    Kebanyakan peristiwa yang berlaku dalam pengaturcaraan ESP32 berjalan secara berurutan yang bermaksud pelaksanaan baris demi baris kod. Untuk mengendalikan dan mengawal acara yang tidak perlu dijalankan semasa pelaksanaan berurutan kod an menyampuk digunakan.





    Sebagai contoh, jika kita ingin melaksanakan tugas tertentu apabila sebarang peristiwa khas berlaku, atau isyarat pencetus diberikan kepada pin digital mikropengawal yang kita gunakan interrupt.


    Dengan gangguan, kami tidak perlu menyemak keadaan digital pin input ESP32 secara berterusan. Apabila gangguan berlaku pemproses menghentikan program utama dan fungsi baru dipanggil yang dikenali sebagai ISR ​​( Rutin Perkhidmatan Mengganggu ). ini ISR fungsi mengendalikan gangguan yang disebabkan selepas itu kembali ke program utama dan mula melaksanakannya. Salah satu contoh ISR ialah Penderia gerakan PIR yang menjana gangguan apabila gerakan dikesan .



    1.1: Mengganggu Pin dalam ESP32

    Gangguan luaran atau perkakasan boleh disebabkan oleh mana-mana modul perkakasan seperti sensor sentuh atau butang tekan. Gangguan sentuhan berlaku apabila sentuhan dikesan pada pin ESP32 atau gangguan GPIO juga boleh digunakan apabila kekunci atau butang tekan ditekan.

    Dalam artikel ini kami akan mencetuskan gangguan apabila gerakan dikesan menggunakan sensor PIR dengan ESP32.

    Hampir semua pin GPIO kecuali 6 pin bersepadu SPI yang biasanya terdapat dalam 36 -pin versi papan ESP32 tidak boleh digunakan untuk tujuan mengganggu panggilan. Jadi, untuk menerima gangguan luaran berikut ialah pin yang diserlahkan dalam warna ungu yang boleh digunakan dalam ESP32:

    Imej ini ialah 30 pin ESP32.

    1.2: Memanggil Gangguan dalam ESP32

    Untuk menggunakan gangguan dalam ESP32 kami boleh menghubungi attachInterrupt() fungsi.

    Fungsi ini menerima tiga hujah berikut:

      • Pin GPIO
      • Fungsi untuk dilaksanakan
      • Mod
    attachInterrupt ( digitalPinToInterrupt ( GPIO ) , fungsi , mod ) ;


    1: GPIO pin ialah hujah pertama yang dipanggil di dalam attachInterrupt() fungsi. Sebagai contoh, untuk menggunakan pin digital 12 sebagai sumber gangguan kita boleh memanggilnya menggunakan digitalPinToInterrupt(12) fungsi.

    2: Fungsi yang akan dilaksanakan ialah program yang dilaksanakan setiap kali setelah gangguan dicapai atau dicetuskan oleh sumber luaran atau dalaman. Ia boleh sama ada berkelip LED atau menghidupkan penggera kebakaran.

    3: Mod ialah hujah ketiga dan terakhir yang diperlukan oleh fungsi gangguan. Ia menerangkan masa untuk mencetuskan gangguan. Berikut adalah mod yang boleh digunakan:

      • Rendah: Cetuskan gangguan setiap kali pin GPIO yang ditentukan rendah.
      • Tinggi: Cetuskan gangguan setiap kali pin GPIO yang ditentukan adalah tinggi.
      • Ubah: Pencetus sampukan setiap kali pin GPIO menukar nilainya daripada tinggi kepada rendah atau sebaliknya.
      • Jatuh: Ia adalah mod untuk mencetuskan gangguan apabila pin tertentu mula jatuh dari keadaan tinggi ke rendah.
      • Meningkat: Ia adalah mod untuk mencetuskan gangguan apabila pin tertentu mula naik dari keadaan rendah ke tinggi.

    Hari ini kita akan gunakan Meningkat mod sebagai hujah ketiga untuk fungsi gangguan apabila sensor PIR mengesan LED gangguan atau sensor akan menyala kerana ia pergi dari keadaan rendah ke tinggi.

    2: Pemasa dalam Pengaturcaraan ESP32

    Pemasa dalam pengaturcaraan mikropengawal memainkan peranan penting untuk melaksanakan arahan untuk tempoh pemasa tertentu atau pada masa tertentu.

    Dua fungsi utama yang biasa digunakan untuk mencetuskan output ialah kelewatan() dan millis() . Perbezaan antara kedua-duanya sebagai fungsi delay() menghentikan seluruh program sebaik sahaja ia mula melaksanakan  manakala millis() berjalan untuk tempoh masa yang ditentukan kemudian program kembali ke fungsi utama.

    Di sini kami akan menggunakan LED dengan penderia PIR dan kami tidak mahu menyalakannya secara berterusan selepas gangguan dicetuskan. Kami akan menggunakan fungsi millis() yang membolehkan kami menyalakannya untuk beberapa masa yang ditetapkan dan kemudian kembali ke program asal setelah cap masa itu berlalu.

    2.1: Fungsi kelewatan().

    fungsi delay() agak mudah ia hanya memerlukan satu hujah iaitu Cik jenis data panjang yang tidak ditandatangani. Argumen ini mewakili masa dalam milisaat yang kita mahu menjeda atur cara sehingga ia bergerak ke baris seterusnya.

    Sebagai contoh, fungsi berikut akan menghentikan program untuk 1 saat .

    kelewatan ( 1000 )


    delay() ialah sejenis fungsi menyekat untuk pengaturcaraan mikropengawal. delay() menyekat kod yang lain untuk dilaksanakan sehingga masa fungsi tertentu ini tidak selesai. Jika kita ingin melaksanakan berbilang arahan, kita harus mengelak daripada menggunakan fungsi kelewatan sebaliknya kita boleh menggunakan millis atau modul RTC pemasa luaran.

    2.2: Fungsi millis().

    fungsi millis() mengembalikan bilangan milisaat yang berlalu sejak papan ESP32 mula menjalankan program semasa. Dengan menulis beberapa baris kod, kami boleh mengira masa sekarang dengan mudah pada sebarang keadaan semasa menjalankan kod ESP32.

    millis digunakan secara meluas di mana kita perlu menjalankan pelbagai tugas tanpa menyekat kod yang lain. Berikut ialah sintaks fungsi millis yang digunakan untuk mengira berapa lama masa berlalu supaya kita boleh melaksanakan arahan tertentu.

    jika ( semasaMillis - sebelumnyaMillis > = selang ) {
    sebelumnyaMillis = semasaMillis;
    }


    Kod ini menolak millis() sebelumnya daripada millis() semasa jika masa yang ditolak sama dengan mentakrifkan selang arahan tertentu akan dilaksanakan. Katakan kita mahu berkelip LED selama 10 saat. Selepas setiap 5 minit kita boleh menetapkan selang masa sama dengan 5 minit (300000ms). Kod akan menyemak selang setiap kali kod berjalan, sebaik sahaja ia mencapai ia akan berkelip LED selama 10 saat.

    Catatan: Di sini kita akan menggunakan fungsi millis() untuk antara muka ESP32 dengan sensor PIR. Sebab utama di sebalik penggunaan milli dan bukan kelewatan ialah fungsi millis() tidak menyekat kod seperti yang dilakukan oleh fungsi delay(). Jadi sebaik sahaja PIR mengesan gerakan, gangguan akan dijana. Menggunakan fungsi millis() interrupt akan mencetuskan LED untuk masa yang ditentukan selepas itu jika gerakan dihentikan fungsi millis() akan ditetapkan semula dan menunggu gangguan seterusnya.

    Sekiranya kami menggunakan fungsi delay() ia akan menyekat kod sepenuhnya dan sebarang gangguan yang disebabkan tidak akan dibaca oleh ESP32 yang mengakibatkan kegagalan projek.

    3: Mengantaramuka Penderia PIR dengan ESP32

    Di sini kita akan menggunakan fungsi millis() dalam kod IDE Arduino kerana kita mahu mencetuskan LED setiap kali sensor PIR mengesan beberapa pergerakan. LED ini akan menyala untuk masa yang ditetapkan selepas itu ia akan kembali kepada keadaan normal.

    Berikut ialah senarai komponen yang kami perlukan:

      • papan pembangunan ESP32
      • Penderia gerakan PIR (HC-SR501)
      • LED
      • Perintang 330 Ohm
      • Menyambung wayar
      • Papan roti

    Skema untuk sensor PIR dengan ESP32:


    Sambungan pin ESP32 dengan sensor PIR ialah:

    ESP32 Penderia PIR
    datang Vcc
    GPIO13 KELUAR
    GND GND

    3.1: Penderia Gerakan PIR (HC-SR501)

    PIR ialah akronim untuk sensor inframerah pasif . Ia menggunakan sepasang penderia piroelektrik yang mengesan haba di sekelilingnya. Kedua-dua penderia piroelektrik ini terletak satu demi satu dan apabila objek masuk dalam julatnya, perubahan tenaga haba atau perbezaan isyarat antara kedua-dua penderia ini menyebabkan output penderia PIR menjadi RENDAH. Sebaik sahaja pin keluar PIR menjadi LOW, kita boleh menetapkan arahan khusus untuk dilaksanakan.


    Berikut ialah ciri-ciri penderia PIR:

      • Sensitiviti boleh ditetapkan bergantung pada lokasi projek (seperti pengesanan tetikus atau pergerakan daun).
      • Penderia PIR boleh ditetapkan untuk berapa lama ia mengesan objek.
      • Digunakan secara meluas dalam penggera keselamatan rumah dan aplikasi pengesanan pergerakan berasaskan haba yang lain.

    3.2: Pinout HC-SR501

    PIR HC-SR501 dilengkapi dengan tiga pin. Dua daripadanya ialah pin kuasa untuk Vcc dan GND dan satu ialah pin output untuk isyarat pencetus.


    Berikut ialah perihalan pin sensor PIR:

    Pin Nama Penerangan
    1 Vcc Pin input untuk penderia Sambung ke ESP32 Vin Pin
    dua KELUAR Keluaran Penderia
    3 GND Penderia GND

    3.3: Kod

    Sekarang untuk memprogramkan ESP32 tulis kod yang diberikan dalam editor IDE Arduino dan muat naik ke ESP32.

    #define timeSecons 10
    const int led = 4 ; /* PIN GPIO 4 ditakrifkan untuk LED */
    const int PIR_Out = 13 ; /* Pin GPIO 13 untuk PIR keluar */
    tidak ditandatangani panjang Semasa_Masa = millis ( ) ; /* pembolehubah ditakrifkan untuk menyimpan nilai millis */
    unsigned long Previous_Trig = 0 ;
    boolean Starting_Time = salah ;
    batal IRAM_ATTR mengesan Pergerakan ( ) { /* semak untuk gerakan */
    Serial.println ( 'GERAKAN DIKESAN' ) ;
    digitalWrite ( dipimpin, TINGGI ) ; /* HIDUPKAN LED jika syarat adalah benar */
    Masa_Bermula = benar ;
    Trig_Sebelumnya = millis ( ) ;
    }
    persediaan kosong ( ) {
    Bersiri.mulakan ( 115200 ) ; /* kadar baud untuk komunikasi bersiri */
     pinMod ( PIR_Keluar, INPUT_PULLUP ) ; /* Mod sensor gerakan PIR ditakrifkan */
    /* PIR dikonfigurasikan dalam Mod RISING, ditetapkan pin sensor gerakan sebagai pengeluaran */
    attachInterrupt ( digitalPinToInterrupt ( PIR_Keluar ) , mengesanPergerakan, MENINGKAT ) ;
     pinMod ( dipimpin, OUTPUT ) ; /* ditetapkan LED kepada RENDAH */
    digitalWrite ( dipimpin, RENDAH ) ;
    }
    gelung kosong ( ) {
    Masa_Semasa = millis ( ) ; /* menyimpan arus masa */
    jika ( Masa_Bermula && ( Masa_Semasa - Trig_Sebelumnya > ( timeSecons * 1000 ) ) ) { /* Selang masa selepas yang LED akan dimatikan */
    Serial.println ( 'GERAKAN BERHENTI' ) ; /* Pergerakan cetakan dihentikan jika tiada gerakan dikesan */
    digitalWrite ( dipimpin, RENDAH ) ; /* Tetapkan LED kepada RENDAH jika syarat adalah salah */
    Masa_Bermula = salah ;
    }
    }


    Kod dimulakan dengan mentakrifkan pin GPIO untuk output LED dan PIR. Seterusnya, kami mencipta tiga pembolehubah berbeza yang akan membantu menghidupkan LED apabila gerakan dikesan.

    Tiga Pembolehubah ini ialah Masa_Semasa, Trig_Sebelumnya, dan Masa_Bermula. Pembolehubah ini akan menyimpan masa semasa, masa di mana gerakan dikesan dan pemasa selepas gerakan dikesan.

    Dalam bahagian persediaan dahulu, kami menentukan kadar baud bersiri untuk komunikasi. Seterusnya menggunakan pinMode() tetapkan penderia gerakan PIR sebagai INPUT PULLUP. Untuk menetapkan gangguan PIR attachInterrupt() diterangkan. GPIO 13 diterangkan untuk mengesan pergerakan pada mod RISING.

    Seterusnya dalam bahagian gelung() kod, menggunakan fungsi millis() kami HIDUPKAN dan MATI LED apabila pencetus dicapai.

    3.4: Output

    Dalam bahagian output kita boleh melihat objek berada di luar julat sensor PIR, jadi LED dipusingkan DIMATIKAN .


    Sekarang gerakan yang dikesan oleh LED sensor PIR akan bertukar HIDUP untuk 10 sec selepas itu jika tiada gerakan dikesan ia akan kekal DIMATIKAN sehingga pencetus seterusnya diterima.


    Output berikut ditunjukkan oleh monitor bersiri dalam Arduino IDE.

    Kesimpulan

    Penderia PIR dengan ESP32 boleh membantu mengesan pergerakan objek yang melalui julatnya. Menggunakan fungsi gangguan dalam pengaturcaraan ESP32 kita boleh mencetuskan tindak balas pada beberapa pin GPIO tertentu. Apabila perubahan dikesan fungsi gangguan akan dicetuskan dan LED akan dihidupkan.