4、Arduino#

Arduino IDE和驱动的安装#

当我们拿到开发板时,首先我们要安装Arduino IDE和驱动,相关文件我们可以在官网上找到,以下链接是包含各种系统、各种版本的Arduino IDE和驱动任你选择。

https://www.arduino.cc/en/Main/OldSoftwareReleases#1.5.x

下面我们介绍下Arduino-1.5.6 版本IDE在Windows系统的安装方法。

下载下来的文件是一个arduino-1.5.6-r2-windows.zip的压缩文件夹,解压出来到硬盘。

双击Arduino-1.5.6 .exe文件

../_images/f5f98943a74471640eefe95e3cccd0ee.png

然后

../_images/44384a228758644aca47e983417e0079.png

然后

../_images/704e73c99bcc5eed53d0ab210107b5e1.png

等待安装完成.点击close,安装完成。

../_images/742a2a6ad75dbc8f8d55cc25c2dc61ca.png

1.5.6版本安装后的样子。

../_images/4baf5095962e49c1f3ebeb6c2da823f0.png

接下来是开发板驱动的安装,这次我们安装的是Keyes UNO R3开发板的驱动,Keyes 2560 R3开发板安装驱动方法和这个类似,驱动文件可以用同一个文件。

不同的系统,安装驱动的方法也有一些细小的区别,下面我们介绍在WIN 7系统安装驱动的方法。

第一次Keyes UNO R3开发板连接电脑时,点击计算机--属性--设备管理器,显示如下图。

../_images/ef888e8d5fad0b30e4da671933f8842c.png

点击 Unknown device 安装驱动,如下图。

../_images/231c0059b83eb424215dbc17edb21afb.png

进入下图,选择

../_images/1b36a09374634af82cf432f86cb8843f.png

找到Arduino安装位置的drivers文件夹

../_images/19f226835eac31a0ed12516dcefcfc53.png

点击“Next”,今天下图选择,开始安装驱动

image1image2

安装驱动完成,出现下图点击Close。

这样驱动就装好了。点击计算机--属性--设备管理器,我们可看见如下图。

../_images/af9806622ecf816c62f7597448a3cc5f.png

Arduino IDE的使用方法#

Keyes UNO R3开发板的USB驱动安装成功之后,我们可以在Windows设备管理器中找到相应的串口。

下面示范第一个程序的烧写,串口监视器中显示“Hello World!”。

测试代码为:

int val;

int ledpin=13;

void setup()

{

    Serial.begin(9600);

    pinMode(ledpin,OUTPUT);

}

void loop()

{

    val=Serial.read();

    if(val=='R')

    {

        digitalWrite(ledpin,HIGH);

        delay(500);

        digitalWrite(ledpin,LOW);

        delay(500);

        Serial.println("Hello World!");

    }

}

我们打开Arduino 的软件,编写一段程序让Keyes UNO R3开发板接受到我们发的指令就显示“Hello World!”字符串;我们再借用一下Keyes UNO R3 开发板上的 D13的指示灯,让Keyes UNO R3开发板接受到指令时指示灯闪烁一下,再显示“Hello World!”。

打开Arduino 的软件,设置板,如下。

../_images/43d9c16b238cfa52845c3a1b553cc630.png

设置COM端口,如下

../_images/025e24eacb26620c8831c8a3571412f6.png

点击image3编译程序,检查程序是否错误;点击image4上传程序;Keyes UNO R3 开发板设置OK后右下脚显示如下图,和设备管理器中显示一致。

../_images/add2f4f32678fe555861ae1763488afd.png
上传成功,输入R,点击发送,Keyes UNO R3 开发板上的 D13
的指示灯闪烁一次,串口监视器中显示 Hello World! 如下图
../_images/fa8f2de13c41710b9dbbfde0833eca74.png

那么恭喜你,你的第一个程序已经成功了!!!

实验课程#

实验一 LED 闪烁实验#

实验说明

LED 闪烁实验是比较基础的实验之一,上一个“ Hello World!”实验里已经利用到了Arduino 自带的LED,这次我们利用其他I/O
口和外接直插LED 灯来完成这个实验。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

../_images/2af89e5285face0b57f35a4caf172f3d.jpeg

测试代码

int led = 2; //定义数字口2

void setup()

{

  pinMode(led, OUTPUT);     //设置led为输出

}

void loop()

{

  digitalWrite(led, HIGH);   //开启led

  delay(1000); //延迟1秒

  digitalWrite(led, LOW);    //关闭led

  delay(1000);//延迟1秒

}

