小猪学arduino—使用红外线发射和接收装置

之前我们学习了如何 使用开关控制led灯,这次我们尝试用红外线发射接收装置代替开关 来远程控制led灯。

不同的红外线遥控器的编码方式不同,我们选用了新手常用的NEC协议遥控器:

yaokong

 

红外接收装置连线图(led灯连线不再赘述)

test红外接收器

如图将VOUT接到10号端口,GND接到实验板上的GND,VCC接到实验板上的+5v

连线效果图:

IMG_3707

开发环境安装IRremote扩展

IRremote扩展在硬件上支持多种主控板,软件上支持多种红外协议本,而且便于扩展和用户自定义,使用比较广泛。

zz

搜索并安装IRremote库

zzz

增加红外控制代码(红色是变化部分)

#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);
	}

}

运行效果

IMG_3711

其它

使用最新版本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

《小猪学arduino—使用红外线发射和接收装置》有2个想法

发表评论

电子邮件地址不会被公开。