Trong hướng dẫn này, bạn sẽ học cách sử dụng ngắt và bộ định thời với ESP8266 NodeMCU bằng Arduino IDE. Ngắt cho phép bạn phát hiện những thay đổi trong trạng thái GPIO mà không cần phải liên tục kiểm tra giá trị hiện tại của nó. Với ngắt, khi một thay đổi được phát hiện, một sự kiện sẽ được kích hoạt (một hàm được gọi).
Ví dụ: chúng tôi sẽ phát hiện chuyển động bằng cảm biến chuyển động PIR: khi phát hiện chuyển động, ESP8266 bắt đầu hẹn giờ và bật đèn LED trong một số giây được xác định trước. Khi đồng hồ đếm ngược kết thúc, đèn LED sẽ tự động tắt.
#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
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;
}
}
How the Code Works ( CODE HOẠT ĐỘNG).
Sau đó, tạo các biến cho phép bạn đặt bộ hẹn giờ để tắt đèn LED sau khi phát hiện chuyển động.
unsigned long now = millis(); unsigned long lastTrigger = 0; boolean startTimer = false;
Biến giữ thời gian hiện tại. Biến Trigger cuối cùng lưu giữ thời gian khi cảm biến PIR phát hiện chuyển động. Bộ hẹn giờ bắt đầu là một biến boolean khởi động bộ hẹn giờ khi phát hiện chuyển động.
setup()
Serial.begin(115200);
Đặt cảm biến Chuyển động PIR làm INPUT_PULLUP.
pinMode(motionSensor, INPUT_PULLUP);
Để đặt chân cảm biến PIR làm chân ngắt, hãy sử dụng hàm AttachInterrupt () như được mô tả trước đó.
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);
Chân sẽ phát hiện chuyển động là GPIO 14 và nó sẽ gọi hàm phát hiện chuyển động Movement() trên chế độ RISING.
Đèn LED là một OUTPUT có trạng thái bắt đầu ở mức THẤP.
pinMode(led, OUTPUT); digitalWrite(led, LOW);
loop()
now = millis();
NGÁT PHÁT HIỆN.
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 vòng lặp Loop (). Lần này, biến startTimer là true. Vì vậy, khi thời gian được xác định bằng giây trôi qua (kể từ khi chuyển động được phát hiện), câu lệnh if sau đây sẽ đúng.
if(startTimer && (now - lastTrigger > (timeSeconds*1000))) { Serial.println("Motion stopped…"); digitalWrite(led, LOW); startTimer = false; }