测试结果

下载完程序就可以看到我们的IO口外接小灯在闪烁了,这样我们的实验现象为LED不停闪烁,间隔大约为1秒。

实验二 呼吸灯实验#

实验说明

上一课程中我们只是控制LED的亮和灭,那么我们可以怎么控制LED的亮度呢?本课程中我们把LED接到PWM口中,然后通过改变PWM数值,调节LED亮度,使LED逐渐变亮,和逐渐变暗,从而达到呼吸灯的效果。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

../_images/6b6a8822a62acd33c10c59915afe97fb.jpeg

测试代码

int ledPin = 3; // 定义数字口3

void setup()

{

    pinMode(ledPin, OUTPUT);// 将ledPin设置为输出

}

void loop()

{

    for (int a=0; a<=255;a++)// 设置使LED逐渐变亮

    {

        analogWrite(ledPin,a); //开启led,调节亮度,范围是0-255,在255时led最亮

        delay(10); // 延迟0.01S

    }

    for (int a=255; a>=0;a--) // 设置使LED逐渐变暗

    {

        analogWrite(ledPin,a); //开启led,调节亮度,范围是0-255,在255时led最亮

        delay(10); // 延迟0.01秒

    }

    delay(1000);// 延迟1秒

}

测试结果

下载完程序就可以看到我们的IO口外接小灯显示出呼吸灯的效果,小灯先逐渐变亮,后逐渐变暗,循环交替。

实验三 广告灯实验#

实验说明

在生活中我们经常会看到一些由各种颜色的led灯组成的广告牌,广告牌上各个位置上癿led灯不断的变话,形成各种效果。本节实验就是利用led灯编程模拟广告灯效果。

实验器材

开发板*1

USB线*1

LED*5

220Ω 电阻*5

面包板*1

面包板连接线若干

接线图

../_images/5f396bc342428dce0d4c32c162161817.jpeg

测试代码

int BASE = 2 ; //第一个 LED 接的 I/O 口

int NUM = 5; //LED 的总数

void setup()

{

    for (int i = BASE; i < BASE + NUM; i ++)

    {

        pinMode(i, OUTPUT); //设定数字I/O口为输出

    }

}

void loop()

{

    for (int i = BASE; i < BASE + NUM; i ++)

    {

        digitalWrite(i, HIGH); //设定数字I/O口输出为"高",即逐渐开灯

        delay(200); //延迟

    }

    for (int i = BASE; i < BASE + NUM; i ++)

    {

        digitalWrite(i, LOW); //设定数字I/O口输出为"低",即逐渐关灯

        delay(200); //延迟

    }

}

测试结果

下载完程序就可以看到我们的IO口外接小灯先逐渐变亮,然后逐渐变暗,循环交替。

实验四 交通灯实验#

实验说明

前面我们已经完成了单个小灯的控制实验,接下来我们就来做一个稍微复杂一点的交通灯实验,其实聪明的朋友们可以看出来这个实验就是将上面单个小灯的实验扩展成3
个颜色的小灯,就可以实现我们模拟交通灯的实验了。

实验器材

红色LED*1

黄色LED*1

绿色LED*1

220Ω电阻*3

面包板*1

面包板连接线若干

接线图

../_images/a05594d6f47a47fdd3af019846cdbf4a.jpeg

测试代码

int redled =10; //定义数字10 接口

int yellowled =7; //定义数字7 接口

int greenled =4; //定义数字4 接口

void setup()

{

    pinMode(redled, OUTPUT);//定义红色小灯接口为输出接口

    pinMode(yellowled, OUTPUT); //定义黄色小灯接口为输出接口

    pinMode(greenled, OUTPUT); //定义绿色小灯接口为输出接口

}

void loop()

{

    digitalWrite(greenled, HIGH);////点亮 绿灯

    delay(5000);//延时5秒

    digitalWrite(greenled, LOW); //熄灭 绿灯

    for(int i=0;i<3;i++)//闪烁交替三次,黄灯闪烁效果

    {

        delay(500);//延时0.5 秒

        digitalWrite(yellowled, HIGH);//点亮 黄灯

        delay(500);//延时0.5 秒

        digitalWrite(yellowled, LOW);//熄灭 黄灯

    }

    delay(500);//延时0.5 秒

    digitalWrite(redled, HIGH);//点亮 红灯

    delay(5000);//延时5 秒

    digitalWrite(redled, LOW);//熄灭 红灯

}

测试结果

