ESP32 với Cảm biến chuyển động PIR sử dụng Bộ ngắt và Bộ hẹn giờ – Arduino IDE

Esp32 Voi Cam Bien Chuyen Dong Pir Su Dung Bo Ngat Va Bo Hen Gio Arduino Ide



ESP32 là một bảng vi điều khiển dựa trên IoT có thể được sử dụng để giao tiếp, điều khiển và đọc các cảm biến khác nhau. PIR hay cảm biến chuyển động là một trong những thiết bị chúng ta có thể giao tiếp với ESP32 để phát hiện chuyển động của một vật thể trong phạm vi cảm biến chuyển động sử dụng ESP32.

Trước khi bắt đầu kết nối ESP32 với cảm biến PIR, chúng ta phải biết cách thức hoạt động của các ngắt cũng như cách đọc và xử lý chúng trong ESP32. Tiếp theo, chúng ta phải hiểu khái niệm cốt lõi của hàm delay() và millis() trong lập trình ESP32.







Hãy thảo luận chi tiết về hoạt động của PIR với ESP32.



Đây là nội dung cho bài viết này:



  1. Ngắt là gì
  • Bộ hẹn giờ trong lập trình ESP32
  • Kết nối cảm biến PIR với ESP32

    1: Ngắt là gì

    Hầu hết các sự kiện xảy ra trong lập trình ESP32 đều chạy tuần tự, nghĩa là thực thi mã theo từng dòng. Để xử lý và kiểm soát các sự kiện không cần chạy trong quá trình thực thi mã tuần tự, một ngắt được sử dụng.





    Ví dụ, nếu chúng ta muốn thực hiện một tác vụ nào đó khi có bất kỳ sự kiện đặc biệt nào xảy ra hoặc tín hiệu kích hoạt được đưa đến các chân kỹ thuật số của vi điều khiển, chúng ta sử dụng ngắt.


    Với sự gián đoạn, chúng tôi không cần phải liên tục kiểm tra trạng thái kỹ thuật số của chân đầu vào ESP32. Khi xảy ra ngắt, bộ xử lý tạm dừng chương trình chính và một chức năng mới được gọi là ISR ( Quy trình phục vụ ngắt ). Đây ISR chức năng xử lý ngắt gây ra sau đó quay trở lại chương trình chính và bắt đầu thực hiện nó. Một trong những ví dụ về ISR là Cảm biến chuyển động PIR cái mà tạo ra một ngắt khi phát hiện chuyển động .



    1.1: Các chân ngắt trong ESP32

    Ngắt bên ngoài hoặc phần cứng có thể do bất kỳ mô-đun phần cứng nào như cảm biến cảm ứng hoặc nút ấn gây ra. Ngắt cảm ứng xảy ra khi phát hiện có chạm ở chân ESP32 hoặc ngắt GPIO cũng có thể được sử dụng khi nhấn phím hoặc nút ấn.

    Trong bài này chúng ta sẽ kích hoạt ngắt khi phát hiện chuyển động bằng cảm biến PIR với ESP32.

    Hầu như tất cả các chân GPIO ngoại trừ 6 chân tích hợp SPI thường có trong 36 Phiên bản -pin của bảng ESP32 không thể được sử dụng cho mục đích gọi ngắt. Vì vậy, để nhận ngắt bên ngoài, sau đây là các chân được đánh dấu bằng màu tím mà người dùng có thể sử dụng trong ESP32:

    Hình ảnh này là của một chiếc ESP32 30 chân.

    1.2: Gọi một ngắt trong ESP32

    Để sử dụng ngắt trong ESP32, chúng ta có thể gọi đính kèmInterrupt() hàm số.

    Hàm này chấp nhận ba đối số sau:

      • chân GPIO
      • Chức năng được thực hiện
      • Cách thức
    đính kèmgián đoạn ( kỹ thuật sốPinToInterrupt ( GPIO ) , hàm số , cách thức ) ;


    1: GPIO pin là đối số đầu tiên được gọi bên trong đính kèmInterrupt() hàm số. Ví dụ: để sử dụng chân số 12 làm nguồn ngắt, chúng ta có thể gọi nó bằng cách sử dụng kỹ thuật sốPinToInterrupt(12) hàm số.

    2: Chức năng được thực thi là chương trình được thực thi mỗi khi gặp ngắt hoặc được kích hoạt bởi một nguồn bên ngoài hoặc bên trong. Nó có thể nhấp nháy đèn LED hoặc bật chuông báo cháy.

    3: Chế độ là đối số thứ ba và cũng là đối số cuối cùng mà hàm ngắt cần. Nó mô tả thời điểm kích hoạt ngắt. Sau đây là các chế độ có thể được sử dụng:

      • Thấp: Kích hoạt ngắt mỗi khi chân GPIO được xác định ở mức thấp.
      • Cao: Kích hoạt ngắt mỗi khi chân GPIO được xác định ở mức cao.
      • Biến đổi: Kích hoạt ngắt mỗi khi chân GPIO thay đổi giá trị từ cao xuống thấp hoặc ngược lại.
      • rơi: Đó là chế độ kích hoạt ngắt khi một chân nào đó bắt đầu giảm từ trạng thái cao xuống thấp.
      • Trỗi dậy: Đây là chế độ kích hoạt ngắt khi một chân nào đó bắt đầu tăng từ trạng thái thấp lên cao.

    Hôm nay chúng ta sẽ sử dụng Trỗi dậy chế độ làm đối số thứ ba cho chức năng ngắt bất cứ khi nào cảm biến PIR phát hiện đèn LED ngắt hoặc cảm biến sẽ sáng lên vì nó chuyển từ trạng thái thấp lên cao.

    2: Bộ hẹn giờ trong lập trình ESP32

    Bộ hẹn giờ trong lập trình vi điều khiển đóng một vai trò quan trọng để thực hiện các lệnh trong một khoảng thời gian cụ thể hoặc tại một thời điểm cụ thể.

    Hai chức năng chính thường được sử dụng để kích hoạt đầu ra là sự chậm trễ() millis() . Sự khác biệt giữa cả hai là hàm delay() sẽ dừng phần còn lại của chương trình sau khi nó bắt đầu thực thi trong khi millis() chạy trong một khoảng thời gian xác định, sau đó chương trình sẽ quay lại các hàm chính.

    Ở đây, chúng tôi sẽ sử dụng đèn LED có cảm biến PIR và chúng tôi không muốn nó phát sáng liên tục sau khi kích hoạt ngắt. Chúng tôi sẽ sử dụng hàm millis() cho phép chúng tôi phát sáng nó trong một khoảng thời gian xác định và sau đó quay lại chương trình ban đầu khi dấu thời gian đó trôi qua.

    2.1: Chức năng trì hoãn ()

    hàm delay() khá đơn giản, nó chỉ nhận một đối số đó là bệnh đa xơ cứng của kiểu dữ liệu dài không dấu. Đối số này biểu thị thời gian tính bằng mili giây mà chúng tôi muốn tạm dừng chương trình cho đến khi nó chuyển sang dòng tiếp theo.

    Ví dụ, chức năng sau sẽ dừng chương trình cho 1 giây .

    sự chậm trễ ( 1000 )


    delay() là một loại chức năng chặn cho lập trình vi điều khiển. delay() chặn phần còn lại của mã để thực thi cho đến khi chức năng cụ thể này không hoàn thành. Nếu chúng ta muốn thực hiện nhiều lệnh, chúng ta nên tránh sử dụng các chức năng trì hoãn thay vào đó chúng ta có thể sử dụng millis hoặc các mô-đun RTC hẹn giờ bên ngoài.

    2.2: Hàm millis()

    millis() trả về số mili giây đã trôi qua kể từ khi bảng ESP32 bắt đầu chạy chương trình hiện tại. Bằng cách viết một vài dòng mã, chúng ta có thể dễ dàng tính toán thời gian hiện tại tại bất kỳ trường hợp nào trong khi chạy mã ESP32.

    millis được sử dụng rộng rãi khi chúng ta cần chạy nhiều tác vụ mà không chặn phần còn lại của mã. Đây là cú pháp của hàm millis được sử dụng để tính toán lượng thời gian đã trôi qua để chúng ta có thể thực hiện một lệnh cụ thể.

    nếu ( currentMillis - trướcMillis > = khoảng thời gian ) {
    beforeMillis = currentMillis;
    }


    Mã này trừ millis() trước đó khỏi millis() hiện tại nếu thời gian bị trừ bằng để xác định khoảng thời gian mà một lệnh cụ thể sẽ được thực thi. Giả sử chúng ta muốn nháy đèn LED trong 10 giây. Cứ sau 5 phút, chúng ta có thể đặt khoảng thời gian bằng 5 phút (300000ms). Mã sẽ kiểm tra khoảng thời gian mỗi khi mã chạy, khi đạt đến nó sẽ nhấp nháy đèn LED trong 10 giây.

    Ghi chú: Ở đây chúng ta sẽ sử dụng hàm millis() để kết nối ESP32 với cảm biến PIR. Lý do chính đằng sau việc sử dụng milli và không trì hoãn là hàm millis() không chặn mã như hàm delay() đã làm. Vì vậy, một khi PIR phát hiện chuyển động, một ngắt sẽ được tạo ra. Sử dụng chức năng ngắt millis() sẽ kích hoạt đèn LED trong thời gian xác định sau đó nếu chuyển động bị dừng, chức năng millis() sẽ đặt lại và đợi lần ngắt tiếp theo.

    Trong trường hợp nếu chúng ta sử dụng hàm delay(), nó sẽ chặn mã hoàn toàn và mọi ngắt gây ra sẽ không được đọc bởi ESP32 dẫn đến dự án không thành công.

    3: Kết nối cảm biến PIR với ESP32

    Ở đây chúng ta sẽ sử dụng hàm millis() trong mã Arduino IDE vì chúng ta muốn kích hoạt đèn LED mỗi khi cảm biến PIR phát hiện một số chuyển động. Đèn LED này sẽ phát sáng trong một khoảng thời gian nhất định sau đó sẽ trở lại trạng thái bình thường.

    Dưới đây là danh sách các thành phần chúng tôi sẽ được yêu cầu:

      • Ban phát triển ESP32
      • Cảm biến chuyển động PIR (HC-SR501)
      • DẪN ĐẾN
      • điện trở 330 Ohm
      • kết nối dây
      • bánh mì

    sơ đồ đối với cảm biến PIR với ESP32:


    Các chân kết nối của ESP32 với cảm biến PIR là:

    ESP32 Cảm biến PIR
    đến Vcc
    GPIO13 NGOÀI
    GND GND

    3.1: Cảm Biến Chuyển Động PIR (HC-SR501)

    PIR là từ viết tắt của cảm biến hồng ngoại thụ động . Nó sử dụng một cặp cảm biến nhiệt điện phát hiện nhiệt xung quanh môi trường xung quanh. Cả hai cảm biến hỏa điện này nằm nối tiếp nhau và khi một vật thể đi vào trong phạm vi của chúng, sự thay đổi năng lượng nhiệt hoặc sự khác biệt tín hiệu giữa cả hai cảm biến này sẽ khiến đầu ra cảm biến PIR ở mức THẤP. Khi chân ra PIR ở mức THẤP, chúng ta có thể đặt một lệnh cụ thể để thực thi.


    Sau đây là các đặc điểm của cảm biến PIR:

      • Độ nhạy có thể được đặt tùy thuộc vào vị trí của dự án (chẳng hạn như cảm nhận chuyển động của chuột hoặc lá).
      • Cảm biến PIR có thể được đặt trong bao lâu nó phát hiện một đối tượng.
      • Được sử dụng rộng rãi trong báo động an ninh gia đình và các ứng dụng phát hiện chuyển động dựa trên nhiệt khác.

    3.2: Sơ đồ chân HC-SR501

    PIR HC-SR501 đi kèm với ba chân cắm. Hai trong số đó là chân nguồn cho Vcc và GND và một là chân đầu ra cho tín hiệu kích hoạt.


    Sau đây là mô tả chân cảm biến PIR:

    Ghim Tên Sự mô tả
    1 Vcc Chân đầu vào cho cảm biến Kết nối với Chân ESP32 Vin
    hai NGOÀI Đầu ra cảm biến
    3 GND cảm biến GND

    3.3: Mã

    Bây giờ để lập trình ESP32, hãy viết mã đã cho trong trình soạn thảo Arduino IDE và tải nó lên ESP32.

    #define timeSeconds 10
    const int led = 4 ; /* mã PIN GPIO 4 xác định DẪN ĐẾN */
    const int PIR_Out = 13 ; /* chân GPIO 13 PIR ra */
    dài không dấu Current_Time = millis ( ) ; /* biến được xác định lưu trữ giá trị millis */
    dài không dấu Previous_Trig = 0 ;
    boolean Bắt đầu_Thời gian = sai ;
    void IRAM_ATTR detectMovement ( ) { /* kiểm tra cử động */
    Nối tiếp.println ( 'CHUYỂN ĐỘNG ĐÃ PHÁT HIỆN' ) ;
      digitalWrite ( dẫn đầu, CAO ) ; /* BẬT đèn LED nếu điều kiện là thật */
    Bắt_đầu_Thời_gian = thật ;
    Previous_Trig = millis ( ) ;
    }
    thiết lập vô hiệu ( ) {
    Nối tiếp.bắt đầu ( 115200 ) ; /* tốc độ truyền truyền thông nối tiếp */
     pinMode ( PIR_Out, INPUT_PULLUP ) ; /* Chế độ cảm biến chuyển động PIR được xác định */
    /* PIR được cấu hình Trong chế độ TĂNG, bộ chân cảm biến chuyển động như đầu ra */
    đính kèmgián đoạn ( kỹ thuật sốPinToInterrupt ( PIR_Out ) , phát hiệnChuyển động, TĂNG ) ;
     pinMode ( dẫn, ĐẦU RA ) ; /* bộ LED ở mức THẤP */
      digitalWrite ( dẫn đầu, THẤP ) ;
    }
    vòng lặp trống ( ) {
    Current_Time = millis ( ) ; /* cửa hàng hiện tại thời gian */
    nếu ( Bắt đầu_Thời gian && ( Current_Time - Previous_Trig > ( thời gian giây * 1000 ) ) ) { /* Khoảng thời gian sau cái mà ĐÈN LED sẽ tắt */
    Nối tiếp.println ( 'CHUYỂN ĐỘNG ĐÃ DỪNG' ) ; /* Chuyển động của bản in đã dừng nếu không phát hiện chuyển động */
        digitalWrite ( dẫn đầu, THẤP ) ; /* Đặt đèn LED ở mức THẤP nếu điều kiện là sai */
    Bắt_đầu_Thời_gian = sai ;
    }
    }


    Mã bắt đầu bằng cách xác định các chân GPIO cho đầu ra LED và PIR. Tiếp theo, chúng tôi đã tạo ba biến khác nhau sẽ giúp bật đèn LED khi phát hiện chuyển động.

    Ba biến này là Current_Time, Previous_Trig, Bắt đầu_Thời gian. Các biến này sẽ lưu trữ thời gian hiện tại, thời gian phát hiện chuyển động và hẹn giờ sau khi phát hiện chuyển động.

    Trong phần thiết lập đầu tiên, chúng tôi đã xác định tốc độ truyền nối tiếp cho giao tiếp. tiếp theo sử dụng pinMode() đặt cảm biến chuyển động PIR là INPUT PULLUP. Để đặt ngắt PIR đính kèmInterrupt() được mô tả. GPIO 13 được mô tả để phát hiện chuyển động ở chế độ RISING.

    Tiếp theo trong phần loop() của mã, sử dụng hàm millis() chúng ta BẬT và TẮT đèn LED khi đạt được kích hoạt.

    3.4: Đầu ra

    Trong phần đầu ra, chúng ta có thể thấy đối tượng nằm ngoài phạm vi của cảm biến PIR, vì vậy DẪN ĐẾN Được bật TẮT .


    Bây giờ chuyển động được phát hiện bởi đèn LED cảm biến PIR sẽ chuyển sang TRÊN 10 giây sau đó nếu không phát hiện chuyển động, nó sẽ vẫn còn TẮT cho đến khi nhận được kích hoạt tiếp theo.


    Đầu ra sau được hiển thị bởi màn hình nối tiếp trong Arduino IDE.

    Sự kết luận

    Cảm biến PIR với ESP32 có thể giúp phát hiện chuyển động của các vật thể đi qua phạm vi của nó. Sử dụng chức năng ngắt trong lập trình ESP32, chúng ta có thể kích hoạt phản hồi ở một số chân GPIO cụ thể. Khi phát hiện thay đổi, chức năng ngắt sẽ được kích hoạt và đèn LED sẽ BẬT.