# 项目一 LED 模块测试

## 1.实验说明

在这个套件中，有一个keyes brick LED红发红模块。它的控制方法非常简单，控制时，GND VCC上电后；信号端S为高电平时LED亮起，S为低电平时LED熄灭。

实验中，提供两个测试代码，分别控制LED模块上实现闪烁和呼吸灯的效果。闪烁效果好理解；呼吸灯效果，就是控制LED模块上LED首先逐渐变亮，然后逐渐变暗，循环交替，如人体呼吸一样。

## 2.实验器材

- keyes brick LED红发红模块*1 或者 keyes brick LED黄发黄模块 或者 keyes brick 3W LED模块

- keyes UNO R3开发板*1

- 传感器扩展板*1

- 3P 双头XH2.54连接线*1

- USB线*1

## 3.接线图

![74f9b3cd826ee44371d54fbe93f442c8](./media/74f9b3cd826ee44371d54fbe93f442c8.png)

![2ed5dc197c9f7b7fe7b7ea7899148cdd](./media/2ed5dc197c9f7b7fe7b7ea7899148cdd.png)

![abc67f6ddb90a06f61acf4a6ce84ac00](./media/abc67f6ddb90a06f61acf4a6ce84ac00.png)

## 4.测试代码

**代码1**

```c
int ledPin = 3; //定义LED管脚接D3

void setup() 
{
  pinMode(ledPin, OUTPUT);//设置模式为输出
}

void loop() 
{
  digitalWrite(ledPin, HIGH); //输出高电平，点亮
  delay(1000);//延迟1000毫秒
  digitalWrite(ledPin, LOW); //输出低电平，熄灭
  delay(1000);
}
```

**代码2**

```c
int ledPin = 3; //定义LED引脚为D3

void setup() 
{
}

void loop() 
{
  for (int i = 0; i <= 255; i = i + 1) //逐渐变亮
  {
    analogWrite(ledPin, i);
    delay(10);
  }
  for (int i = 255; i >= 0; i = i - 1) //逐渐熄灭
  {
    analogWrite(ledPin, i);
    delay(10);
  }
}
```

## 5.代码1说明

1.  pinMode(pin,mode)；pin是用于设置模式的Arduino引脚号；mode为模式，可选：输入模式INPUT，输出模式OUTPUT或输入上拉INPUT_PULLUP，在这里我们设置了管脚3为输出模式。
2.  digitalWrite(pin,     value)；pin是单片机数字管脚，在这里我们定义了管脚3；value是你将要输出的数字电平（HIGH/LOW）；如果使用pinMode（）将引脚配置为OUTPUT，则其电压将设置为相应的值：5V（在3.3V板上为3.3V）为HIGH，低电平为0V（接地）。如果没有把pinMode（）设置为OUTPUT，而是将LED连接到引脚，则在调用digitalWrite（HIGH）时，LED可能会变暗。因为此时digitalWrite（）将启用内部上拉电阻，其作用类似于一个大限流电阻。
3.  delay(ms)；延时函数，ms为暂停的毫秒数，数据类型：unsigned     long（范围 0~ 4,294,967,295 (2^32 - 1)）。
4.  通过整合前面知识。我们再来看代码就清楚明了了，代码中第一条我们把模块信号端接到D3，设置为高电平，就是点亮模块上LED；第二条延迟1000毫秒，就是让模块上LED点亮1秒。同样第三条第四条代码表示让模块上LED熄灭1秒。代码默认循环，也就是控制模块上LED，循环亮1秒，灭1秒，实现闪烁效果。通过代码设置，我们可以更改模块上LED亮灭的延迟时间，从而使模块上LED实现不同的闪烁效果。

## 6.代码2说明

1.  代码中setup（）是只执行一次，而loop（）函数是一直循环。这里我们还用到了for（）循环：最简单形式为for(     ; ; )，我们在此实验中用到for (int i = 0; i \<= 255; i = i +1)；表示变量i从0到255，每次自加1，直到不满足 i \<=255这个判断表达式，否则一直执行大括号里的代码，即一共执行256次大括号里的代码；同理for     (int i = 255; i \>= 0; i = i - 1)；i每次自减1，当不满足i\>=0时，跳出该for（）循环，一共执行256次。
2.  代码1中，我们控制模块上信号端控制LED亮灭。在代码2中，我们通过利用keyes     UNO R3开发板上PWM口，设置PWM值，控制模块上LED亮度。
3.  keyes UNO R3开发板上只有D3 D5 D6 D9 D10 D11数字口是PWM口，也就是说如果要控制LED的亮度，信号端就只能接着几个接口。实验中，我们将模块信号端接在D3脚，属于PWM口。设置时我们设置PWM数值越小，模块上LED越暗，数值越大，模块上LED越亮，范围为0-255。analogWrite（pin，value），pin为PWM口，value是要输出的PWM值（0~255）。
4.  通过整合前面知识，我们再来看代码，就清楚多了。将D3的PWM值设置为i，i刚开始由0增加到255，每次加1，每加一次延迟10毫秒，模块上LED逐渐变亮。PWM为255后，i开始由255减小到0，每次减1，每减一次延迟10毫秒，模块上LED逐渐变暗。然后又逐渐变亮，循环交替，如人体呼吸一样。
5.  如果我们感觉逐渐变亮或者逐渐变暗的时间过长，我们可以更改代码设置。有两种方法，一种是将每次加1减1的延迟时间降低；另一种是更改步长，注意这个步长必须能被255整除，如3     5。步长改为3 -3代表i每次增加3或减小3。

## 7.代码结果

上传测试代码1成功，上电后，模块上的LED灯会亮一秒钟灭一秒钟以此循环。上传测试代码2成功，上电后，模块上的LED灯会慢慢的亮起直到最亮，然后再慢慢熄灭直到熄灭