|
本帖最后由 happyhacking 于 2018-1-31 16:32 编辑
dfrobot创客社区已经有遥控灯的教程了,那么这个教程是否还有进步空间呢???答案是——有!!!
此处我们用红外遥控器控制三个LED亮灭达到变色的效果。如果可以日后使用继电器控制舞台灯光,就更好了。
以下为代码
/*
红外遥控器键盘1-9编码:
FD08F7 1
FD8877 2
FD48B7 3
FD28D7 4
FD28D7 5
FD6897 6
FD18E7 7
FD9867 8
FD58A7 9
FD30CF 0
*/
#include <IRremote.h>
int red = 5;
int green = 6;
int blue = 7;
int recvPin = 11;//定义红外接收器的引脚为3
IRrecv irrecv(recvPin);
decode_results results;
long KEY_CODE_ONE = 0xFD08F7;
long KEY_CODE_TWO = 0xFD8877;
long KEY_CODE_THE = 0xFD48B7;
long KEY_CODE_FUR = 0xFD28D7;
long KEY_CODE_FVE = 0xFDA857;
long KEY_CODE_SIX = 0xFD6897;
long KEY_CODE_SEV = 0xFD18E7;
long KEY_CODE_EGT = 0xFD9867;
long KEY_CODE_NIN = 0xFD58A7;
long KEY_CODE_ZER = 0xFD30CF;
void setup() {
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(blue, OUTPUT);
irrecv.enableIRIn(); // 初始化红外接收器
Serial.begin(9600);
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);//以16进制换行输出接收代码
Serial.println();//为了便于观看输出结果增加一个空行
irrecv.resume(); // 接收下一个值
}
//按下1键的事件
if (results.value == KEY_CODE_ONE ) {
red_on(red);
}
//按下2键的事件
if (results.value == KEY_CODE_TWO ) {
blue_on(blue);
}
//按下 3 键的事件
if (results.value == KEY_CODE_THE ) {
green_on(green);
}
//按下 4 键的事件
if (results.value == KEY_CODE_FUR ) {
red_on(red);
blue_on(blue);
}
//5
if (results.value == KEY_CODE_FVE ) {
red_on(red);
green_on(green);
}
//6
if (results.value == KEY_CODE_SIX ) {
green_on(green);
blue_on(blue);
}
//7
if (results.value == KEY_CODE_SEV ) {
red_on(red);
blue_on(blue);
green_on(green);
}
//8
if (results.value == KEY_CODE_EGT ) {
all_slblink( green, red , blue);
}
//9
if (results.value == KEY_CODE_NIN ) {
all_fblink( green, red , blue);
}
//0
if (results.value == KEY_CODE_ZER ) {
all_Off( green, red, blue);
}
}
// 红灯亮
void red_on(int red) {
digitalWrite(green,LOW);
digitalWrite(blue,LOW);
digitalWrite(red,HIGH);
}
// 熄灯
void all_Off(int green,int red,int blue) {
digitalWrite(green, LOW);
digitalWrite(red, LOW);
digitalWrite(blue, LOW);
}
//全慢闪
void all_slblink(int green,int red , int blue) {
digitalWrite(green, HIGH);
digitalWrite(red, HIGH);
digitalWrite(blue,HIGH);
delay(1500);
digitalWrite(green, LOW);
digitalWrite(red, LOW);
digitalWrite(blue,LOW);
delay(1500);
}
//全快闪
void all_fblink(int green,int red , int blue) {
digitalWrite(green, HIGH);
digitalWrite(red, HIGH);
digitalWrite(blue,HIGH);
delay(750);
digitalWrite(green, LOW);
digitalWrite(red, LOW);
digitalWrite(blue,LOW);
delay(750);
}
//蓝灯亮
void blue_on(int blue) {
digitalWrite(green,LOW);
digitalWrite(blue,HIGH);
digitalWrite(red,LOW);
}
//绿灯亮
void green_on(int green) {
digitalWrite(green,HIGH);
digitalWrite(blue,LOW);
digitalWrite(red,LOW);
}
//全开
void all_on(int green,int red,int blue) {
digitalWrite(green, HIGH);
digitalWrite(red, HIGH);
digitalWrite(blue,HIGH);
}
此处红灯接数字5,蓝灯接数字7,绿灯接数字6.
红外接收头接数字11。
将以上代码上传至arduino即可。
!!!注意!!!
在编译时可能会出现:“error: ‘TKD2′ was not declared in this scope”
提示出错的原因是:IRremoteTools冲突。百度一下原因为Arduino 1.5.5 r2以后加入的RobotIRremote 库与 IRremote库有冲突。在IRremoteTools.cpp中有如下代码:
[cpp] view plain copy
#include "IRremote.h"
#include "IRremoteTools.h"
#include <Arduino.h>
int RECV_PIN = TKD2; // the pin the IR receiver is connected to
IRrecv irrecv(RECV_PIN); // an instance of the IR receiver object
decode_results results; // container for received IR codes
上述代码中将TKD2赋予 RECV_PIN,而我们写的代码里并没有定义TKD2,因此编译程序执行到这时报错。
那么如何处理嘞???
解决方法是在Arduino安装目录…Arduino\libraries\RobotIRremote\src 文件夹下将"IRremoteTools。cpp、IRremoteTools。h删除即可
|
|