红外遥控实验

红外遥控主要由红外发射和红外接收两部分组成。红外发射和接收的信号其实都是一连串的二进制脉冲码,高低电平按照一定的时间规律变换来传递相应的信息。为了使其在无线传输过程中免受其他信号的干扰,通常都将信号调制在特定的载波频率上(38K红外载波信号),通过红外发射二极管发射出去,而红外接收端则要将信号进行解调处理,还原成二进制脉冲码进行处理。

红外接收头有三个引脚,从左到右依次为VOUT、GND、VCC。红外遥控器发射的38K红外载波信号由遥控器里的编码芯片对其进行编码。当按下遥控器按键时,遥控器发出红外载波信号,红外接收器接收到信号,程序对载波信号进行解码,通过数据码的不同来判断按下的是哪个键。

接线

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <IRremote.h> //引入函数库

int RECV_PIN = 11; // 设定红外接收线的脚位为11
IRrecv irrecv(RECV_PIN); // 红外遥控初始化
decode_results results; // 接收到红外线信号值
//16738455 0

void setup()
{
pinMode(6,OUTPUT); //设置6号口接收LED灯

Serial.begin(9600); // 启用串口
Serial.println("Enabling IRin"); // 提示正在启用
irrecv.enableIRIn(); // 启用红外接收
Serial.println("Enabled IRin"); // 提示启用完成
}

void loop()
{
if (irrecv.decode(&results)) // 如果接收到红外线
{
Serial.println(results.value); // 打印出接收到的值

if(results.value==16738455) // 识别接收到的值
{
digitalWrite(6,!digitalRead(6)); // 设置LED改变原来的状态

if(digitalRead(6)==HIGH)
Serial.println("LED HIGH"); // 打印出接收到的值

if(digitalRead(6)==LOW)
Serial.println("LED LOW"); // 打印出接收到的值
}

irrecv.resume(); // 恢复接收下一个红外信号
}

delay(100);
}

红外遥控控制RGB显示不同颜色

RGB LED灯可以通过混合红色、绿色和蓝色这三种基本颜色来发出不同的颜色。所以它实际上由3个独立的LED组成,红色、绿色和蓝色包装在一个盒子里。这就是为什么它有4个引脚,3种颜色中的每一种都有一种引线,而RGB LED类型则有一种共用阴极或阳极。在本次使用的是共阴极。

使用PWM模拟输出,以便获得所需颜色

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <IRremote.h> //引入函数库

int RECV_PIN = 11; // 设定红外接收线的脚位为11
IRrecv irrecv(RECV_PIN); // 将红外线的脚位设定为11
decode_results results; // 接收到红外线信号值

void setup()
{
pinMode(5,OUTPUT); //设置5号口接收LED灯
pinMode(6,OUTPUT); //设置6号口接收LED灯
pinMode(7,OUTPUT); //设置7号口接收LED灯

Serial.begin(9600); // 启用串口
Serial.println("Enabling IRin"); // 提示正在启用
irrecv.enableIRIn(); // 启用红外接收
Serial.println("Enabled IRin"); // 提示启用完成
}

void loop()
{
if (irrecv.decode(&results)) // 如果接收到红外线
{
Serial.println(results.value); // 打印出接收到的值

if(results.value==16738455) // 0
{
setColor(0, 0, 0); //
delay(1000);
}

if(results.value==16724175) // 1
{
setColor(255, 0, 0); // Red Color
delay(1000);
}

if(results.value==16718055) // 2
{
setColor(0, 255, 0); // Green Color
delay(1000);
}

if(results.value==16753245) // 3
{
setColor(0, 0, 255); // Blue Color
delay(1000);
}

if(results.value==16716015) // 4
{
setColor(255, 255, 255); // White Color
delay(1000);
}

if(results.value==16726215) // 5
{
setColor(170, 0, 255); // Purple Color
delay(1000);
}

Serial.println();
irrecv.resume(); // 让接收器可以再接收
}
delay(100);
}

void setColor(int redValue, int greenValue, int blueValue) {
analogWrite(5, redValue);
analogWrite(6, greenValue);
analogWrite(7, blueValue);
}

所以现在在loop函数中我们将制作程序,它将每秒改变LED的颜色。 为了在LED获得红光,我们将调用**setColor()**函数,并为redValue参数设置值255,另外两个参数设置0。 我们分别可以得到另外两种基本颜色,绿色和蓝色。 为了获得其他颜色,我们需要混合参数值。 因此,例如,如果将所有3个LED设置为最大亮度,我们将获得白光,如果我们将以下值设置为参数:170 redValue、0 greenValue和255 blueValue,我们将获得紫色光。

脉冲码

使用红外遥控测得遥控器得十进制脉冲码(本人)

符号 十进制脉冲码 符号 十进制脉冲码
0 16738455 关机 16753245
1 16724175 Mode 16736925
2 16718055 静音 16769565
3 16743045 暂停 16720605
4 16716015 后退 16712445
5 16726215 前进 16761405
6 16734885 EQ 16769055
7 16728765 VOL- 16754775
8 16730805 VOL+ 16748655
9 16732845 RPT 16750695
(长按) 4294967295 U/SD 16756815