Oh!Coder

Coding Life

好玩的Arduino-另一种时间延迟

| Comments

Hi,大家好!经过前几次的学习,我们对Arduino有了基本的了解。接下来我们将继续深入的学习。

还记得吗?在前几次的学习过程中,我们曾经多次使用到了delay()这个可以让时间延迟的方法。为了在接下来的学习过程中,能够更灵活的对延时进行控制,这一次,我们试着挑战一下如何在不使用delay()方法的情况下,依然可以做到时间延时!

开始之前,还让我们准备一下所需的材料。

硬件方面

arduino-led

图片来源:Arduino 电路配件

具体包括如下:

  • Arduino UNO电路板(1块)
  • mini面包板(1块)
  • 220欧姆电阻(1个)
  • LED灯(1盏)
  • 面包线(2根)

配件看起来是不是很眼熟?其实和点亮LED神灯所需的配件一样的。不仅如此,电路的连接上也是一样的呢!

软件方面

Arduino官方提供的IDE。

连接电路

arduino-led-light

图片来源:Arduino连接LED电路示意图

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

添加几行代码

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

arduino-ide-new

图片来源:Arduino官方IDE

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 定义LED灯针脚号
const int ledPin =  13;
// 定义LED灯点亮状态
int ledState = LOW;
// 定义上一次loop到当前loop的时间间隔,
// 数值类型为毫秒,
// 变量类型为无符号长整型。
unsigned long previousMillis = 0;
// 定义常量来表示固定的时间间隔,
// 此处为1000毫秒,也即1秒钟,
// 变量类型为长整型。
const long interval = 1000;

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

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

  // 判断当前的时间与上一次记录时间的时间
  // 间隔是否大于等于internal数值,
  // 此处的internal是我们自定义的时间间隔。
  // 如果大于等于internal数值,则执行内部操作,
  // 否则进入下一次loop循环。
  if (currentMillis - previousMillis >= interval) {
    // 更新previousMillis变量数值,
    // 也即更新上一次时间记录为
    // 当前时间。
    previousMillis = currentMillis;
    // 判断LED灯状态,并进行更改,
    // 如果为亮,则变为灭。
    // 如果为灭,则变为亮。
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    // 将LED状态变量的更改结果发送给LED灯元器件。
    digitalWrite(ledPin, ledState);
  }
}

哈!今天的代码猛然看起来有点长。其实吧,还好,还好!如果删除代码注释,其实也是很简短滴!叫板的话,今天的代码里其实也只出现了一个新面孔,那就是millis()方法。这个方法的作用是获取当前的时间,返回的数值为无符号长整型,时间单位是毫秒。loop()方法中的if语句,作用就是判断上一次的时间和当前时间的间隔是否大于等于interval数值,此处设置的为1秒钟。如果大于等于1秒钟,则重新记录,将previousMillis变量设置为当前时间,即currentMillis数值。

arduino-menu

图片来源:Arduino官方IDE的文件编辑菜单选项

最后点击上图中指向右侧的箭头图标,将代码烧入Arduino UNO电路板中。现在看看LED灯是否是每隔1秒钟闪烁一次?你还可以在interval数值定义的地方更改其数值,重新将代码烧入Arduino UNO电路板,以加快或减慢LED灯闪烁的频率。

总结

今天我们一起学习了如何在不使用delay()方法的情况下实现时间延迟。不使用delay()方法的好处是,可以在每次延迟中加入自定义逻辑,在每次延迟的过程中完成多个操作。

下期预告

前面的学习,我们每次只涉及一个元器件。接下来,我们将尝试加入多个元器件。下一次,我们将尝试用开关按键控制LED神灯的亮和灭!

Comments