搜索代码

第14/31-3课:Arduino编程millis()示例3(带按钮)

第14/31-3课:Arduino编程millis()示例3(带按钮)

你是否曾经需要让Arduino记住某件事发生的时间——比如按钮按下——然后在精确的时间后采取行动,同时让程序的其余部分顺畅运行?这是Arduino编程中的一个经典挑战,解决方案就是millis()函数。本教程是Robojax Arduino课程的一部分,演示了一个实际示例:检测按钮在第一次按下后经过5秒延迟是否被第二次按下。这项技术对于创建响应迅速、非阻塞且时间至关重要的项目是基础性的。

组装好的Sunfounder小车

这种使用millis()在不暂停程序的情况下跟踪时间的模式,对于各种实际应用至关重要。以下是一些激发你自己项目灵感的想法:

  • 去抖按钮接口:实现一个系统,按钮必须按住特定时长(例如3秒)才能开启设备,防止意外按下。
  • 顺序操作:创建一个系统,一个事件(如运动传感器触发)启动一个次要操作,该操作仅在另一个事件在特定时间窗口内发生时执行。
  • 用户交互计时器:构建一个项目,要求在设定时间内提供“确认”输入(如第二次按钮按下)才能执行关键功能,例如发送命令或启动电机。
  • 传感器门控:使用传感器的第一个信号启动时间窗口,在此期间,第二个不同传感器的读数被视为有效或被忽略。

所需硬件

本项目使用SunFounder 3合1 Arduino套件中的组件,这是一个很好的学习资源。你需要:

  • Arduino板(Uno、Nano等)
  • 一个瞬时按钮
  • 跳线

接线指南

此示例的接线非常简单,得益于Arduino的内部上拉电阻,无需外部电阻。(视频中08:29处)

  • 将按钮的一个引脚连接到Arduino上的GND引脚。
  • 将按钮的另一个引脚连接到Arduino上的数字引脚2

通过使用INPUT_PULLUP,引脚内部连接到5V,因此通常读取为HIGH。当按钮按下时,它将引脚连接到GND,导致读取为LOW。这就是我们在代码中使用的逻辑。

代码解释

该项目的核心是跟踪第一次按钮按下,然后在特定时间间隔后检查第二次按下的逻辑。代码设计为非阻塞的,意味着它不会暂停loop()中其他任务的执行。

在草图的顶部,你会找到控制定时行为的关键用户可配置变量:

unsigned long event = 5000;// 5秒
unsigned long buttonPushed =0;
  • event:这是关键的定时变量。它设置延迟时长(毫秒)。在此示例中,设置为5000,即5秒。你可以将此值更改为任何其他时长以适应项目需求。
  • buttonPushed:此变量用作标志和时间戳。它从0开始,并在按钮第一次按下时更新为millis()的值。存储的时间随后用于计算第二次按下检查的差值。

loop()函数中的逻辑分两个阶段工作。首先,它读取按钮状态,如果第一次按下(pb == LOW && buttonPushed == 0),则通过millis()将当前时间记录到buttonPushed变量中。第二阶段检查按钮是否仍被按下以及是否已记录第一次按下。如果是,则计算当前时间与第一次按下时间之间的差值。如果此差值大于或等于你的event时间,则执行操作——在此示例中,向串行监视器打印消息。

实时项目演示

在视频中,代码上传到Arduino,并打开串行监视器观察行为。(视频中16:03处)你会看到millis()值持续打印,显示程序启动以来的时间。当你第一次按下按钮时,会打印类似First push at:5019的消息。如果你再次按下按钮并按住超过自第一次按下起的5秒,则会打印消息Action after 5 seconds of first push。这演示了只有当第二次按下发生在指定延迟过后,操作才会被触发。

这种方法的力量在于,loop()顶部的Serial.println(millis())行会不间断地继续运行,证明定时逻辑不会阻塞其他代码的执行。这是使用millis()相对于delay()函数的根本优势。

本视频中的相关项目

章节

  • [00:00] millis() 和课程介绍
  • [01:19] 什么是 millis() 以及为什么使用它?
  • [03:06] 第一个实际示例:打印 millis()
  • [05:46] 使用 millis() 在5秒后触发事件
  • [08:29] 示例2:带5秒延迟的按钮操作
  • [12:14] 示例3:延迟后检测第二次按钮按下
  • [17:20] map() 函数介绍
  • [19:47] 映射LED亮度百分比的实际示例

图像

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
语言: 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");
      }
  }
  
}

文件📁

用户手册