不使用 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);
}
}

参考

Blink Without Delay: 不使用 delay() 函数而使 LED 闪烁的更多相关文章

  1. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  2. [UE4]Delay与Retriggerable Delay

    一.Delay 在右上角都有一个表盘的图标,表示不是在当帧内执行,而是需要一定时间才能完成的. 鼠标移上去,会有一段文字注释.根据指定的延迟时间执行一个延后的动作.当计时还没有结束的时候,如果再次被调 ...

  3. timequest 中set input delay set output delay 的使用

    set_input_delay/ set_output_delay TimeQuest出现以后,随之 set input delay 与 set output delay 也跟着出现,该约束命令用“外 ...

  4. Linux Shell管道调用用户定义函数(使shell支持map函数式特性)

    Linux中有一个管道的概念,常用来流式的处理文本内容,比如一个文件对其中的每一行应用好几个操作,出于两个方面的考虑可能需要在管道中使用用户定义函数: 1. 刚需: 内置的sed/awk之类的可能没法 ...

  5. Python与SQLite日期时间函数的使法

    SQLite的时间函数跟Python的时间函数有些许差别,所以稍做记录,供自己以后查询. 网上有将SQLite官方WIKI内容翻译成中文的文章,大家有兴趣可以搜索一下,我这里单纯记录一下个人比较常用的 ...

  6. 巧用函数,使Sql中in的用法更多变

    在Sql中我们经常会用到in 普遍的写法为 where xx in ('1','2','3') 通过函数写法为: IF EXISTS ( SELECT * FROM sys.objects WHERE ...

  7. javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数

    javascript函数一共可分为五类:    ·常规函数    ·数组函数    ·日期函数    ·数学函数    ·字符串函数    1.常规函数    javascript常规函数包括以下9个 ...

  8. JavaScript 函数大全

    javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数 1.常规函数 javascript常规函数包括以下9个函数: (1)alert函数:显示一个警告 ...

  9. JavaScript中常用的函数

    javascript函数一共可分为五类:  ·常规函数  ·数组函数  ·日期函数  ·数学函数  ·字符串函数 1.常规函数  javascript常规函数包括以下9个函数:  (1)alert函数 ...

随机推荐

  1. java.lang.ClassCastException: org.slf4j.impl.Log4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext问题原因及解决方法

    一.错误信息 java.lang.ClassCastException: org.slf4j.impl.Log4jLoggerFactory cannot be cast to ch.qos.logb ...

  2. linux grep,sed,awk和diff的使用

    1:grep//显示行 # grep 'main' /home/myhome/a.c//将a.c含有main的行显示出来 # grep -v 'main' /home/myhome/a.c //显示除 ...

  3. ajax java base64 图片储存

    js代码 //利用formdata上传 var dataUrl = $('#canvas').getDataUrl(); var img = $('<img>').attr('src', ...

  4. mongodb字段类型转化

    最近在使用mongoDB, 发现mongo对字段类型的定义并不是很严格,完全依赖传入数据的类型,在加上PHP是弱类型的语言,所以难免会出现一些错误.如果预想的类型是Int型,但数据存储的是String ...

  5. 周末发现一个BUG,时有时无,一出程序就崩溃,郁闷了好久,终于跟出来来了,记之,提醒自己今后一定规范编写,只要规范,绝对不会出问题

    -- :::] cell0 create -- :::] *** Assertion failure /UITableView.m: -- :::] [ Uncaught Exception ] Na ...

  6. 同时有background-size background-positon 两个属性的时候,如何在合并的background样式中展示

    今日写css,遇到background很多属性,于是想合并写,w3c只是说了各个属性都可以合并,但是并没有给出background-size background-positon合并的具体例子 bac ...

  7. JS与Struts标签page

    <html> <html:link name="map"  page="/xxx/xxx/xxx_delete_do.do"         ...

  8. oracle参数配置

    一.Oracle LARGE_POOL_SIZE大小设置值多少 java_pool_size:以字节为单位, 指定 Java 存储池的大小, 它用于存储 Java 的方法和类定义在共享内存中的表示法, ...

  9. 初识Linux-3

    1,find 目录 条件 [处理命令]-默认是print操作 2,find d6 -name "*cpp" -exec rm{} ";"(或者‘;’或者/;都是 ...

  10. 《C与指针》第十一章练习

    本章问题 1.在你的系统中,你能够声明的静态数组最大的长度能达到多少?使用动态内存分配,你最大能获取的内存块有多少? answer: This will vary from system to sys ...