手把手教你智能硬件开发(三) 控制LED灯

第3节 控制LED灯

如今咱们开始尝试用代码控制一个真正的直观的硬件设备。git

第一个例子:让Arduino开发板上的一个LED小灯周期性的打开、关闭。
第二个例子:让LED灯亮度逐渐的变亮变暗。web

3.1 LED灯的开关

3.1.1 原理介绍

Arduino开发板上,都会有两个LED指示灯。不一样的开发板,LED指示灯的位置、颜色略有不一样。编程

  1. 电源指示灯。当开发板链接上电源(或者经过USB线供电)后,用来指示电源是否接通。这个LED灯旁边确定有一个“On”标记;svg

  2. 测试用指示灯。这是一个用来作内部测试的指示灯,也正是本示例要使用到的指示灯。在这个LED灯旁看到个‘L’标记;函数

前面的章节中,咱们介绍了Arduino开发板提供了3类引脚。其中数字引脚D13就控制着这个测试用指示灯。所以咱们只须要在代码中控制好这个引脚就行了。
没有可外接的LED模块时,就用D13引脚来作测试。oop

3.1.2 代码设计

经过菜单栏建立一个叫作LEDTest.ino的文件,启动这个示例。测试

  1. 任何引脚在使用以前,都要在setup()中对它进行初始化,告知这个引脚用来输出-OUTPUT,仍是用来输入-INPUT。这里是要初始化D13引脚,让它做为输出。ui

    //定义引脚的编号,这里使用的是数字引脚13。
    int pin = 13;
    
    void setup()
    {
        //设置该引脚类型为输出
        pinMode(pin, OUTPUT);
    }
  2. 经过digitalWrite()函数,让指示灯变亮一秒,而后变暗一秒,如此往复,spa

    void loop()
    {
        //将该引脚设置成高电平,也就是通电,打开指示灯
        digitalWrite(pin, HIGH);
    
        //延时1秒,在这1秒钟,LED灯状态不变,即点亮状态
        delay(1000);
    
        //将该引脚设置成低电平,也就是断电,关闭指示灯
        digitalWrite(pin, LOW);
    
        //延时1秒,在这1秒钟,LED灯状态不变,即熄灭状态
        delay(1000); 
    }

    loop()执行以后,会被循环再次执行,咱们设计的效果就是LED灯一秒亮、一秒暗的不停的循环。设计

    digitalWrite()函数专门用来为数字引脚设置高低电平,

    //将该引脚设置成高电平
    digitalWrite(pin, HIGH);
    
    //将该引脚设置成低电平
    digitalWrite(pin, LOW);

3.1.3 结果观察

将工程编译部署到开发板上,就能看到D13链接到LED指示灯,一秒亮、一秒暗的不停闪烁。

3.2 LED灯明暗调节

3.2.1 原理介绍

数字引脚只能输出高电平HIGH或低电平LOW两种,可是经过脉冲宽度调制(Pulse Width Modulation简称PWM)就能让数字端口模拟输出多级的电压(一般是0级~255级,0级表明没有,255级表明最高电压)。

数字引脚上的电压,能够当作是一个个脉冲方波,当引脚一直处于高电平的时候,输出为V,

当引脚电压的脉冲方波周期中,有50%的时间中处于高电平的时候,平均输出就为V/2;

当引脚电压的脉冲方波周期中,有33.3%的时间中处于高电平的时候,平均输出就为V/3;

以此类推。

*更官方的表述请参考官网

Arduino开发板提供的数字引脚中,有的引脚就具有了PWM的能力:可以设置这些数字引脚的电压输出级数。

int pin = 13;

pinMode(pin, OUTPUT);

......

//设置成输出10级电压,电压强度从0~255
analogWrite(pin, 10);

经过官网给出的规格,能够看出Arduino MEGA开发板的D13引脚,是具有PWM功能的。因此咱们可让测试指示灯渐变明暗。

不过Arduino UNO开发板上的D13引脚并不具有PWM功能,所以要在它上面进行灯光强弱调整的实验,必需要在其余的引脚上,外接一个LED灯硬件。这部份内容,咱们将在后面介绍。

3.2.2 代码设计

改造前面的LEDTest.ino文件。

  1. setup()中对它进行初始化,告知这个引脚用来输出-OUTPUT,或者用来输入-INPUT。这里是要初始化D13引脚,让它做为输出。

    //定义引脚的编号,这里使用的是数字引脚13
    int pin = 13;
    
    void setup()
    {
        //设置该引脚为输出
        pinMode(pin, OUTPUT);
    }
  2. 经过analogWrite()函数,让指示灯逐级变亮,而后逐级变暗,如此往复,

    void loop()
    {
        //将该引脚从0级逐步设置到255级,指示灯逐渐变亮
        for(int level = 0; level < 256; level++)
        {
            analogWrite(pin, level);
            //延时100毫秒,LED灯状态不变
            delay(10);
        }
    
        //将该引脚从255级逐步设置到0级,指示灯逐渐变暗
        for(int level = 255; level >= 0; level--)
        {
            analogWrite(pin, level);
            //延时100毫秒,LED灯状态不变
            delay(10);
        }
    }

    loop()执行以后,会被循环再次执行,咱们设计的效果就是LED灯逐渐变亮,再逐渐变暗。

    这里使用了analogWrite()函数向数字引脚设置电压0级~255级中的任何一级,

    //将该PWM引脚设置成0~255级中的任何一级
    analogWrite(pin, level);

    可见analogWrite()函数并不像它的名字那样只是模拟引脚的专利,它对支持PWM的引脚一样适用。

3.2.3 结果观察

