ESP32 Ngắt và hẹn giờ với cảm biến PIR sử dụng Arduino IDE

ESP32 Ngắt và hẹn giờ với cảm biến PIR sử dụng Arduino IDE

Giới thiệu về Ngắt

Ngắt được sử dụng để xử lý các sự kiện không xảy ra trong quá trình thực thi tuần tự của một chương trình. Ví dụ: chúng tôi muốn thực hiện một số tác vụ nhất định và các tác vụ này thực thi tuần tự trong chương trình Arduino của bạn. Nhưng có rất ít tác vụ chỉ thực thi khi một sự kiện đặc biệt xảy ra như tín hiệu kích hoạt bên ngoài đến chân đầu vào kỹ thuật số của bộ vi điều khiển.

Ngắt bên ngoài hoặc 'ngắt phần cứng' là do mô-đun phần cứng bên ngoài gây ra. Ví dụ: có một Touch Interrupt xảy ra khi cảm ứng được phát hiện và ngắt GPIO khi nhấn phím. Trong hướng dẫn này, ngắt sẽ được kích hoạt khi chuyển động sẽ được phát hiện.

Với ngắt, chúng ta không cần phải liên tục kiểm tra trạng thái của chân đầu vào kỹ thuật số. Khi một ngắt xảy ra (một thay đổi được phát hiện), bộ xử lý dừng thực thi chương trình chính và một chức năng được gọi là ISR hoặc Interrupt Service Routine. Sau đó, bộ xử lý tạm thời hoạt động trên một tác vụ khác (ISR) và sau đó quay lại chương trình chính sau khi quy trình xử lý kết thúc. Điều này được thể hiện trong hình dưới đây.

Cách thức hoạt động của ngắt

Quá trình ngắt

Một ví dụ có thể là nhấn nút nhấn hoặc phát hiện chuyển động bằng Cảm biến PIR. Trong cả hai trường hợp, nút nhấn hoặc cảm biến chuyển động PIR có thể được sử dụng để kích hoạt ngắt. Do đó, khi một sự kiện bên ngoài xảy ra, bộ xử lý sẽ dừng những gì nó đang làm và thực thi quy trình dịch vụ ngắt mà chúng ta xác định cho sự kiện tương ứng. Sau đó, nó trở lại chương trình hiện tại. Ngắt bên ngoài cực kỳ hữu ích vì với sự trợ giúp của chúng, chúng tôi không phải liên tục theo dõi trạng thái chân đầu vào kỹ thuật số.

Chân ngắt ESP32

Đối với ESP32, chúng tôi có thể sử dụng tất cả các chân GPIO cho ngắt bên ngoài ngoại trừ GPIO6, GPIO7, GPIO8, GPIO9, GPIO10 và GPIO11. Sơ đồ dưới đây cho thấy sơ đồ chân của các chân GPIO trong ESP32 có thể được sử dụng.

ESP32 Chân ngắt

Định cấu hình ngắt trong Arduino IDE

Bây giờ chúng ta hãy xem cách thiết lập các ngắt bên ngoài trong bảng phát triển ESP32 của chúng ta bằng Arduino IDE. Các bước sau đây cần phải được thực hiện theo.

Chúng tôi sẽ sử dụng chức năng sau để định cấu hình ngắt trong Arduino IDE:

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)

Hàm attachInterrupt() có ba đối số:

  • digitalPinToInterrupt (pin): Đây là một chức năng lấy chân GPIO của bảng ESP làm tham số bên trong nó. Chân biểu thị GPIO được liên kết với chân sẽ gây ra sự gián đoạn xảy ra. Ví dụ: nếu đặt GPIO2 làm chân ngắt, chức năng sẽ được chỉ định là digitalPinToInterrupt (2). Bạn có thể sử dụng bất kỳ chân ngắt ESP32 nào được hiển thị trong sơ đồ trên, như một tham số bên trong hàm này.

  • ISR: Đây là đối số thứ hai được sử dụng để thiết lập ngắt. Nó là một loại chức năng đặc biệt được gọi là Interrupt Service Routine không có tham số và cũng không trả về gì. Bất cứ khi nào ngắt sẽ xảy ra, chức năng này sẽ được gọi.

  • mode: Điều này biểu thị hành động kích hoạt để ngắt xảy ra. Bốn tham số sau được sử dụng để chỉ định chế độ:

THẤP: Điều này được sử dụng để kích hoạt ngắt khi chân ở trạng thái thấp.

THAY ĐỔI: Điều này được sử dụng để kích hoạt ngắt khi chân thay đổi trạng thái (CAO-THẤP hoặc THẤP-CAO)

