LED跑马灯效果

接下来我们要使用一串LED(总共10个)产生LED跑马灯效果,在这个项目中我们将使用数组。

需要的元件:

10个LED:led

10个100欧的限流电阻:电阻

 

首先按照下面的电路图连接电路:

1

 

 

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};   // 为LED引脚创建数组

int ledDelay = 65;  // 变化之间的延时

int direction = 1;

int currentLED = 0;

unsigned long changeTime;

 

void setup() {

for (int x=0; x<10; x++) {     // 设置所有引脚为输出模式

pinMode(ledPin[x], OUTPUT); }

changeTime = millis();

}

 

void loop() {
//如果距最后一次变灯ledDelay毫秒已经过去
if ((millis() - changeTime) > ledDelay) {      
changeLED();

changeTime = millis();

}

}

 

void changeLED() {

for (int x=0; x<10; x++) {          // 关闭所有LED

digitalWrite(ledPin[x], LOW);

}

digitalWrite(ledPin[currentLED], HIGH);        // 点亮当前LED

currentLED += direction;         // 当前值增加direction表示的数值

// 如果到达LED末端改变direction值

if (currentLED == 9) {direction = -1;}

if (currentLED == 0) {direction = 1;}

}

这个项目中没有介绍任何新的硬件,因此这里不需要硬件回顾。然而,我要在这个项目中介绍数组这个新概念。

代码回顾:

改程序中的第一行:

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

这是定义一个byte类型的数组变量。数组是有一个变量的集合,可以通过索引号来使用数组中的元素。在上面程序中声明了一个数据类型为byte的数组,并取名为ledPin。之后用10个数值初始化这个数组(数字引脚4到13)。为了获得数组中的一个元素,你只需要简单的指出这个元素的索引号。数组是从0开始索引的,这意味着数组中第一个元素的索引是0而不是1,因此数组中的10个元素的索引号是0到9。在这里元素3(ledPin[2])的值时6,元素7(ledPin[6])的值是10.

如果你事先没用数值初始化数组,就必须设定数组的大小。在之前的程序中没有明确说明数组大小,因为编译器可以自己计算数组的大小。编译器已经在数组初始化过程中指定了这个数组的大小是10 。如果你已经声明了数组,但是没有用数值初始化它,那就需要声明数组的大小。例如,可这样做:

byte ledPin[10];

载入数据到数组元素中之后,可采用如下方式从数组中获得数值:

x=ledPin[5];

在这个例子中把索引号为5(第六个元素)的数组元素赋值给x,这个数值是8 。

返回到程序,你已经在开始处声明和初始化一个数组来存储10个数值。这10个数值是数字引脚的编号,这是10个数字引脚,用来控制10个LED 。

在主循环里,要判断距最后一次LED的状态改变是否已经过去了一段确定的时间,这个时间以毫秒为单位存储在变量ledDelay中。如果这个时间已经超过,程序将控制权交给函数changeLED()。主程序采用这种判断时间的方式转换到控制函数changeLED(),而不是使用delay()函数,原因是:在需要的情况下允许其他代码在主程序循环中运行(只要代码运行时间比ledDelay中的时间短)。

所创建的函数是:

void changeLED() {

for (int x=0; x<10; x++) {          // 关闭所有LED

digitalWrite(ledPin[x], LOW);

}

digitalWrite(ledPin[currentLED], HIGH);        // 打开当前LED

currentLED += direction;         // 当前值增加direction表示的数值

// 如果达到LED灯末端,改变direction值

if (currentLED == 9) {direction = -1;}

if (currentLED == 0) {direction = 1;}

}

这个函数做的工作时关闭所有LED,然后打开当前LED(这个转换如此之快,以至于你感觉不到关闭这个动作的发生)。当前LED编号存储在变量currentLED中。

变量currentLED与销量常数相加,因为增量常数不是1就是-1,所以currentLED要么加1,要么减1 。

之后是一个if语句,判断是否已经达到了末端的LED。如果是,将对增量取反。

通过改变ledDelay的数值,你可以设定LED向前或向后依次点亮的速度。试试不同的数值,看看将发生什么变化。

0 Comments
Leave a Reply