将工程编译部署到开发板上,就能看到D13链接到LED指示灯,一下子亮一下子暗的逐渐变化。

3.3 其余LED灯的使用

除了使用Arduino MEGA开发板的D13引脚,咱们也可使用任何其余带PWM功能的数字引脚。例如Arduino MEGA开发板的D2~D13 D44 D46;Arduino UNO开发板的3 5 6 9 10 11。将LED灯接到这些引脚上面,就能一样的实现对LED灯的控制。

3.3.1 LED模块

你的LED模块多是单色的:只能发出一种颜色的光,这种模块有3个引脚,标注字符S的是控制灯光强度的引脚、VCC或者+是电源引脚、GND或者G是接地引脚,例如跟我学Arduino开发中提供的单色LED灯模块,

LED灯也可能支持3种基础颜色-红绿蓝,这种模块有4个引脚,例如跟我学Arduino开发中提供的三色LED灯模块,

  1. 标注字符R的是控制红色灯光强度的引脚;
  2. 字符G的是控制绿色灯光强度的引脚;
  3. 字符B的是控制蓝色灯光强度的引脚;
  4. GND是接地引脚,

3.3.2 链接模块

这里咱们先用单色的LED灯模块举例。

MEGA开发板,2-13引脚都支持PWM,随便选一个均可以。

UNO开发板,3,5,6,9,10,11引脚支持PWM,能够在开发板上看到引脚数字边上有个’~’。

这里咱们选择D9引脚来链接LED灯。

LED灯的S引脚链接到MEGA D9引脚;VCC接到MEGA 5V引脚;GND接到MEGA GND引脚。

早期的开发板,为了防止电压不稳定击穿电子器件,须要链接个电阻。
如今的开发板,只在接马达时才须要增长电阻,惯常的作法是增长一块扩展板。

在实际的硬件链接当中,咱们一般用扩展板来链接LED模块和开发板。

这里咱们使用传感器扩展板,

能够看到扩展板上已经印制出了每一个引脚的含义,

对于数字引脚扩展槽来讲,
GND或者G:接地引脚
VCC或者V:供电引脚
D或者S:被扩展出的引脚,其下方的数字表明该引脚的编号

对于模拟引脚扩展槽来讲,
GND或者G:接地引脚
V或者+:供电引脚,
S:被扩展出的引脚,其下方的数字表明该引脚的编号

因此,对于这里的状况,咱们选择标注了9的数字引脚扩展插槽。

扩展板引脚 链接 单色LED灯模块引脚
9组V <—>
9组G <—> G
9组S <—> S

3.3.3 修改代码

由于此次咱们使用了D9引脚,因此须要修改前面使用的D13引脚为D9,

//定义引脚的编号,这里使用的是数字引脚9
int pin = 9;

void setup()
{
   //设置该引脚为输出
   pinMode(pin, OUTPUT);
}

void loop()
{
   //将该引脚从0级逐步设置到255级,指示灯逐渐变亮
   for(int level = 0; level < 256; level++)
   {
       analogWrite(pin, level);
       //延时100毫秒,LED灯状态不变
       delay(10);
   }

   //将该引脚从255级逐步设置到0级,指示灯逐渐变暗
   for(int level = 255; level >= 0; level--)
   {
       analogWrite(pin, level);
       //延时100毫秒,LED灯状态不变
       delay(10);
   }
}

3.3.4 结果观察

将工程编译部署到开发板上,就能看到D9链接到LED指示灯,一下子亮一下子暗的逐渐变化。

3.3.5 使用三色LED灯

使用三色的LED灯模块,与使用单色的LED灯模块同样。在硬件链接时,要同时把红R、绿G、蓝B三种颜色对应的引脚链接到PWM接口上。例如使用数字引脚D九、D十、D11,分别对应红、绿、蓝三种颜色,就要多使用几个扩展板的插槽,将对应的R G B引脚插在标注了9 10 11编号的数字扩展口上,

在代码中要初始化三个PWM接口。

//定义引脚的编号,这里使用的是数字引脚D九、D十、D11,
//分别对应红、绿、蓝三种颜色
int RED_LED_PIN = 9;
int GREEN_LED_PIN = 10;
int BLUE_LED_PIN = 11;

void setup()
{   
   //设置该引脚为输出
   pinMode(RED_LED_PIN, OUTPUT);
   pinMode(GREEN_LED_PIN, OUTPUT);
   pinMode(BLUE_LED_PIN, OUTPUT);
}

void loop()
{
   //将该引脚从0级逐步设置到255级,指示灯逐渐变亮
   for(int level = 0; level < 256; level++)
   {
       analogWrite(RED_LED_PIN, level);
       analogWrite(GREEN_LED_PIN, level);
       analogWrite(BLUE_LED_PIN, level);
       //延时100毫秒,LED灯状态不变
       delay(10); 
   }

   //将该引脚从255级逐步设置到0级,指示灯逐渐变暗
   for(int level = 255; level >= 0; level--)
   {
       analogWrite(RED_LED_PIN, level);
       analogWrite(GREEN_LED_PIN, level);
       analogWrite(BLUE_LED_PIN, level);
       //延时100毫秒,LED灯状态不变
       delay(10); 
   } 
}

/*******************************************************************/

本系列课程使用到的Arduino开发板、扩展板以及其余相关的传感器,各位能够根据咱们文章中介绍的硬件在淘宝网选购。
您也能够在咱们的网店跟我学Arduino编程中购买,这些相关硬件都由咱们为您把关购买,为你们节省选择的精力与时间。同时也感谢你们对咱们这些码农的支持。

最后再次感谢各位读者对安豆的支持,谢谢:)

/*******************************************************************/