上篇Arduino的教程我们大致地了解了一些Arduino的基本信息,https://mp.weixin.qq.com/s/L5CTq1_1ZFiZqHkFc9dNcA。这篇文章将会讲述一个Arduino最简单的功能---让一个LED灯每秒都闪烁一次。
大多数Arduino板都会自带一个LED灯,不过这个灯可能会根据Arduino板的型号而连接在不同的接口上。就我们所示范的Arduino Uno,来说,它的LED灯是连接到D13接口的。
每个Arduino板都会自带一个常量,LED_BUILTIN,来储存这个接口的数值。
不过,我们也可以在Arduino板上外接一个LED灯,就像下图所示
这样的话,所需的材料就包括:
- 一个LED灯
- 一个面包版
- 一个220欧姆到1000欧姆之间的电阻
- 两节跳线
将电阻的一端连接到Arduino板的13接口,另一端与LED灯的较长的引脚相连。并将LED较短的引脚连接到Arduino板的GND接口上,也就是接地线上。
随后,我们需要如下的代码:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
逐行分解,这段代码的功能如下:
将Arduino板自带的LED灯接口设置为输出
pinMode(LED_BUILTIN, OUTPUT);
将LED_BUILTIN的电压输出调为高,使其为LED灯通电
digitalWrite(LED_BUILTIN, HIGH);
程序暂停1000毫秒 (1秒)
delay(1000);
将LED_BUILTIN的电压输出调为低,使LED灯熄灭
digitalWrite(LED_BUILTIN, LOW);
程序再次暂停1000毫秒(1秒)从而达到闪烁的效果
delay(1000);
虽然以上的代码可以满足使一个LED灯闪烁的功能,但这个代码也有很大的局限性。其中我们使用的delay()功能会让整个程序暂停一段时间,从而在这段时间内,代码无法处理任何其他任务,例如处理新的输入,或生成新的输出。这就好比一个人在烧水时,全程都在烧水壶旁边等着,进而无法处理有人按门铃或打电话的情况。
进而,我们可以对代码进行一些调整,使其可以在让LED灯闪烁的同时,处理其他事物:
const int ledPin = LED_BUILTIN;
int ledState = LOW;
unsigned long previousMillis = 0;
const long interval = 1000;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
}
}
这里我们用到了一个millis()功能,millis()的作用是保存自这段代码开始运行,至现在的时间。
逐行分解,这段代码有如下作用:
将Arduino板自带的LED灯接口数保存在一个ledPin的常量里
const int ledPin = LED_BUILTIN;
先将LED灯的状态调为低,也就是熄灭状态
int ledState = LOW;
初始化一个计时器
unsigned long previousMillis = 0;
将1000毫秒保存为LED灯闪烁的时长
const long interval = 1000;
在这段loop指令内的代码将会反复运行
void loop()
保存当前时间
unsigned long currentMillis = millis();
如果当前的时间减去上次储存的时间,大于我们设定的时长的话。。。
如果并没有大于我们设定的时长,下面的代码暂时不会运行,LED灯的状态进而也不会有改变
if (currentMillis - previousMillis >= interval) {
将当前时间保存为‘上次储存的时间’,以便下次使用
previousMillis = currentMillis;
这段代码用来检测如果LED灯处熄灭状态,便将其打开,若处于打开状态,将其熄灭
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
这个代码去除了我们第一段代码的最主要的局限性。其主要的运行逻辑是,每当代码被运行时,都会根据我们设置的LED灯闪烁的时长,进行一个判定。判定的内容是如果这次判定距离上次判定的时间没有超过我们设置的时长,则不对LED灯进行任何操作。如果这次判定距离上次判定的时间超过了我们设置的时长,那么,将会打开或熄灭LED灯,进而使其闪烁。