TĂNG: Điều này được sử dụng để kích hoạt ngắt khi chân đi từ THẤP đến CAO.

cạnh tăng làm gián đoạn micropython

GIẢM: Điều này được sử dụng để kích hoạt ngắt khi chân đi từ CAO xuống THẤP.

cạnh rơi làm gián đoạn micropython

Bộ hẹn giờ sử dụng Arduino IDE

Trong dự án cảm biến chuyển động PIR của chúng tôi, chúng tôi muốn đèn LED luôn BẬT trong một số giây nhất định bất cứ khi nào chuyển động được phát hiện và TẮT sau khi thời gian kết thúc. Để làm điều đó, chúng ta sẽ sử dụng hàm millis() sẽ hoạt động như một bộ đếm thời gian. Sử dụng hàm delay (ms) cũng là một tùy chọn nhưng hàm này mất thời gian tính bằng mili giây như một tham số bên trong nó, biểu thị thời gian mà mã chương trình ngừng chạy và bị tạm dừng.

Cảm biến màn hình PIR với bộ hẹn giờ interrrupt ESP32

Thay vào đó, chúng ta sẽ sử dụng hàm millis() không chặn mã và trả về thời gian tính bằng mili giây đã trôi qua kể từ khi chương trình được chạy. Thật tiện lợi và là lựa chọn ưu tiên để sử dụng chức năng này thay vì độ trễ (ms). Bằng cách sử dụng hàm millis() và áp dụng một số logic, chúng ta có thể dễ dàng đạt được hiệu quả của bộ đếm thời gian.

Đèn LED nhấp nháy sử dụng millis ()

Trước khi tiếp tục với dự án của chúng tôi với cảm biến chuyển động PIR, trước tiên chúng tôi sẽ trình bày một ví dụ đơn giản. Trong ví dụ này, chúng ta sẽ nhấp nháy một đèn LED bằng cách sử dụng hàm millis() trong Arduino IDE sau mỗi 2 giây.

Các thành phần bắt buộc:

  • Một bảng phát triển ESP32

  • Một đèn LED 5mm

  • Một điện trở 220 ohm

  • Kết nối dây

  • Breadboard

Sơ đồ 

Lắp ráp mạch như hình dưới đây trong sơ đồ 

Kết nối GPIO22 của ESP32 với cực dương LED. Ngoài ra, hãy đảm bảo kết nối cực âm của đèn LED với chân nối đất của bảng ESP32 thông qua điện trở giới hạn dòng điện 220 ohm. Bạn có thể sử dụng bất kỳ chân GPIO đầu ra thích hợp nào.

Arduino Sketch: Đèn LED nhấp nháy sử dụng millis ()

Mở Arduino IDE của bạn và đi tới Tệp > Mới. Một tệp mới sẽ mở ra. Sao chép mã được cung cấp bên dưới trong tệp đó và lưu nó.

const int led_pin =  22;   

int state = LOW;          

 

unsigned long previous_time = 0;        

const long interval = 2000;           

 

void setup() {

 

  pinMode(led_pin, OUTPUT);

}

 

void loop() {

  unsigned long current_time = millis();

 

  if (current_time - previous_time >= interval) {

    

    previous_time = current_time;

    if (state == LOW) {

      state = HIGH;

    } else {

      state = LOW;

    }

 

    digitalWrite(led_pin, state);

  }

}

Mã hoạt động như thế nào?

Đầu tiên, chúng tôi sẽ xác định chân GPIO mà qua đó đèn LED được kết nối. Đó là GPIO22 trong trường hợp của chúng tôi. Ngoài ra, chúng tôi sẽ đặt trạng thái của đèn LED thành THẤP để ban đầu nó sẽ TẮT.

const int led_pin =  22;   

int state = LOW; 

Tiếp theo, chúng ta sẽ tạo các biến để lưu độ dài khoảng thời gian tính bằng mili giây và previous_time theo dõi bộ đếm thời gian. Chúng tôi đã đặt khoảng thời gian thành 2000ms, tức là 2 giây. Sau mỗi 2 giây, đèn LED sẽ chuyển đổi. Hãy thoải mái thay đổi khoảng thời gian theo nhu cầu của bạn.

unsigned long previous_time = 0;        

const long interval = 2000;    

Bên trong chức năng thiết lập, chúng tôi sẽ đặt chân GPIO làm chân đầu ra bằng pinMode () và truyền led_pin và OUTPUT làm tham số bên trong nó.

void setup() {

 

pinMode(led_pin, OUTPUT);

}