按照接线图接好线,上传完程序,上电后,我们就可以看到我们自己设计控制的交通灯了。实验效果为绿灯亮5秒,绿灯熄灭,黄灯循环闪烁3次,红灯亮5秒,依次循环。

实验五 按键控制LED实验#

实验说明

I/O 口的意思即为INPUT 接口和OUTPUT接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O口的输出功能,这个实验我们来尝试一下使用Arduino的I/O口的输入功能即为读取外接设备的输出值,我们用一个按键和一个LED小灯完成一个输入输出结合使用的实验,让大家能简单了解I/O 的作用。

实验器材

开发板 *1

USB线*1

LED*1

轻触按键*1

220Ω 电阻*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

../_images/225d0ea6c84efe2bcebb87ad2119c1e3.jpeg

测试代码

int ledPin = 11; //定义数字口11

int inputPin = 3; //定义数字口3

void setup()

{

    pinMode(ledPin, OUTPUT); //将ledPin设置为输出

    pinMode(inputPin, INPUT); //将inputPin设置为输入

}

void loop()

{

    int val = digitalRead(inputPin);

    //设置数字变量val,读取到数字口3的数值,并赋值给 val

    if (val == LOW) //当val为低电平时,LED变暗

    {

        digitalWrite(ledPin, LOW); // LED变暗

    }

    else

    {

        digitalWrite(ledPin, HIGH); // LED亮起

    }

}

测试结果

下载完程序,上电后,当按键按下时小灯亮起,否则小灯不亮。

实验六 抢答器实验#

实验说明

完成上面的实验以后相信已经有很多朋友可以独立完成这个实验了,我们可以将上面的按键控制小灯的实验扩展成4个按键对应3个小灯,占用7个数字I/O接口。为方便接线,我们把3个小灯用一个RGB灯代替。RGB灯可通过 R、 G、B三个引脚的PWM电压输入可以调节三种基色(红/蓝/绿)的强度从而实现全彩的混色效果。

本实验中我们利用4个按键控制3个PWM口,控制RGB模块发光颜色从而达到抢答器的效果。RGB灯接口说明如下图。

../_images/3ba9adbf9df5edb90bfe7a2e14efc26a.jpg

实验器材

开发板*1

USB线*1

RGB灯*1

轻触按键*4

10KΩ 电阻*4

330Ω 电阻*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

../_images/86f4101f67552cace9148864b1da7252.jpeg

测试代码

int redled=9;                       // 红色LED引脚(PWM)
int greenled=10;                    // 绿色LED引脚(PWM)
int blueled=11;                     // 蓝色LED引脚(PWM)

int redpin=5;                       // 红色按钮引脚(输入)
int greenpin=4;                     // 绿色按钮引脚(输入)
int bluepin=3;                      // 蓝色按钮引脚(输入)
int restpin=2;                      // 复位按钮引脚(输入)

int red;                            // 存储红色按钮状态
int green;                          // 存储绿色按钮状态
int blue;                           // 存储蓝色按钮状态

void setup()
{
  pinMode(redled,OUTPUT);           // 设置红色LED为输出
  pinMode(greenled,OUTPUT);         // 设置绿色LED为输出
  pinMode(blueled,OUTPUT);          // 设置蓝色LED为输出

  pinMode(redpin,INPUT);            // 设置红色按钮为输入
  pinMode(greenpin,INPUT);          // 设置绿色按钮为输入
  pinMode(bluepin,INPUT);           // 设置蓝色按钮为输入
}

void loop()
{
  red=digitalRead(redpin);          // 读取红色按钮状态
  green=digitalRead(greenpin);      // 读取绿色按钮状态
  blue=digitalRead(bluepin);        // 读取蓝色按钮状态

  if(red==LOW) RED_YES();           // 红色按钮按下时执行
  if(green==LOW) GREEN_YES();       // 绿色按钮按下时执行
  if(blue==LOW) BLUE_YES();         // 蓝色按钮按下时执行
}

void RED_YES()
{
  while(digitalRead(restpin)==1)    // 当复位按钮未按下时保持
  {
    color(255, 0, 0);               // 显示纯红色(R=255,G=0,B=0)
  }
  clear_led();                      // 退出后清除LED显示
}

void GREEN_YES()
{
  while(digitalRead(restpin)==1)    // 当复位按钮未按下时保持
  {
    color(0, 255, 0);               // 显示纯绿色(R=0,G=255,B=0)
  }
  clear_led();                      // 退出后清除LED显示
}

