Tìm kiếm mã

Bài học 14/31-3: Ví dụ lập trình Arduino millis() số 3 với nút nhấn

Bài học 14/31-3: Ví dụ lập trình Arduino millis() số 3 với nút nhấn

Bạn đã bao giờ cần Arduino của mình nhớ khi nào một điều gì đó xảy ra—như một lần nhấn nút—và sau đó thực hiện hành động một khoảng thời gian chính xác sau đó, trong khi vẫn giữ cho phần còn lại của chương trình chạy mượt mà? Đây là một thách thức kinh điển trong lập trình Arduino, và giải pháp là hàm millis(). Hướng dẫn này, một phần của khóa học Arduino Robojax, trình bày một ví dụ thực tế: phát hiện nếu một nút nhấn được nhấn lần thứ hai sau khi đã trôi qua khoảng thời gian trễ 5 giây kể từ lần nhấn đầu tiên. Kỹ thuật này là nền tảng để tạo ra các dự án phản hồi nhanh, không chặn, nơi thời gian là yếu tố quan trọng.

Xe Sunfounder đã lắp ráp

Mẫu sử dụng millis() để theo dõi thời gian mà không dừng chương trình này là thiết yếu cho một loạt các ứng dụng thực tế. Dưới đây là một vài ý tưởng để truyền cảm hứng cho các dự án của riêng bạn:

  • Giao diện nút chống nhiễu: Triển khai một hệ thống nơi một nút phải được giữ trong một khoảng thời gian cụ thể (ví dụ: 3 giây) để bật nguồn thiết bị, ngăn chặn các lần nhấn vô tình.
  • Hành động tuần tự: Tạo một hệ thống nơi một sự kiện, như kích hoạt cảm biến chuyển động, kích hoạt một hành động phụ chỉ xảy ra nếu một sự kiện khác xảy ra trong một khoảng thời gian nhất định.
  • Bộ hẹn giờ tương tác người dùng: Xây dựng một dự án yêu cầu đầu vào "xác nhận" (như lần nhấn nút thứ hai) trong một thời gian đặt trước để thực hiện một chức năng quan trọng, chẳng hạn như gửi lệnh hoặc khởi động động cơ.
  • Kiểm soát cảm biến: Sử dụng tín hiệu đầu tiên từ một cảm biến để bắt đầu một cửa sổ thời gian, trong đó việc đọc từ một cảm biến thứ hai, khác biệt được coi là hợp lệ hoặc bị bỏ qua.

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

Dự án này sử dụng các thành phần từ bộ kit Arduino 3-trong-1 SunFounder, một nguồn tài nguyên tuyệt vời để học tập. Bạn sẽ cần:

  • Bo mạch Arduino (Uno, Nano, v.v.)
  • Một nút nhấn tạm thời
  • 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, nhờ vào điện trở kéo lên nội bộ của Arduino, loại bỏ nhu cầu sử dụng điện trở ngoài. (Trong video tại 08:29)

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

Bằng cách sử dụng INPUT_PULLUP, chân được kết nối nội bộ với 5V, vì vậy nó đọc HIGH bình thường. Khi nút được nhấn, nó kết nối chân với GND, khiến nó đọc LOW. Đây là logic chúng ta sẽ sử dụng trong mã.

Giải thích mã

Cốt lõi của dự án này là logic theo dõi lần nhấn nút đầu tiên và sau đó kiểm tra lần nhấn thứ hai sau một khoảng thời gian cụ thể. Mã được thiết kế để không chặn, nghĩa là nó sẽ không tạm dừng việc thực thi các tác vụ khác trong loop() của bạn.

Ở đầu sketch, bạn sẽ tìm thấy các biến chính có thể cấu hình bởi người dùng kiểm soát hành vi thời gian:

unsigned long event = 5000;// 5 giây
unsigned long buttonPushed =0;
  • event: Đây là biến thời gian quan trọng. Nó đặt thời lượng trễ tính bằng mili giây. Trong ví dụ này, nó được đặt thành 5000, tương đương 5 giây. Bạn có thể thay đổi giá trị này thành bất kỳ khoảng thời gian nào khác để phù hợp với nhu cầu dự án của mình.
  • buttonPushed: Biến này được sử dụng như một cờ và dấu thời gian. Nó bắt đầu ở 0 và được cập nhật thành giá trị của millis() lần đầu tiên nút được nhấn. Thời gian được lưu này sau đó được sử dụng để tính toán sự khác biệt cho việc kiểm tra lần nhấn thứ hai.

Logic trong hàm loop() hoạt động theo hai giai đoạn. Đầu tiên, nó đọc trạng thái của nút và, nếu nó được nhấn lần đầu tiên (pb == LOW && buttonPushed == 0), nó ghi lại thời gian hiện tại qua millis() vào biến buttonPushed. Giai đoạn thứ hai kiểm tra nếu nút vẫn được nhấn và nếu một lần nhấn đầu tiên đã được ghi lại. Nếu vậy, nó tính toán sự khác biệt thời gian giữa thời gian hiện tại và thời gian nhấn đầu tiên. Nếu sự khác biệt này lớn hơn hoặc bằng thời gian event của bạn, nó thực hiện hành động—trong trường hợp này, in một thông điệp ra Serial Monitor.

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

Trong video, mã được tải lên Arduino và Serial Monitor được mở để quan sát hành vi. (Trong video tại 16:03) Bạn sẽ thấy giá trị millis() in liên tục, hiển thị thời gian kể từ khi chương trình bắt đầu. Khi bạn nhấn nút lần đầu tiên, một thông điệp như First push at:5019 được in. Nếu bạn nhấn nút lần nữa và giữ nó trong hơn 5 giây kể từ lần nhấn đầu tiên, thông điệp Action after 5 seconds of first push được in. Điều này chứng minh rằng hành động chỉ được kích hoạt khi lần nhấn thứ hai xảy ra sau khi khoảng thời gian trễ đã trôi qua.

Sức mạnh của cách tiếp cận này là dòng Serial.println(millis()) ở đầu vòng lặp tiếp tục chạy không bị gián đoạn, chứng minh rằng logic thời gian không chặn các mã khác thực thi. Đây là lợi thế cơ bản của việc sử dụng millis() so với hàm delay().

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

Chương

  • [00:00] Giới thiệu về millis() và khóa học
  • [01:19] millis() là gì và tại sao nên dùng?
  • [03:06] Ví dụ thực tế đầu tiên: in millis()
  • [05:46] Dùng millis() để kích hoạt sự kiện sau 5 giây
  • [08:29] Ví dụ 2: Hành động nút nhấn với độ trễ 5 giây
  • [12:14] Ví dụ 3: Phát hiện lần nhấn nút thứ hai sau độ trễ
  • [17:20] Giới thiệu hàm map()
  • [19:47] Ví dụ thực tế về ánh xạ phần trăm độ sáng LED

Hình ảnh

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
918-Lesson 14/31-3: Arduino coding millis() example 3 with push button
Ngôn ngữ: C++
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
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
unsigned long buttonPushed =0;

void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // ilmoFan.com example-2 millis()
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW && buttonPushed ==0)
  {
    buttonPushed =millis();
    Serial.print("First push at:");
    Serial.println(buttonPushed);
  }
  if( pb ==LOW &&  buttonPushed >0 )
  {
   unsigned long difference = millis()- buttonPushed;
      if( difference >= event)
      {
        Serial.println("Action after 5 seconds of first push");
      }
  }
  
}

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

Tập tin📁

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