Bên trong hàm loop(), trước tiên chúng ta sẽ định nghĩa một biến gọi là current_time. Hàm này sẽ được đặt làm hàm millis(). Do đó, biến current_time sẽ trả về thời gian tính bằng mili giây đã trôi qua kể từ khi chương trình được chạy.

 unsigned long current_time = millis();

Bây giờ chúng ta sẽ kiểm tra xem current_time trừ đi previous_time lớn hơn hay bằng 2 giây thì previous_time sẽ được đặt làm current_time. Ngoài ra, đèn LED cũng sẽ chuyển đổi tương ứng bằng cách cập nhật biến 'state' và sử dụng hàm digitalWrite ().

if (current_time - previous_time >= interval) {

    

    previous_time = current_time;

    if (state == LOW) {

      state = HIGH;

    } else {

      state = LOW;

    }

 

    digitalWrite(led_pin, state);

  }

Do đó, sau mỗi 2 giây, đèn LED sẽ nhấp nháy mà không tạm dừng mã chương trình.

Demonstration

Chọn đúng bảng và cổng COM trước khi tải mã của bạn lên bảng. Đi tới Bảng > Công cụ và chọn Mô-đun ESP32 Dev.

Tiếp theo, đi tới Công cụ > Cổng và chọn cổng thích hợp mà qua đó bảng của bạn được kết nối.
Nhấp vào nút tải lên để tải mã lên bảng phát triển ESP32.
Sau khi bạn đã tải mã của mình lên bảng phát triển, hãy nhấn nút BẬT của nó.

Nút đặt lại bật ESP32

Đèn LED sẽ bắt đầu nhấp nháy sau mỗi 2 giây.

Đèn LED nhấp nháy ESP32

Cảm biến chuyển động PIR với ESP32

Bây giờ chúng tôi sẽ tiến hành thêm với dự án của mình và bao gồm cả cảm biến chuyển động PIR.

Có rất nhiều cảm biến PIR có sẵn trên thị trường nhưng chúng tôi đang sử dụng cảm biến chuyển động PIR thụ động trong dự án này. Nó có thể phát hiện chuyển động của con người trong phạm vi 10m rất dễ dàng. Nó có ba chân và chức năng của mỗi chân được mô tả dưới đây:

  • GND: Nó là một chân nối đất và bạn nên kết nối nó với mặt đất của bảng ESP32 của mình.

  • VDD: Đây là chân nhà cung cấp điện và bạn nên kết nối nó với Vin của bo mạch ESP32 của chúng tôi.

  • Đầu ra: Nó là một chân đầu ra của cảm biến PIR. Về cơ bản, chúng tôi nhận được đầu ra từ chân này. Chúng tôi sẽ kết nối nó với một trong các chân GPIO ngắt của bảng ESP32 của chúng tôi.

Cảm biến chuyển động PIR hoạt động

Cảm biến PIR là cảm biến dò chuyển động giá rẻ. Nó là một cảm biến chuyển động thụ động có nghĩa là nó chỉ có thể phát hiện ra thứ gì đó xung quanh nó và nó không thể truyền bất cứ thứ gì. Bất cứ khi nào có chuyển động xung quanh cảm biến, nó sẽ phát hiện nhiệt của cơ thể con người và tạo ra logic đầu ra cao 1 ở đầu ra của cảm biến. Mọi vật thể đều phát ra tia hồng ngoại khi chúng được làm nóng và theo cùng một nguyên tắc, cơ thể con người phát ra tia hồng ngoại do nhiệt độ cơ thể. Do đó, bất cứ khi nào cảm biến chuyển động phát hiện cơ thể người xung quanh nó, đầu ra của nó sẽ trở nên cao. Chúng ta cũng có thể điều chỉnh độ nhạy của cảm biến này bằng cách thay đổi các điện trở thay đổi có sẵn trên cảm biến. Một điện trở thay đổi dùng để điều chỉnh độ nhạy của khoảng cách và một điện trở thay đổi khác dùng để điều chỉnh độ nhạy của thời gian là khoảng thời gian mà đầu ra phải cao.

Sơ đồ

Sau khi học tất cả các kỹ thuật đã đề cập trước đây, bây giờ chúng tôi đã sẵn sàng để tiến hành dự án phát hiện chuyển động của mình. Bây giờ chúng ta sẽ học cách xử lý ngắt và hẹn giờ trong bảng ESP32 bằng cảm biến PIR và đèn LED. Khi cảm biến PIR phát hiện chuyển động, chúng tôi sẽ bật đèn LED trong 5 giây.

Các thành phần sau đây là bắt buộc:

  • Bảng phát triển ESP32

  • Một cảm biến PIR

  • Một đèn LED 5mm

  • Một điện trở 220 ohm

  • Breadboard

  • Dây kết nối

