Blink Without Delay: 不使用 delay() 函数而使 LED 闪烁
不使用 delay() 函数而使 LED 闪烁
有些时候你需要同时做两件事。例如,你可能希望在读取按键按下状态同时让LED闪烁。 在这种情况下,你不能使用 delay(),
因为Arduino程序会在delay()
中停顿。 如果按键被按下的同时,Arduino正在暂停等待 delay()结束
,你的程序也将会错过按键的按下.
这个演示展示了如何闪烁LED而不使用 delay()。
它点亮了LED,然后记录下时间。然后,每一次通过 loop()
循环, 检查闪烁设置时间是否到达。 如果是,它的点亮或熄灭LED, 并且刷新时间。以这种方式让LED不断闪烁, 而代码的执行不会因一个指令而滞后.
类似的,你用微波炉热比萨,并同时等待一些重要的电子邮件。你把比萨放进微波炉10分钟。使用 delay()
的类比,你坐在微波炉前面看着定时器计数,倒计时10分钟直到定时器达到零为止。如果在这期间重要的邮件到达,你将会错过它。
在现实生活中你会做的是开始热萨饼,然后检查你的电子邮件,然后可能再做别的事情(不太长时间的事!)偶尔你会回到微波炉,看看定时器是否已经达到零,即你的比萨饼是否已经完成。
在本教程中,你将学会如何建立一个类似的计时器 .
硬件需求
- Arduino 开发板
- LED (非必要)
- 220欧电阻(非必要)
电路

要构建这电路,请把电阻的一端连接到板子的pin13,电阻的另一端连接到LED的长引脚(长的引脚,称为阳极),LED的短引脚连接到(短的引脚,称为阴极)板子的GND,如上图所示和下面的原理图。
大多数Arduino和Genuino板子已经将板上的LED附加在板子本身的pin13。如果你不附加任何硬件中运行这个例子,您应该看到,LED闪烁。
原理图
点击图片放大