void BLUE_YES()
{
  while(digitalRead(restpin)==1)    // 当复位按钮未按下时保持
  {
    color(0, 0, 255);               // 显示纯蓝色(R=0,G=0,B=255)
  }
  clear_led();                      // 退出后清除LED显示
}

void clear_led()
{
  color(0, 0, 0);                   // 关闭所有LED(R=0,G=0,B=0)
}

void color(unsigned char red, unsigned char green, unsigned char blue)
{
  analogWrite(redled, red);         // 设置红色LED亮度(PWM)
  analogWrite(greenled,green);      // 设置绿色LED亮度(PWM)
  analogWrite(blueled, blue);       // 设置蓝色LED亮度(PWM)
}

测试结果

下载完程序,上电后,一个简单的抢答器就做好了,我们根据RGB灯显示的颜色判断是谁抢答成功。在复位后。RGB灯关闭。

实验七 电位器调控灯光亮度实验#

实验说明

在第二课程中我们直接通过PWM口控制灯的亮度,从而达到呼吸灯的效果。在这课程中我们通过一个电位器,利用电位器调节PWM值,从而控制灯的亮度。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

../_images/c7c1042f29b371ffcec19b88dcafa82c.jpeg

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

    pinMode(ledpin,OUTPUT);//定义数字接口11 为输出

    Serial.begin(9600);//设置波特率为9600

}

void loop()

{

    int val=analogRead(0);//读取模拟口A0口的值

    val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

    Serial.println(val);//显示val 变量

    analogWrite(ledpin,val);// 打开LED 并设置亮度

    delay(100);//延时0.1 秒

}

测试结果

下载完程序后。我们可以通过旋转可调电位器控制小灯的亮度,打开串口监视器,设置波特率为9600,就可看到调节LED亮度的PWM值。

实验八 有源蜂鸣器实验#

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了有源蜂鸣器,有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号。实验中中我们只需要给蜂鸣器输入一个高电平信号,蜂鸣器响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

../_images/3e80e4203f2c8348467ff55054686f65.jpeg

测试代码

int buzzer = 2; //定义数字口2

void setup()

{

  pinMode(buzzer, OUTPUT);     //设置buzzer为输出

}

void loop()

{

  digitalWrite(buzzer, HIGH);   //开启buzzer

  delay(1000); //延迟1S

  digitalWrite(buzzer, LOW);    //关闭buzzer

  delay(1000);//延迟1S

}

测试结果

下载完程序后,我们可以听到蜂鸣器响1秒,停止响起1秒,循环交替。

实验九 无源蜂鸣器实验#

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了无源蜂鸣器,无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。

实验器材

开发板 *1

USB线*1

无源蜂鸣器*1

面包板*1

正标线若干

接线图

../_images/d155ff0060bbdd64a8b65c00bfa63fdc.jpeg

测试代码

code 1:

int buzzer=3; //定义数字口3

void setup()

{

    pinMode(buzzer,OUTPUT);//将buzzer设置为输出

}

void loop()

{

    unsigned char i,j;//定义变量i,j

    while(1)

    {

        for(i=0;i<80;i++)// 输出一个频率的声音

        {

            digitalWrite(buzzer,HIGH);

            delay(1);//延迟1ms

            digitalWrite(buzzer,LOW);

            delay(1);//延迟1ms

        }

        for(i=0;i<100;i++)// 输出另一个频率的声音

        {

            digitalWrite(buzzer,HIGH);

            delay(2);//延迟2ms

            digitalWrite(buzzer,LOW);

            delay(2);//延迟2ms

        }

    }

}

code 2:

#define D0 -1

#define D1 262

#define D2 293

#define D3 329

#define D4 349

#define D5 392

#define D6 440

#define D7 494

#define M1 523

#define M2 586

#define M3 658

#define M4 697

#define M5 783

#define M6 879

#define M7 987

#define H1 1045

#define H2 1171

#define H3 1316

#define H4 1393

#define H5 1563

#define H6 1755

#define H7 1971

//列出全部D调的频率

#define WHOLE 1

#define HALF 0.5

#define QUARTER 0.25

#define EIGHTH 0.25

#define SIXTEENTH 0.625

//列出所有节拍

int tune[]= //根据简谱列出各频率

{

    M3,M3,M4,M5,

    M5,M4,M3,M2,

    M1,M1,M2,M3,

    M3,M2,M2,

    M3,M3,M4,M5,

    M5,M4,M3,M2,

    M1,M1,M2,M3,

    M2,M1,M1,

    M2,M2,M3,M1,

    M2,M3,M4,M3,M1,

    M2,M3,M4,M3,M2,

    M1,M2,D5,D0,

    M3,M3,M4,M5,

    M5,M4,M3,M4,M2,

    M1,M1,M2,M3,

    M2,M1,M1

};

