Tìm kiếm mã

Bài học 14/31-2: Ví dụ 2 về lập trình millis() trên Arduino với sự kiện

Bài học 14/31-2: Ví dụ 2 về lập trình millis() trên Arduino với sự kiện

Trong hướng dẫn này, bạn sẽ học cách sử dụng hàm millis() của Arduino để kích hoạt một hành động chỉ sau khi một khoảng thời gian nhất định đã trôi qua, tất cả mà không chặn phần còn lại của chương trình. Đây là một kỹ thuật cơ bản để tạo ra các dự án Arduino phản hồi nhanh, nơi nhiều tác vụ cần chạy đồng thời, chẳng hạn như nhấp nháy đèn LED trong khi đọc cảm biến hoặc theo dõi các lần nhấn nút. Ví dụ cụ thể này tập trung vào việc kích hoạt một sự kiện sau năm giây, nhưng logic này có thể được áp dụng cho vô số tình huống thực tế.

Xe Sunfounder đã lắp ráp

Dưới đây là một vài ví dụ thực tế về cách bạn có thể sử dụng mẫu này trong các dự án của riêng mình:

  • Kích hoạt trễ: Bật quạt hoặc máy bơm chỉ sau khi hệ thống đã chạy trong một khoảng thời gian nhất định.
  • Khóa liên động an toàn: Yêu cầu một nút phải được nhấn và giữ trong một khoảng thời gian trước khi thực hiện một hành động nguy hiểm, như khởi động động cơ.
  • Cảnh báo dựa trên thời gian: Kích hoạt báo động hoặc thông báo nếu chỉ số cảm biến không thay đổi trong một khoảng thời gian nhất định.
  • Bộ hẹn giờ không chặn: Tạo bộ hẹn giờ "canh gác" để đặt lại thiết bị nếu nó trở nên không phản hồi.

Vấn đề cốt lõi mà điều này giải quyết là hạn chế của hàm delay(). Khi bạn sử dụng delay(5000), Arduino ngừng thực thi bất kỳ mã nào khác trong năm giây đó. Điều này ổn cho các bản phác thảo đơn giản, nhưng nó trở thành một vấn đề lớn trong các dự án phức tạp hơn, nơi bạn cần đọc cảm biến, cập nhật màn hình hoặc lắng nghe các lần nhấn nút trong khi chờ đợi. Hàm millis(), đếm số mili giây kể từ khi bo mạch được bật nguồn, cho phép bạn kiểm tra thời gian mà không tạm dừng chương trình.

Phần cứng cần thiết

  • Bo mạch Arduino (Uno, Nano, Mega, v.v.)
  • Một nút nhấn
  • Dây jumper

Hướng dẫn đấu dây

Việc đấu dây cho ví dụ này rất đơn giản. Nó sử dụng điện trở kéo lên nội bộ, vì vậy không cần điện trở ngoài cho nút nhấn.

  • Kết nối một chân của nút nhấn với chân GND trên Arduino.
  • Kết nối chân còn lại của nút nhấn với chân kỹ thuật số 2 trên Arduino.

Vì chúng ta sử dụng INPUT_PULLUP trong mã, chân sẽ đọc HIGH khi nút không được nhấn và LOW khi nó được nhấn, kết nối chân với đất. (trong video tại 08:29)

Hiểu về mã

Mã này minh họa một bộ hẹn giờ dựa trên sự kiện đơn giản. Chương trình liên tục in giá trị millis() hiện tại ra Serial Monitor. Khi nút nhấn được nhấn và giữ, và Arduino đã chạy ít nhất 5 giây, nó sẽ in "Take action" ra Serial Monitor. Điểm mấu chốt là việc kiểm tra millis() không dừng việc in thời gian liên tục.

Hãy phân tích các phần có thể cấu hình của mã:

unsigned long event = 5000;// 5 giây

