第14/31-3课:Arduino编程millis()示例3(带按钮)
你是否曾经需要让Arduino记住某件事发生的时间——比如按钮按下——然后在精确的时间后采取行动,同时让程序的其余部分顺畅运行?这是Arduino编程中的一个经典挑战,解决方案就是millis()函数。本教程是Robojax Arduino课程的一部分,演示了一个实际示例:检测按钮在第一次按下后经过5秒延迟是否被第二次按下。这项技术对于创建响应迅速、非阻塞且时间至关重要的项目是基础性的。
这种使用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()函数的根本优势。
本视频中的相关项目
- 第14/31-1课:Arduino Millis(无延迟)和map函数 | SunFounder Robojax
- 第14/31-2课:Arduino编程 millis() 示例2带事件
- 第14/31-4课:Arduino编程 map() 示例1
- 第14/31-5课:Arduino编程 map() 示例2
章节
- [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亮度百分比的实际示例
/*
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");
}
}
}
|||您可能需要的东西
-
亚马逊SunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
亚马逊
-
亚马逊
-
亚马逊
资源与参考
-
文档SunFounder 3合1物联网/智能车/学习套件的文档docs.sunfounder.com
-
外部购买SunFounder的3合1智能汽车学习套件sunfounder.com
文件📁
用户手册
-
SunFounder 3合1 Arduino智能车组装手册本文档逐步展示SunFounder 3合1 Arduino智能车的组装过程
SunFounder_car_assembly_manual.pdf1.20 MB