float durt[]= //根据简谱列出各节拍

{

    1,1,1,1,

    1,1,1,1,

    1,1,1,1,

    1+0.5,0.5,1+1,

    1,1,1,1,

    1,1,1,1,

    1,1,1,1,

    1+0.5,0.5,1+1,

    1,1,1,1,

    1,0.5,0.5,1,1,

    1,0.5,0.5,1,1,

    1,1,1,1,

    1,1,1,1,

    1,1,1,0.5,0.5,

    1,1,1,1,

    1+0.5,0.5,1+1,

};

int length;

int tonepin=3; //得用3号接口

void setup()

{

    pinMode(tonepin,OUTPUT);

    length=sizeof(tune)/sizeof(tune[0]); //计算长度

}

void loop()

{

    for(int x=0;x<length;x++)

    {

        tone(tonepin,tune[x]);

        delay(500*durt[x]);//这里用来根据节拍调节延时,500这个指数可以自己调整,在该音乐中,我发现用500比较合适。

        noTone(tonepin);

    }

    delay(2000);

}

测试结果

实验中我们提供了两个例程,上传例程1代码后,蜂鸣器会发出两种不同的声音,实验中,两种声音循环交替。上传例程2中代码后,蜂鸣器会想响起《欢乐颂》的曲子。

实验十 74HC595实验#

实验说明

74HC595 简单说来就是具有8 位移位寄存器和一个存储器,以及三态输出功能。这里我们用它来控制8 个LED 小灯。我们为什么要用74HC595来控制小灯呢?一定会有朋友会问这个问题,我想问的是我们要是单纯的用Arduino 控制8个小灯的话要占用多少个I/O 呢?答案是8 个,但是我们的Arduino 168有几个I/O 口呢?加上模拟接口也就20 个吧,这8个小灯占用了太多的资源了,我们用74HC595 的目的就是减少I/O口的使用数量。用74HC595 以后我们可以用3 个数字I/O 口控制8 个LED小灯岂不美哉。

实验器材

开发板 *1

USB线*1

74HC595 DIP*1

红色LED*8

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

../_images/5f2fa33c47604b407f8a6953028bf89c.jpeg

测试代码

int data = 2;//74HC595的2脚 数据输入引脚SI

int clock = 5;//74hc595的4脚 时钟线 SCK

int latch = 4;//74hc595的5脚 输出存储器锁存线RCK

int ledState = 0;

const int ON = HIGH;

const int OFF = LOW;

void setup()

{

    pinMode(data, OUTPUT);

    pinMode(clock, OUTPUT);

    pinMode(latch, OUTPUT);

}

void loop()

{

    for(int i = 0; i < 256; i++)

    {

        updateLEDs(i);

        delay(500);

    }

}

void updateLEDs(int value)

{

    digitalWrite(latch, LOW);

    shiftOut(data, clock, MSBFIRST, ~value);//串行数据输出,高位在先

    digitalWrite(latch, HIGH);//锁存

}

测试结果

下载完程序大家就可以看到8 个小灯闪烁的美妙场景了。实验现象是看到八位LED显示八位二进制数,循环自加1。

实验十一 红外遥控器实验#

实验说明

红外遥控器发出的信号是一连串的二进制脉冲码。为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去,而红外线接收装置则要滤除其他杂波,叧接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调.

实验中我们用一个红外遥控和一个红外接收头控制6个LED灯的亮和灭。实验前,我们要对红外遥控进行解码。

实验器材

开发板*1

USB线*1

红外遥控*1

红外接收 VS1838B*1

红色LED*6

220Ω 电阻*6

面包板*1

面包板连接线若干

接线图

红外解码接线

../_images/3ecd10319939ba8f817a1cefa6a99843.jpeg

红外控灯实验接线

../_images/25966a6ed6ddb5ecdb465ecb06cb8330.jpeg

测试代码

红外解码

#include <IRremote.h>              // 红外遥控库头文件

int RECV_PIN = 11;                // 红外接收器连接引脚11
IRrecv irrecv(RECV_PIN);          // 创建红外接收对象
decode_results results;           // 存储解码结果的结构体

void setup()
{
  Serial.begin(9600);             // 初始化串口通信(9600bps)
  irrecv.enableIRIn();            // 启动红外接收器
}

