Hi,大家好!经过前几次的学习,我们对Arduino有了基本的了解。接下来我们将继续深入的学习。
还记得吗?在前几次的学习过程中,我们曾经多次使用到了delay()这个可以让时间延迟的方法。为了在接下来的学习过程中,能够更灵活的对延时进行控制,这一次,我们试着挑战一下如何在不使用delay()方法的情况下,依然可以做到时间延时!
开始之前,还让我们准备一下所需的材料。
硬件方面
image.png

具体包括如下:

  • Arduino UNO电路板(1块)
  • mini面包板(1块)
  • 220欧姆电阻(1个)
  • LED灯(1盏)
  • 面包线(2根)
配件看起来是不是很眼熟?其实和点亮LED神灯所需的配件一样的。不仅如此,电路的连接上也是一样的呢!
软件方面
Arduino官方提供的IDE。
连接电路

image.png

看看是不是和之前学过的点亮LED神灯的电路连接是一样的?毕竟这次我们的重点在程序,电路起到的是一个辅助的角色。好!关于这个就不啰嗦了,下面重点看程序!

首先打开Arduino的IDE,新建一个Arduino项目窗口。
211801pgg877g77luucyv3.jpg

新建完成之后,向其中添加几行代码。如下:

  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神灯的亮和灭!