本帖最后由 AllBlue 于 2013-8-15 20:22 编辑
红外遥控实验 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。这次实验我们就做一个遥控LED 灯实验。
实验元件: UNO 实验套装(UNO兼容板一块、USB数据线一根、优质面包板一块、彩色面包板线若干 ) 红外接收管 一个 mini遥控器 一个 LED 一枚 电阻220欧 一个 我们使用的红外接收管型号为HS0038,它有3个引脚分别为 out(信号输出)、GND(地)、Vcc(电源正极);实物图如下:
下图为mini遥控器(使用是将薄膜抽掉,它的作用是绝缘,防止电池工作):
红外遥控原理框图:
将HS0038 的Vcc 接控制板5V 接口,OUT 接Digital 11 口,GND接负极;LED 灯正极接Digital 10 口,负极通过220 欧电阻接GND; 实验电路如下:
实验例程: - /*
- 红外遥控实验
- */
- #include <IRremote.h>
- int RECV_PIN = 11; //红外线接收器OUTPUT端接在pin 11
- int LED = 10; // 定义LED引脚为11
- IRrecv irrecv(RECV_PIN); // 定义IRrecv 对象来接收红外线信号
- decode_results results; //解码结果放在decode_results构造的对象results里
- void irdisplay(unsigned long value) // 按下按键后,显示本遥控对应的按键
- {
- switch(value){ //判定按下的是哪个按键,串口显示按钮名称
- case 0xFFA25D:
- digitalWrite(LED, LOW); //电源键按下,执行关闭LED灯
- break;
- case 0xFFE21D:
- digitalWrite(LED, HIGH); //静音键按下,执行点亮LED灯
- break;
- }
- }
- void setup()
- {
- pinMode(LED,OUTPUT); // 定义LED为输出引脚
- Serial.begin(9600); //开启串口通信,并设定波特率为9600
- irrecv.enableIRIn(); //启动红外解码
- }
- void loop() {
- if (irrecv.decode(&results))
- {//解码成功,收到一组红外线信号
- irdisplay(results.value);
- irrecv.resume();
- }
- }
复制代码我们先用函数irrecv.enableIRIn()启动红外解码后,这时候IRrecv对象会在后台接收红外线信号,接着就可以利用decode()函数持续检查,看看有没有解码成功。irrecv.decode(&results) 解码成功,这个函数会返回true,并把结果放在results 里面,在解码一个红外线信号之后,要运行resume()函数,这样才会持续接收下一组信号。 将程序上传控制板后,我们用遥控器指向红外接收头,按下绿色静音按钮,LED 灯被点亮,按下红色电源按钮,LED 熄灭。 程序中所调用的库文件:
(库文件使用方法:1.解压压缩红外遥控器解码库文件夹中文件:IRremote.rar
2.把解压出来的文件复制到 arduino/libraries 中
3.重新启动arduino IDE就可以编辑了)
程序中: case 0xFFA25D: digitalWrite(LED, LOW); //电源键按下,执行关闭LED灯
break; case 0xFFE21D: digitalWrite(LED, HIGH); //静音键按下,执行点亮LED灯
break;
红色字为按钮的值,蓝色字为点亮与熄灭LED;LED的点亮与熄灭语句相信大家再熟悉不过了,但是按钮值是怎么得到的呢? 电路图如下(电路基本没变,只是去掉了LED):
下面我们通过一个程序来读出所有按钮的值: - /*
- 程序说明:解码红外遥控器
- */
- #include <IRremote.h>
- int RECV_PIN = 11; //红外线接收器OUTPUT端接在pin 11
- IRrecv irrecv(RECV_PIN); // 定义IRrecv 对象来接收红外线信号
- decode_results results; //解码结果放在decode_results构造的对象results里
- void setup()
- {
- Serial.begin(9600);
- irrecv.enableIRIn(); // 启动红外解码
- }
- void loop() {
- if (irrecv.decode(&results)) {
- // 解码成功,收到一组红外线信号
- Serial.print("irCode: ");
- Serial.print(results.value,HEX); // 输出红外线解码结果(十六进制)
- //results.value 是unsigned long型,头文件有介绍
- delay(100); //按键消抖
- Serial.print(", bits: ");
- Serial.println(results.bits); // 红外线码元位数
- irrecv.resume();
- }
- }
复制代码上传程序后,打开串口监视器,按下MINI遥控器上的各按钮,可以看到:
串口监视中看到的值,就是按钮的值!
|