void loop()
{
  if (irrecv.decode(&results))
  {  // 检查是否收到红外信号
    Serial.println(results.value, HEX);  // 以16进制格式输出红外编码
    irrecv.resume();              // 准备接收下一个信号
  }
}

红外控灯实验

#include <IRremote.h>              // 红外遥控库

int RECV_PIN = 11;                 // 红外接收器信号引脚
int LED1 = 2;                      // LED1控制引脚
int LED2 = 3;                      // LED2控制引脚
int LED3 = 4;                      // LED3控制引脚
int LED4 = 5;                      // LED4控制引脚
int LED5 = 6;                      // LED5控制引脚
int LED6 = 7;                      // LED6控制引脚

// 定义各LED开关的红外编码(16进制)
long on1 = 0x00FF6897;             // LED1开启编码
long off1 = 0x00FF9867;            // LED1关闭编码
long on2 = 0x00FFB04F;             // LED2开启编码
long off2 = 0x00FF30CF;            // LED2关闭编码
long on3 = 0x00FF18E7;             // LED3开启编码
long off3 = 0x00FF7A85;            // LED3关闭编码
long on4 = 0x00FF10EF;             // LED4开启编码
long off4 = 0x00FF38C7;            // LED4关闭编码
long on5 = 0x00FF5AA5;             // LED5开启编码
long off5 = 0x00FF42BD;            // LED5关闭编码
long on6 = 0x00FF4AB5;             // LED6开启编码
long off6 = 0x00FF52AD;            // LED6关闭编码

IRrecv irrecv(RECV_PIN);           // 创建红外接收对象
decode_results results;            // 存储解码结果

void setup()
{
  pinMode(RECV_PIN, INPUT);        // 设置红外接收引脚为输入
  pinMode(LED1, OUTPUT);           // 设置LED1为输出
  pinMode(LED2, OUTPUT);           // 设置LED2为输出
  pinMode(LED3, OUTPUT);           // 设置LED3为输出
  pinMode(LED4, OUTPUT);           // 设置LED4为输出
  pinMode(LED5, OUTPUT);           // 设置LED5为输出
  pinMode(LED6, OUTPUT);           // 设置LED6为输出
  irrecv.enableIRIn();             // 启动红外接收
}

int on = 0;                        // LED状态标志位
unsigned long last = millis();     // 记录最后接收时间

void loop()
{
  if (irrecv.decode(&results))     // 检查是否收到红外信号
  {
    // 防抖处理:两次接收间隔需大于250ms
    if (millis() - last > 250)     // 防止信号重复触发
    {
      on = !on;                    // 切换状态标志
    }

    // 根据红外编码控制LED状态
    if (results.value == on1 )     // 匹配LED1开启编码
      digitalWrite(LED1, HIGH);    // 点亮LED1
    if (results.value == off1 )    // 匹配LED1关闭编码
      digitalWrite(LED1, LOW);     // 熄灭LED1

    if (results.value == on2 )     // LED2控制
      digitalWrite(LED2, HIGH);
    if (results.value == off2 )
      digitalWrite(LED2, LOW);

    if (results.value == on3 )     // LED3控制
      digitalWrite(LED3, HIGH);
    if (results.value == off3 )
      digitalWrite(LED3, LOW);

    if (results.value == on4 )     // LED4控制
      digitalWrite(LED4, HIGH);
    if (results.value == off4 )
      digitalWrite(LED4, LOW);

    if (results.value == on5 )     // LED5控制
      digitalWrite(LED5, HIGH);
    if (results.value == off5 )
      digitalWrite(LED5, LOW);

    if (results.value == on6 )     // LED6控制
      digitalWrite(LED6, HIGH);
    if (results.value == off6 )
      digitalWrite(LED6, LOW);

    last = millis();               // 更新最后接收时间
    irrecv.resume();               // 准备接收下个信号
  }
}

注意:在上传程序前,要把IRremote 文件夹放到编译器安装目录下的Arduinolibraries里。不然编译不过。例如我的:C:Program FilesArduinolibraries

测试结果

按照接线图接好线,上传好代码,上电后,红外解码时,红外遥控对准红外接收头按下按键,即可在Arduino IDE的串口监视器中看到对应的编码,详细编码如下图。

../_images/e8c16d5775711130f33efa80fc34d3c5.jpeg

红外控灯实验时,我们将遥控器对准红外接收头,按下1 2 3 4 5 6 7 8 9 * 0#共12个按键就可控制6个LED灯的亮与灭。