找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 51905|回复: 7
打印 上一主题 下一主题
收起左侧

Arduino教程-另一种时间延迟

[复制链接]
跳转到指定楼层
楼主
Hi,大家好!经过前几次的学习,我们对Arduino有了基本的了解。接下来我们将继续深入的学习。
还记得吗?在前几次的学习过程中,我们曾经多次使用到了delay()这个可以让时间延迟的方法。为了在接下来的学习过程中,能够更灵活的对延时进行控制,这一次,我们试着挑战一下如何在不使用delay()方法的情况下,依然可以做到时间延时!
开始之前,还让我们准备一下所需的材料。
硬件方面
图片来源:Arduino 电路配件
具体包括如下:
  • Arduino UNO电路板(1块)
  • mini面包板(1块)
  • 220欧姆电阻(1个)
  • LED灯(1盏)
  • 面包线(2根)
配件看起来是不是很眼熟?其实和点亮LED神灯所需的配件一样的。不仅如此,电路的连接上也是一样的呢!
软件方面
Arduino官方提供的IDE。
连接电路
图片来源:Arduino连接LED电路示意图
看看是不是和之前学过的点亮LED神灯的电路连接是一样的?毕竟这次我们的重点在程序,电路起到的是一个辅助的角色。好!关于这个就不啰嗦了,下面重点看程序!
添加几行代码
首先打开Arduino的IDE,新建一个Arduino项目窗口。
图片来源:Arduino官方IDE
新建完成之后,向其中添加几行代码。如下:

  1. // 定义LED灯针脚号
  2. const int ledPin =  13;
  3. // 定义LED灯点亮状态
  4. int ledState = LOW;
  5. // 定义上一次loop到当前loop的时间间隔,
  6. // 数值类型为毫秒,
  7. // 变量类型为无符号长整型。
  8. unsigned long previousMillis = 0;
  9. // 定义常量来表示固定的时间间隔,
  10. // 此处为1000毫秒,也即1秒钟,
  11. // 变量类型为长整型。
  12. const long interval = 1000;

  13. // 对Arduino电路板或相关状态进行初始化方法
  14. void setup() {
  15.   // 设置LED针脚类型为状态输出针脚
  16.   pinMode(ledPin, OUTPUT);

  17. }
  18. // 系统调用,无限循环方法
  19. void loop() {
  20.   // 记录程序执行到此处的时间,
  21.   // 数值类型为毫秒,
  22.   // 变量类型为无符号长整型。
  23.   unsigned long currentMillis = millis();

  24.   // 判断当前的时间与上一次记录时间的时间
  25.   // 间隔是否大于等于internal数值,
  26.   // 此处的internal是我们自定义的时间间隔。
  27.   // 如果大于等于internal数值,则执行内部操作,
  28.   // 否则进入下一次loop循环。
  29.   if (currentMillis - previousMillis >= interval) {
  30.     // 更新previousMillis变量数值,
  31.     // 也即更新上一次时间记录为
  32.     // 当前时间。
  33.     previousMillis = currentMillis;
  34.     // 判断LED灯状态,并进行更改,
  35.     // 如果为亮,则变为灭。
  36.     // 如果为灭,则变为亮。
  37.     if (ledState == LOW) {
  38.       ledState = HIGH;
  39.     } else {
  40.       ledState = LOW;
  41.     }
  42.     // 将LED状态变量的更改结果发送给LED灯元器件。
  43.     digitalWrite(ledPin, ledState);
  44.   }
  45. }
复制代码



哈!今天的代码猛然看起来有点长。其实吧,还好,还好!如果删除代码注释,其实也是很简短滴!叫板的话,今天的代码里其实也只出现了一个新面孔,那就是millis()方法。这个方法的作用是获取当前的时间,返回的数值为无符号长整型,时间单位是毫秒。loop()方法中的if语句,作用就是判断上一次的时间和当前时间的间隔是否大于等于interval数值,此处设置的为1秒钟。如果大于等于1秒钟,则重新记录,将previousMillis变量设置为当前时间,即currentMillis数值。
图片来源:Arduino官方IDE的文件编辑菜单选项
最后点击上图中指向右侧的箭头图标,将代码烧入Arduino UNO电路板中。现在看看LED灯是否是每隔1秒钟闪烁一次?你还可以在interval数值定义的地方更改其数值,重新将代码烧入Arduino UNO电路板,以加快或减慢LED灯闪烁的频率。
总结
今天我们一起学习了如何在不使用delay()方法的情况下实现时间延迟。不使用delay()方法的好处是,可以在每次延迟中加入自定义逻辑,在每次延迟的过程中完成多个操作。
下期预告
前面的学习,我们每次只涉及一个元器件。接下来,我们将尝试加入多个元器件。下一次,我们将尝试用开关按键控制LED神灯的亮和灭!


ohcoder的系列精彩Arduino教程:
Arduino教程-初识Arduino(包含本教程目录):http://www.51hei.com/bbs/dpj-41334-1.html
Arduino教程-开篇:http://www.51hei.com/bbs/dpj-41335-1.html
Arduino教程-点亮LED神灯:http://www.51hei.com/bbs/dpj-41336-1.html
Arduino教程-让LED神灯闪烁:http://www.51hei.com/bbs/dpj-41337-1.html
Arduino教程-让LED神灯亮度渐变:http://www.51hei.com/bbs/dpj-41338-1.html
Arduino教程-获取输入数字信号:http://www.51hei.com/bbs/dpj-41339-1.html
Arduino教程-获取输入模拟信号:http://www.51hei.com/bbs/dpj-41340-1.html
Arduino教程-另一种时间延迟:http://www.51hei.com/bbs/dpj-41331-1.html
Arduino教程-按键开关:http://www.51hei.com/bbs/dpj-41341-1.html
Arduino教程-停止抖动!:http://www.51hei.com/bbs/dpj-41333-1.html
Arduino教程-抛弃外部电阻!:http://www.51hei.com/bbs/dpj-41332-1.html
Arduino教程-用按键开关计数:http://www.51hei.com/bbs/dpj-41330-1.html

………后续持续更新中请打开:http://www.51hei.com/bbs/dpj-41334-1.html
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:150345 发表于 2016-11-26 15:19 | 只看该作者
谢谢分享。如果想要更改闪烁频率,增加delay就可以了,如果将这个闪烁做成数码管时间显示的中间两个点,那么要如何实现闪烁时长设定又不影响其他的显示呢?
回复

使用道具 举报

板凳
ID:164854 发表于 2017-2-15 22:59 来自手机 | 只看该作者
正需要
回复

使用道具 举报

地板
ID:137736 发表于 2017-4-28 18:26 来自手机 | 只看该作者
interval函数可用于精确的定时和日历
回复

使用道具 举报

5#
ID:246093 发表于 2018-6-20 22:32 | 只看该作者
请问这个可以让单片机不用等待吗?例如执行播放一段语音,然后条件符合播放,程序同时继续运行
回复

使用道具 举报

6#
ID:432246 发表于 2018-11-24 10:44 | 只看该作者
适合初学者   很好
回复

使用道具 举报

7#
ID:437501 发表于 2018-12-2 09:25 | 只看该作者
老师好!我是刚接触ARDUINO爱好者,我想用它来控制步进机定时开关门,我想请教 一下如果在时间周期停电了怎么解决这个问题?
回复

使用道具 举报

8#
ID:81365 发表于 2022-1-16 22:25 | 只看该作者
ARDUINO和Android还以为是一码事呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表