Trong hướng dẫn này, bạn sẽ học cách sử dụng ngắt và bộ đếm trên ESP8266 NodeMCU với Arduino IDE. Ngắt cho phép bạn phát hiện sự thay đổi trong trạng thái GPIO mà không cần kiểm tra giá trị hiện tại của nó liên tục. Với ngắt, khi phát hiện sự thay đổi, một sự kiện được kích hoạt (một hàm được gọi).
21:33 05/04/2023 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) Trong hướng dẫn này, bạn học cách sử dụng ngắt hẹn với ESP8266 NodeMCU Arduino IDE Ngắt cho phép bạn phát thay đổi trạng thái GPIO mà không cần phải liên tục kiểm tra giá trị Với ngắt, thay đổi phát hiện, kiện kích hoạt (một chức gọi) Ví dụ: chúng tơi phát chuyển động cảm biến chuyển động PIR: phát chuyển động, ESP8266 bắt đầu hẹn bật đèn LED số giây xác định trước Khi hẹn kết thúc đếm ngược, đèn LED tự động tắt Để tạo ngắt, gọi attachmentInterrupt() chuyển làm đối số chân ngắt GPIO, ISR (chức gọi) chế độ Hàm ISR phải khai báo thuộc tính ICACHE_RAM_ATTR Chế độ THAY ĐỔI , TĂNG GIẢM attachInterrupt(digitalPinToInterrupt(GPIO), ISR, mode); Trước tiếp tục với hướng dẫn này, bạn nên cài đặt tiện ích bổ sung ESP8266 Arduino IDE Làm theo hướng dẫn để Cài đặt ESP8266 Arduino IDE , bạn chưa cài đặt Giới thiệu ngắt ESP8266 Ngắt hữu ích để làm cho thứ diễn tự động chương trình vi điều khiển giúp giải vấn đề thời gian https://www.printfriendly.com/p/g/CvVzVa 1/12 21:33 05/04/2023 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) Với ngắt, bạn không cần phải liên tục kiểm tra giá trị pin Khi thay đổi phát hiện, kiện kích hoạt – chức gọi Chức gọi thường trình dịch vụ ngắt (ISR) Khi ngắt xảy ra, xử lý dừng thực chương trình để thực tác vụ, sau quay lại chương trình minh họa hình bên Điều đặc biệt hữu ích để kích hoạt hành động phát chuyển động nhấn nút ấn mà không cần phải liên tục kiểm tra trạng thái Hàm AttachInterrupt() Để thiết lập ngắt Arduino IDE, bạn sử dụng hàm attachmentInterrupt() , nhận làm đối số: chân ngắt GPIO, tên hàm thực thi chế độ: attachInterrupt(digitalPinToInterrupt(GPIO), ISR, mode); Chân ngắt GPIO Đối số ngắt GPIO Bạn nên sử dụng digitalPinToInterrupt(GPIO) để đặt GPIO thực tế làm chân ngắt Ví dụ: bạn muốn sử dụng GPIO 14 làm ngắt, sử dụng: digitalPinToInterrupt(14) ESP8266 hỗ trợ ngắt GPIO nào, ngoại trừ GPIO16 ISR Đối số thứ hai hàm attachmentInterrupt() tên hàm gọi ngắt kích hoạt – thường trình dịch vụ ngắt (ISR) Chức ISR phải đơn giản tốt để xử lý quay lại thực chương trình cách nhanh chóng https://www.printfriendly.com/p/g/CvVzVa 2/12 21:33 05/04/2023 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) Cách tiếp cận tốt báo hiệu mã ngắt xảy cách sử dụng biến toàn cục vịng lặp () kiểm tra xóa cờ thực thi mã ISR cần phải có ICACHE_RAM_ATTR trước định nghĩa chức để chạy mã ngắt RAM chế độ ngắt Đối số thứ ba chế độ có chế độ khác nhau: THAY ĐỔI: để kích hoạt ngắt chân thay đổi giá trị - ví dụ từ CAO xuống THẤP THẤP lên CAO; FALLING: chân chuyển từ CAO xuống THẤP; RISING: để kích hoạt chân từ THẤP lên CAO Ví dụ chúng tơi, sử dụng chế độ RISING, cảm biến chuyển động PIR phát chuyển động, GPIO mà kết nối chuyển từ THẤP sang CAO Giới thiệu Bộ hẹn ESP8266 Đối với hướng dẫn này, sử dụng hẹn Chúng muốn đèn LED sáng số giây định trước sau phát chuyển động Thay sử dụng hàm delay() chặn mã bạn không cho phép bạn làm điều khác số giây xác định, sử dụng đếm thời gian độ trễ () so với millis () Hàm delay() chấp nhận số int làm đối số Con số biểu thị thời gian tính mili giây mà chương trình phải đợi chuyển sang dịng mã delay(time in milliseconds); Khi bạn gọi độ trễ (1000), chương trình bạn dừng dịng giây delay() chức chặn Các chức chặn ngăn chương trình thực điều khác nhiệm vụ cụ thể hồn thành Nếu bạn cần nhiều tác vụ xảy lúc, bạn sử dụng delay() Đối với hầu hết dự án, bạn nên tránh sử dụng độ trễ thay vào sử dụng hẹn https://www.printfriendly.com/p/g/CvVzVa 3/12 21:33 05/04/2023 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) Sử dụng hàm gọi millis() , bạn trả số mili giây trơi qua kể từ chương trình bắt đầu lần millis(); Tại chức hữu ích? Bởi cách sử dụng số phép tốn, bạn dễ dàng xác minh lượng thời gian trơi qua mà khơng chặn mã Nháy đèn LED millis() (không chậm trễ) Nếu bạn chưa quen với hàm millis() , khuyên bạn nên đọc phần Nếu bạn quen thuộc với hẹn giờ, bạn bỏ qua dự án cảm biến chuyển động PIR Đoạn mã sau cho biết cách bạn sử dụng hàm millis() để tạo dự án nháy mắt Nó bật đèn LED 1000 mili giây tắt https://www.printfriendly.com/p/g/CvVzVa 4/12 21:33 05/04/2023 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) /********* Rui Santos Complete project details at https://randomnerdtutorials.com *********/ // constants won't change Used here to set a pin number : const int ledPin = 26; // the number of the LED pin // Variables will change : int ledState = LOW; ledState used to set the LED // // Generally, you should use "unsigned long" for variables that hold time // The value will quickly become too large for an int to store unsigned long previousMillis = 0; // will store last time LED was updated // constants won't change : const long interval = 1000; which to blink (milliseconds) // interval at void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT); } void loop() { // here is where you'd put code that needs to be running all the time // check to see if it's time to blink the LED; that is, if the // difference between the current time and last time you blinked // the LED is bigger than the interval at which you want to // blink the LED unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); } } Xem mã thô Cách thức hoạt động mã Chúng ta xem xét kỹ phác thảo nhấp nháy hoạt động mà không cần hàm delay() (thay vào đó, sử dụng hàm millis() ) Về bản, mã trừ thời gian ghi trước ( previousMillis ) khỏi thời gian ( currentMillis ) Nếu phần lại lớn khoảng thời gian (trong trường hợp 1000 https://www.printfriendly.com/p/g/CvVzVa 5/12 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) 21:33 05/04/2023 mili giây), chương trình cập nhật biến previousMillis thành thời điểm bật tắt đèn LED if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; ( ) Bởi đoạn mã khơng bị chặn, mã nằm bên câu lệnh if hoạt động bình thường Bây bạn hiểu bạn thêm tác vụ khác vào hàm loop() mã bạn nhấp nháy đèn LED giây Bạn tải mã lên ESP8266 để kiểm tra Đèn LED bo mạch nhấp nháy giây ESP8266 NodeMCU với Cảm biến chuyển động PIR Trong phần này, bạn tìm hiểu cách phát chuyển động cảm biến chuyển động PIR cách sử dụng ngắt hẹn mã bạn Bộ phận bắt buộc Dưới danh sách phần cần thiết để hoàn thành hướng dẫn này: ESP8266 (đọc bảng phát triển ESP8266 tốt ) Cảm biến chuyển động PIR (AM312) https://www.printfriendly.com/p/g/CvVzVa 6/12 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) 21:33 05/04/2023 đèn LED 5mm điện trở 330 Ohm bánh mì dây nhảy Sơ đồ Lắp cảm biến chuyển động PIR đèn LED vào ESP8266 bạn Chúng kết nối đèn LED với GPIO 12 (D6) chân liệu cảm biến chuyển động PIR với GPIO 14 (D5) https://www.printfriendly.com/p/g/CvVzVa 7/12 21:33 05/04/2023 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) Đề xuất đọc: Hướng dẫn tham khảo sơ đồ chân ESP8266 Quan trọng: Cảm biến chuyển động Mini AM312 PIR sử dụng dự án hoạt động mức 3,3V Tuy nhiên, bạn sử dụng cảm biến chuyển động PIR khác HC- https://www.printfriendly.com/p/g/CvVzVa 8/12 21:33 05/04/2023 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) SR501, hoạt động mức 5V Bạn sửa đổi để hoạt động mức 3,3V cần cấp nguồn cho chân Vin Hình cho thấy sơ đồ chân cảm biến chuyển động AM312 PIR Mã số Sau đấu dây mạch sơ đồ nguyên lý, chép mã cung cấp vào Arduino IDE bạn Bạn tải lên mã nguyên trạng bạn sửa đổi số giây đèn LED sáng sau phát chuyển động Chỉ cần thay đổi biến timeSeconds số giây bạn muốn /********* Rui Santos Complete project details at https://randomnerdtutorials.com *********/ #define timeSeconds 10 // Set GPIOs for LED and PIR Motion Sensor const int led = 12; const int motionSensor = 14; // Timer: Auxiliary variables unsigned long now = millis(); unsigned long lastTrigger = 0; boolean startTimer = false; // Checks if motion was detected, sets LED HIGH and starts a timer ICACHE_RAM_ATTR void detectsMovement() { Serial.println("MOTION DETECTED!!!"); digitalWrite(led, HIGH); startTimer = true; lastTrigger = millis(); } void setup() { // Serial port for debugging purposes https://www.printfriendly.com/p/g/CvVzVa 9/12 21:33 05/04/2023 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) Serial.begin(115200); // PIR Motion Sensor mode INPUT_PULLUP pinMode(motionSensor, INPUT_PULLUP); // Set motionSensor pin as interrupt, assign interrupt function and set RISING mode attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING); // Set LED to LOW pinMode(led, OUTPUT); digitalWrite(led, LOW); } void loop() { // Current time now = millis(); // Turn off the LED after the number of seconds defined in the timeSeconds variable if(startTimer && (now - lastTrigger > (timeSeconds*1000))) { Serial.println("Motion stopped "); digitalWrite(led, LOW); startTimer = false; } } Xem mã thô Cách thức hoạt động mã Chúng ta xem mã Bắt đầu cách gán hai chân GPIO cho biến led motionSensor const int led = 12; const int motionSensor = 14; Sau đó, tạo biến cho phép bạn đặt hẹn để tắt đèn LED sau phát chuyển động unsigned long now = millis(); unsigned long lastTrigger = 0; boolean startTimer = false; Biến now giữ thời gian Biến lastTrigger giữ thời gian cảm biến PIR phát chuyển động startTimer biến boolean khởi động hẹn phát chuyển động cài đặt() Trong setup() , bắt đầu cách khởi tạo cổng nối tiếp tốc độ 115200 baud Serial.begin(115200); Đặt cảm biến chuyển động PIR INPUT_PULLUP pinMode(motionSensor, INPUT_PULLUP); https://www.printfriendly.com/p/g/CvVzVa 10/12 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) 21:33 05/04/2023 Để đặt chân cảm biến PIR làm ngắt, sử dụng hàm attachmentInterrupt() mơ tả trước attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING); Chân phát chuyển động GPIO 14 gọi hàm detectMovement() chế độ RISING Đèn LED ĐẦU RA có trạng thái bắt đầu mức THẤP pinMode(led, OUTPUT); digitalWrite(led, LOW); vòng() Hàm loop () liên tục chạy chạy lại Trong vòng lặp, biến now cập nhật với thời gian now = millis(); Khơng có khác thực loop() Tuy nhiên, phát chuyển động, chức detectsMovement() gọi đặt ngắt trước setup() Hàm detectMovement() in thơng báo Màn hình nối tiếp, bật đèn LED, đặt biến boolean startTimer thành true cập nhật biến lastTrigger với thời gian ICACHE_RAM_ATTR void detectsMovement() { Serial.println("MOTION DETECTED!!!"); digitalWrite(led, HIGH); startTimer = true; lastTrigger = millis(); } Sau bước này, mã quay trở lại loop() Lần này, biến startTimer true Vì vậy, thời gian xác định giây trôi qua (kể từ phát chuyển động), câu lệnh if sau if(startTimer && (now - lastTrigger > (timeSeconds*1000))) { Serial.println("Motion stopped…"); digitalWrite(led, LOW); startTimer = false; } Thông báo “Chuyển động dừng…” in Màn hình Nối tiếp, đèn LED bị tắt biến startTimer đặt thành false trình diễn Tải mã lên ESP8266 bạn Đảm bảo bạn chọn bo mạch cổng COM Mở Màn hình nối tiếp tốc độ truyền 115200 https://www.printfriendly.com/p/g/CvVzVa 11/12 21:33 05/04/2023 Bộ định thời ngắt ESP8266 sử dụng Arduino IDE (NodeMCU) Di chuyển bàn tay bạn trước cảm biến PIR Đèn LED bật thơng báo in Màn hình nối tiếp có nội dung “ PHÁT HIỆN CHUYỂN ĐỘNG!!! ” Sau 10 giây, đèn LED tắt kết thúc Tóm lại, ngắt hữu ích để phát thay đổi trạng thái GPIO kích hoạt chức Bạn học bạn nên sử dụng hẹn để viết mã không chặn https://www.printfriendly.com/p/g/CvVzVa 12/12