QC

ESP8266 Interrupts and Timers

    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).

Bắt đầu bằng cách gán hai chân GPIO cho các biến led và motionSensor.

const int led = 12; const int motionSensor = 14;

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()

Trong thiết lập  Setup(), bắt đầu bằng cách khởi tạo cổng nối tiếp ở tốc độ truyền 115200.
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()

Hàm loop () liên tục chạy đi chạy lại. Trong mọi vòng lặp, biến được cập nhật với thời gian hiện tại.

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; }


Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...