图像使用fritzing.开发。电路的例子, 看到fritzing项目页面
构建电路后将板子插入到你的电脑,开始Arduino软件(IDE),输入下面的代码。
代码
下面的代码使用millis()
函数,从板子开始运行时,就会返回很多个毫秒的命令。当前的演示,是使LED闪烁.
/* 不使用 delay() 函数而使 LED 闪烁 点亮和熄灭一个连接到数字引脚的发光二极管(LED),不使用delay()延迟函数。
这意味着其他代码可以同时运行而不被LED代码干扰 电路
* LED 连到引脚13 和 地
* 注:大部分 Arduino 已经有板上的LED并且是连到引脚13,所以此示例无需额外硬件 created 2005
by David A. Mellis
modified 8 Feb 2010
by Paul Stoffregen
modified 11 Nov 2013
by Scott Fitzgerald 这个示例代码是在公共领域. http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/ //一个不会改变的常量。这里用来定义一个引脚:
const int ledPin = 13; // LED引脚号 // 一个会变化的变量:
int ledState = LOW; //ledState将LED置低电平 //一般来说,应该使用 "unsigned long" 类型的变量来保存时间
// 如果用int类型来存储值,它很快就会变得过大而该类似无法储存
unsigned long previousMillis = 0; // 将存储的LED值最后一次更新 //一个不会改变的常量:
const long interval = 1000; // 闪烁的时间间隔(毫秒) void setup() {
// 设置数字引脚作为输出:
pinMode(ledPin, OUTPUT);
} void loop() {
// 在这里,你放置的代码需要一直运行. // 检查闪烁的时间,就是if
// 当前时间和上次闪烁的时间
//设置你想要的 LED更大的时间间隔
// LED闪烁.
unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) {
// 保存上次LED闪烁时间
previousMillis = currentMillis; // 如果LED是点亮的,反之亦然:
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
} // 设置LED的电平为ledState值:
digitalWrite(ledPin, ledState);
}
}
参考
- pinMode()
- digitalWrite()
- digitalRead()
- if
- else
- BlinkWithoutDelay - Blink an LED without using the delay() function.
- Debounce - Read a pushbutton, filtering noise.
- DigitalInputPullup - Demonstrates the use of INPUT_PULLUP with pinMode().
- StateChangeDetection - Count the number of button pushes.
- toneKeyboard - A three-key musical keyboard using force sensors and a piezo speaker.
- toneMelody - Play a melody with a Piezo speaker.
- toneMultiple - Play tones on multiple speakers sequentially using the tone() command.
- tonePitchFollower - Play a pitch on a piezo speaker depending on an analog input.
Blink Without Delay: 不使用 delay() 函数而使 LED 闪烁的更多相关文章
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- [UE4]Delay与Retriggerable Delay
一.Delay 在右上角都有一个表盘的图标,表示不是在当帧内执行,而是需要一定时间才能完成的. 鼠标移上去,会有一段文字注释.根据指定的延迟时间执行一个延后的动作.当计时还没有结束的时候,如果再次被调 ...
- timequest 中set input delay set output delay 的使用
set_input_delay/ set_output_delay TimeQuest出现以后,随之 set input delay 与 set output delay 也跟着出现,该约束命令用“外 ...
- Linux Shell管道调用用户定义函数(使shell支持map函数式特性)
Linux中有一个管道的概念,常用来流式的处理文本内容,比如一个文件对其中的每一行应用好几个操作,出于两个方面的考虑可能需要在管道中使用用户定义函数: 1. 刚需: 内置的sed/awk之类的可能没法 ...
- Python与SQLite日期时间函数的使法
SQLite的时间函数跟Python的时间函数有些许差别,所以稍做记录,供自己以后查询. 网上有将SQLite官方WIKI内容翻译成中文的文章,大家有兴趣可以搜索一下,我这里单纯记录一下个人比较常用的 ...
- 巧用函数,使Sql中in的用法更多变
在Sql中我们经常会用到in 普遍的写法为 where xx in ('1','2','3') 通过函数写法为: IF EXISTS ( SELECT * FROM sys.objects WHERE ...
- javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数
javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数 1.常规函数 javascript常规函数包括以下9个 ...
- JavaScript 函数大全
javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数 1.常规函数 javascript常规函数包括以下9个函数: (1)alert函数:显示一个警告 ...
- JavaScript中常用的函数
javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数 1.常规函数 javascript常规函数包括以下9个函数: (1)alert函数 ...
随机推荐
- selenium获取多窗口句柄并一一切换至原窗口句柄(三个窗口)
网上有很多是selenium基于python来获取两个窗口句柄与切换,本文实现用python+selenium获取多窗口句柄并一一切换至原窗口句柄(三个窗口),且在每个窗口下进行一个搜索或翻译,然后截 ...
- JSTL的fn函数
JSTL使用表达式来简化页面的代码,这对一些标准的方法,例如bean的getter/setter方法,请求参数或者context以及session中的数据的访问非常方便,但是我们在实际应用中经常需要在 ...
- Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目
Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目 新建一个maven工程,这里不赘述如何新建maven工程. 添加Neo4j jar到你的工程 有两种方 ...
- Linux指令小结
1.apt指令集:是ubuntu中最强大的命令行软件管理工具,用于获取.安装.编译.卸载和查询软件包.还可以检查软件包的依赖关系.在ubunt中下载是根据/etc/apt/sources.list这个 ...
- ubantu svn 安装、卸载、配置hooks
1.安装之前先看是否已经安装了 svn -version 若已经安装会有以下提示,若没有安装,进行下一步 若想卸载了执行命令 ( sudo apt-get remove --purge subvers ...
- Spark2.0自定义累加器
Spark2.0 自定义累加器 在2.0中使用自定义累加器需要继承AccumulatorV2这个抽象类,同时必须对以下6个方法进行实现: 1.reset 方法: 将累加器进行重置; abstract ...
- C# DataGridView自定义分页控件
好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...
- System.DateUtils 3. IsPM、IsAM 判断是否为上、下午
编译版本:Delphi XE7 function IsPM(const AValue: TDateTime): Boolean; inline;function IsAM(const AValue: ...
- kvm
硬件,os,内核模块,用户空间工具,命令行具体参数,日志 [root@localhost ~]# yum install pciutils [root@localhost ~]# lscpu;lspc ...
- C语言实现简单php自定义扩展
1.下载php源码 下载地址:http://cn2.php.net/get/php-5.6.29.tar.gz/from/this/mirror 传到/usr/local/src/下 上传命令:rz ...