Hi,大家好!经过前几次的学习,我们对Arduino有了基本的了解。接下来我们将继续深入的学习。
还记得吗?在前几次的学习过程中,我们曾经多次使用到了delay()这个可以让时间延迟的方法。为了在接下来的学习过程中,能够更灵活的对延时进行控制,这一次,我们试着挑战一下如何在不使用delay()方法的情况下,依然可以做到时间延时!
开始之前,还让我们准备一下所需的材料。
硬件方面具体包括如下:
- Arduino UNO电路板(1块)
- mini面包板(1块)
- 220欧姆电阻(1个)
- LED灯(1盏)
- 面包线(2根)
配件看起来是不是很眼熟?其实和点亮LED神灯所需的配件一样的。不仅如此,电路的连接上也是一样的呢!
软件方面Arduino官方提供的IDE。
连接电路看看是不是和之前学过的点亮LED神灯的电路连接是一样的?毕竟这次我们的重点在程序,电路起到的是一个辅助的角色。好!关于这个就不啰嗦了,下面重点看程序!
首先打开Arduino的IDE,新建一个Arduino项目窗口。
新建完成之后,向其中添加几行代码。如下:
- // 定义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官方IDE的文件编辑菜单选项
最后点击上图中指向右侧的箭头图标,将代码烧入Arduino UNO电路板中。现在看看LED灯是否是每隔1秒钟闪烁一次?你还可以在interval数值定义的地方更改其数值,重新将代码烧入Arduino UNO电路板,以加快或减慢LED灯闪烁的频率。
总结今天我们一起学习了如何在不使用delay()方法的情况下实现时间延迟。不使用delay()方法的好处是,可以在每次延迟中加入自定义逻辑,在每次延迟的过程中完成多个操作。
下期预告前面的学习,我们每次只涉及一个元器件。接下来,我们将尝试加入多个元器件。下一次,我们将尝试用开关按键控制LED神灯的亮和灭!