Giao diện Cảm biến chuyển động PIR và đèn LED với bảng ESP32

Lắp ráp mạch của bạn như thể hiện trong sơ đồ dưới đây:

Cảm biến chuyển động PIR với ESP32 và ngắt MicroPython

Trong sơ đồ trên, chúng ta có thể thấy rằng GPIO14 được kết nối với chân cực dương của đèn LED và chân cực âm được kết nối với mặt bằng chung thông qua điện trở 220 ohm.

Cảm biến PIR mà chúng tôi đang sử dụng trong hướng dẫn này bao gồm ba chân. Hai trong số đó là các chân cung cấp điện như VCC và chân nối đất. Chúng ta có thể cấp nguồn cho cảm biến chuyển động PIR trực tiếp từ chân nguồn ESP32 như thể hiện trong sơ đồ trên. Chân trung tâm là chân đầu ra cung cấp xung cao hoạt động bất cứ khi nào phát hiện chuyển động. Nếu không, chân này vẫn hoạt động thấp. Điều đó có nghĩa là cạnh tăng xảy ra khi cảm biến PIR phát hiện chuyển động. Chúng tôi có thể phát hiện cạnh đang tăng này với sự trợ giúp của các chân ngắt của ESP32. Ở đây chúng tôi đã kết nối chân đầu ra của cảm biến với GPIO13. Bạn có thể sử dụng bất kỳ chân GPIO ngắt ESP32 thích hợp nào mà chúng tôi đã chỉ cho bạn khi bắt đầu.

Cảm biến PIR hoạt động như thế nào với Ngắt bên ngoài?

Cảm biến PIR hoạt động như một nguồn cho ngắt bên ngoài. Điều đó có nghĩa là chúng tôi kết nối đầu ra của cảm biến PIR với chân GPIO của ESP32 và ESP8266. Hơn nữa, chúng tôi gắn ngắt kích hoạt cạnh tăng vào chân GPIO này. Điều đó có nghĩa là chân GPIO này sẽ kích hoạt ngắt bất cứ khi nào nó cảm nhận được cạnh tăng trên đầu vào của nó.

Khi cảm biến PIR phát hiện chuyển động, một ngắt bên ngoài được gây ra, đèn LED sẽ BẬT trong 5 giây và sau đó TẮT trong 5 giây và quá trình lặp lại. Chúng tôi sẽ theo dõi 5 giây thông qua bộ đếm thời gian trong bản phác thảo chương trình của chúng tôi.

Bản phác thảo Arduino

Mở Arduino IDE của bạn và đi tới Tệp > Mới để mở tệp mới. Sao chép mã được cung cấp bên dưới trong tệp đó và lưu nó.

const int led_pin = 14;

const int sensor_pin = 13;

 

const long interval = 5000;

unsigned long current_time = millis();

unsigned long last_trigger = 0;

boolean timer_on = false;

 

void IRAM_ATTR movement_detection() {

  Serial.println("Motion was detected");

  digitalWrite(led_pin, HIGH);

  timer_on = true;

  last_trigger = millis();

}

 

void setup() {

 

  Serial.begin(115200);

 

  pinMode(sensor_pin, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(sensor_pin), movement_detection, RISING);

  pinMode(led_pin, OUTPUT);

  digitalWrite(led_pin, LOW);

}

 

void loop() {

 

  current_time = millis();

  if(timer_on && (current_time - last_trigger > interval)) {

    Serial.println("Motion has stopped");

    digitalWrite(led_pin, LOW);

    timer_on = false;

  }

}

Mã hoạt động như thế nào?

Đầu tiên, chúng tôi sẽ xác định chân GPIO mà qua đó đèn LED được kết nối. Đó là GPIO14 trong trường hợp của chúng tôi. Ngoài ra, chúng tôi sẽ xác định chân GPIO mà qua đó cảm biến chuyển động PIR được kết nối. Đó là GPIO13 trong trường hợp của chúng tôi.

const int led_pin = 14;

const int sensor_pin = 13;

Tiếp theo, chúng ta sẽ tạo ra các biến. Một trong số đó là lưu độ dài khoảng thời gian tính bằng mili giây. Chúng tôi đã đặt khoảng thời gian thành 5000ms, tức là 5 giây. Sau mỗi 5 giây, đèn LED sẽ chuyển đổi. Hãy thoải mái thay đổi khoảng thời gian theo nhu cầu của bạn. Biến current_time được đặt thành hàm millis(), last_trigger là <> và timer_on được đặt thành false. Chúng tôi sẽ sử dụng tất cả các biến này để theo dõi chức năng hẹn giờ một cách thích hợp.