Đây là biến quan trọng nhất để cấu hình. Nó xác định thời lượng của "sự kiện" của bạn tính bằng mili giây. Trong ví dụ này, nó được đặt thành 5000, tương đương 5 giây. Để thay đổi độ trễ, chỉ cần sửa số này. Ví dụ: đặt thành 10000 sẽ làm cho hành động kích hoạt sau 10 giây. Điều quan trọng là phải sử dụng kiểu dữ liệu unsigned long, vì giá trị của millis() có thể trở nên rất lớn và cuối cùng sẽ vượt quá giá trị tối đa của biến int tiêu chuẩn, gây ra lỗi trong so sánh. (trong video tại 05:46)

pinMode(2,INPUT_PULLUP);

Dòng này cấu hình chân kỹ thuật số 2 làm đầu vào và kích hoạt điện trở kéo lên nội bộ của nó. Đây là một bước cấu hình quan trọng cho phép bạn kết nối nút mà không cần điện trở ngoài. Chân sẽ đọc HIGH theo mặc định và sẽ chuyển sang LOW khi nút được nhấn, kết nối nó với đất. Nếu bạn muốn sử dụng một chân khác, hãy thay đổi số 2 ở đây và trong dòng digitalRead(2) bên trong vòng lặp. (trong video tại 08:46)

Logic bên trong loop() rất đơn giản. Nó đọc trạng thái của nút. Nếu nút được nhấn (pb == LOW), nó sẽ kiểm tra xem thời gian hiện tại (millis()) có lớn hơn hoặc bằng thời gian event bạn đã xác định hay không. Nếu cả hai điều kiện đều đúng, nó sẽ in thông báo hành động. Phần còn lại của vòng lặp, in thời gian, tiếp tục chạy không bị gián đoạn, chứng minh sức mạnh của millis() so với delay().

Ví dụ này kiểm tra thời gian từ lúc Arduino khởi động. Ví dụ thứ ba trong loạt video xây dựng dựa trên điều này bằng cách ghi lại thời gian của lần nhấn nút đầu tiên và kích hoạt một hành động chỉ khi lần nhấn thứ hai xảy ra ít nhất 5 giây sau đó. Logic đó được trình bày trong Bài 14/31-3: Ví dụ mã hóa Arduino millis() 3 với nút nhấn.

Trình diễn dự án trực tiếp

Sau khi bạn tải mã lên và mở Serial Monitor (ở tốc độ 9600 baud), bạn sẽ thấy một luồng số liên tục, đại diện cho số mili giây kể từ khi bo mạch được bật nguồn. Nếu bạn nhấn và giữ nút nhấn trước khi 5 giây trôi qua, sẽ không có gì xảy ra. Tuy nhiên, nếu bạn nhấn và giữ nút sau mốc 5 giây, bạn sẽ thấy thông báo "Take action" được in trong Serial Monitor. Hành động sẽ tiếp tục in miễn là nút được giữ. Điều này chứng minh một bộ hẹn giờ không chặn cho phép mã khác (việc in) chạy liền mạch. (trong video tại 10:52)

Các dự án liên quan từ video này

Video này là một phần của chuỗi nhiều phần về các hàm định thời gian và ánh xạ trên Arduino. Khám phá các hướng dẫn khác được tạo từ cùng nguồn tài liệu này:

Chương

  • [00:00] Giới thiệu về millis() và bộ kit SunFounder
  • [01:19] millis() là gì và tại sao dùng nó thay vì delay()?
  • [03:06] Trình diễn thực tế: in giá trị millis()
  • [05:46] Tạo một sự kiện với millis() và unsigned long
  • [08:29] Đấu dây và lập trình nút nhấn với INPUT_PULLUP
  • [10:52] Chạy ví dụ sự kiện với nút nhấn
  • [12:14] Xem trước ví dụ 3: phát hiện lần nhấn nút thứ hai
  • [17:20] Giới thiệu về hàm map()
  • [19:47] Lập trình và trình diễn hàm map() với đèn LED

Hình ảnh

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
Ngôn ngữ: C++
/*
Lesson 14/31: Arduino coding millis() example 2 with event
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


unsigned long event = 5000;// 5 seconds
void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // Robojax.com millis() example 1
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW)
  {
      if(millis() >= event)
      {
        Serial.println("Take action");
      }// if end
  }// if end
  
}// loop end

Tài nguyên & tài liệu tham khảo

Tập tin📁

Hướng dẫn Sử dụng