之前我们学习了如何 使用开关控制led灯,这次我们尝试用红外线发射接收装置代替开关 来远程控制led灯。
不同的红外线遥控器的编码方式不同,我们选用了新手常用的NEC协议遥控器:
红外接收装置连线图(led灯连线不再赘述)
如图将VOUT接到10号端口,GND接到实验板上的GND,VCC接到实验板上的+5v。
连线效果图:
开发环境安装IRremote扩展
IRremote扩展在硬件上支持多种主控板,软件上支持多种红外协议本,而且便于扩展和用户自定义,使用比较广泛。
搜索并安装IRremote库
增加红外控制代码(红色是变化部分)
#include <IRremote.h>//包含红外库
int onoffPin = 8;//开关输入端口
int infraredPin = 10;//红外线接收器端口
long INFRARED_C = 0x00FFB04F;//红外遥控器上的C键指令
int flickerPin = 9; //闪烁端口
int buzzerPin = 3; //蜂鸣器端口
int orderPin = 4; //顺序亮起起始端口
int orderLen = 4; //顺序亮起端口个数
int pwmPin = 0; //pwm脉宽模拟A0端口
int i = 0;
IRrecv irrecv(infraredPin);//初始化红外接收器对象
decode_results results;//定义results变量为红外结果存放位置
void setup() {
//开关端口初始化
pinMode(onoffPin, INPUT);
//红外接收器端口初始化
pinMode(infraredPin, INPUT);
//闪烁端口初始化
pinMode(flickerPin, OUTPUT);
//蜂鸣器端口初始化
pinMode(buzzerPin, OUTPUT);
//顺序亮起端口初始化
for (i = orderPin; i < orderPin + orderLen; i++) {
pinMode(i, OUTPUT);
}
//波特率9600
Serial.begin(9600);
//启动红外解码
irrecv.enableIRIn();
}
void loop() {
//检测是否收到红外信号
int click_c = LOW;
if (irrecv.decode(&results)) {//是否接收到解码数据,把接收到的数据存储在变量results中
Serial.println(results.value, HEX);//接收到的数据以16进制的方式在串口输出//接收到的数据以16进制的方式在串口输出
if (results.value == INFRARED_C ) {//遥控器按下了c键
click_c = HIGH;
}
irrecv.resume(); // 继续等待接收下一组信号
}
int var = digitalRead(onoffPin);//读取开关端口电瓶值
int pwm = analogRead(pwmPin);//读取传感器模拟脉宽值(0-1024)
Serial.print(pwm);
Serial.print("/4=");
Serial.println(pwm / 4);
if (var == HIGH || click_c == HIGH) { //执行闪烁灯闪烁,其他端口灯顺序亮起
//闪烁端口亮起
digitalWrite(flickerPin, LOW);
delay(500);
digitalWrite(flickerPin, HIGH);
delay(500);
//蜂鸣器间歇响起
for (i = 0; i < 30; i++) {
digitalWrite(buzzerPin, HIGH);
delay(20);
digitalWrite(buzzerPin, LOW);
delay(20);
}
//顺序端口亮起
for (i = orderPin; i < orderPin + orderLen; i++) {
digitalWrite(i, HIGH);
delay(100);
}
delay(1000);
} else {
//闪烁端口熄灭
//digitalWrite(flickerPin, pwmHIGH);
analogWrite(flickerPin, pwm / 4); //模拟输出高电平亮度值(0-254) 注:模拟输出函数只工作在引脚3,5,6,9,10和11上有效!!!
/*delay(500);
digitalWrite(flickerPin, LOW);*/
//顺序端口熄灭
for (i = orderPin; i < orderPin + orderLen; i++) {
digitalWrite(i, LOW);
}
//delay(500);
}
}
运行效果
其它
使用最新版本arduino开发工具时,编译会报以下错误:
“IRremote.h” 对应多个库
已使用: /Users/yanjingang/Documents/Arduino/libraries/IRremote
未使用:/Applications/Arduino.app/Contents/Java/libraries/RobotIRremote
原因:最新版本内置了一个精简版的IRremote,去掉了很多东西,但却没有改类名和文件名。。。
解决方法:直接进入/Applications/Arduino.app/Contents/Java/libraries目录,将RobotIRremote库文件压缩保存,然后删除即可,后续使用我们上边安装的完整版本即可
yan 2016.9.6 23:55
偶然来访,受益良多!
认真拜读中……