const long interval = 5000;

unsigned long current_time = millis();

unsigned long last_trigger = 0;

boolean timer_on = false;

IRAM_ATTR movement_detection()

Tiếp theo, chúng ta sẽ định nghĩa hàm sẽ hoạt động như Interrupt Service Routine (ISR). Nó được gọi là movement_detection(). Bất cứ khi nào cảm biến PIR sẽ phát hiện một chuyển động, chức năng này sẽ được gọi. Nó sẽ in 'Chuyển động đã được phát hiện' trong màn hình nối tiếp. Ngoài ra, đèn LED cũng sẽ BẬT. Điều này sẽ đạt được bằng cách sử dụng hàm digitalWrite() và sử dụng led_pin và HIGH làm tham số bên trong nó. Chúng ta sẽ thiết lập biến timer_on thành true và last_trigger thành millis().

void IRAM_ATTR movement_detection() {

  Serial.println("Motion was detected");

  digitalWrite(led_pin, HIGH);

  timer_on = true;

  last_trigger = millis();

}

thiết lập()

Bên trong hàm setup(), chúng ta sẽ mở một kết nối nối tiếp với tốc độ truyền 115200 và thiết lập GPIO của mô-đun cảm biến PIR dưới dạng pullup đầu vào.

Serial.begin(115200);

pinMode(sensor_pin, INPUT_PULLUP);

Tiếp theo, chúng ta sẽ thiết lập interrupt bằng cách sử dụng hàm attachInterrupt() và truyền ba đối số bên trong nó. Chúng bao gồm chức năng digitalPinToInterrupt (sensor_pin) định cấu hình ngắt với chân được kết nối với cảm biến PIR, ISR là chức năng movement_detection mà chúng tôi đã xác định trước đó và cuối cùng là RISING là chế độ cho ngắt được thiết lập. sensor_pin sẽ phát hiện chuyển động và gọi hàm movement_detection bất cứ khi nào trạng thái của chân sẽ chuyển từ THẤP sang CAO.

attachInterrupt(digitalPinToInterrupt(sensor_pin), movement_detection, RISING);

Chúng tôi sẽ định cấu hình LED GPIO làm chân đầu ra và đặt nó ở mức THẤP. Điều này có nghĩa là ban đầu đèn LED sẽ TẮT.

pinMode(led_pin, OUTPUT);

digitalWrite(led_pin, LOW);

vòng lặp()

Trong hàm loop(), chúng ta sẽ thiết lập hàm millis() thành current_time và kiểm tra xem bộ đếm thời gian đã bắt đầu chưa và nếu current_time trừ last_trigger lớn hơn 5 giây thì hãy làm như sau:

In 'Chuyển động đã dừng' trên màn hình nối tiếp. TẮT đèn LED bằng cách sử dụng digitalWrite () và đặt biến timer_on thành false.

current_time = millis();

  if(timer_on && (current_time - last_trigger > interval)) {

    Serial.println("Motion has stopped");

    digitalWrite(led_pin, LOW);

    timer_on = false;

  }

 

Demonstration

Chọn đúng bảng và cổng COM trước khi tải mã của bạn lên bảng ESP32. Đi tới Bảng > Công cụ và chọn Mô-đun ESP32 Dev.

Chọn bảng ESP32

Tiếp theo, đi tới Công cụ > Cổng và chọn cổng thích hợp mà qua đó bảng của bạn được kết nối.

Chọn COM PORT ESP32

Nhấp vào nút tải lên để tải mã lên bảng ESP32. Sau khi bạn đã tải mã của mình lên bảng, hãy nhấn nút ENABLE của nó.

Nút đặt lại bật ESP32

Bây giờ di chuyển bàn tay của bạn gần cảm biến PIR và đèn LED sẽ BẬT. Nó sẽ BẬT trong 5 giây và sẽ TẮT trừ khi chuyển động được phát hiện lại.

Cảm biến ESP32 PIR và đèn LED

Mở Màn hình nối tiếp của bạn để xem các thông báo phát hiện chuyển động.

ESP32 PIR Sensor Arduino IDE nối tiếp màn hình demo

Kết luận

Tóm lại, chúng ta đã học được cách sử dụng cảm biến chuyển động PIR với bảng ESP32 trong Arduino IDE bằng cách sử dụng ngắt và hẹn giờ. Chúng tôi đã có thể điều khiển đèn LED thông qua tính năng phát hiện chuyển động luôn BẬT trong một số giây nhất định. Bằng cách sử dụng bộ hẹn giờ, chúng tôi có thể thực hiện thành công dự án này mà không cần chặn mã chương trình.

>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op

>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn