极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14123|回复: 4

遥控RGB灯

[复制链接]
发表于 2018-1-31 16:32:55 | 显示全部楼层 |阅读模式
本帖最后由 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删除即可
回复

使用道具 举报

发表于 2018-2-1 11:58:51 | 显示全部楼层
学习学习下,可以PWM吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-5 14:53:12 | 显示全部楼层
504835618 发表于 2018-2-1 11:58
学习学习下,可以PWM吗?

自动变化亮度吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-5 17:34:30 | 显示全部楼层
happyhacking 发表于 2018-2-5 14:53
自动变化亮度吗?

/*
日期:2016.9.1
功能:红外遥控器控制LED灯 开,关,闪烁,呼吸
元件:
    跳线公公头 * 5
    led 220欧电阻
    红外接收管,红外遥控
接线:
    红外灯面向自己从左到右分别接 IO3 ,GND ,5V
    LED 负极接GND 正极串联电阻接 IO5
红外遥控器键盘1-9编码:
FF30CF    1
FF18E7    2
FF7A85    3
FF10EF    4
FF38C7    5
FF5AA5    6
FF42BD    7
FF4AB5    8
FF52AD    9
参考:http://www.arduino.cn/thread-3259-1-1.html
*/

#include <IRremote.h>

int ledPin = 5;
int recvPin = 3;//定义红外接收器的引脚为3
IRrecv irrecv(recvPin);
decode_results results;

long KEY_CODE_ONE = 0xFF30CF;
long KEY_CODE_TWO = 0xFF18E7;
long KEY_CODE_THREE = 0xFF7A85;
long KEY_CODE_FOUR = 0xFF10EF;
long KEY_CODE_LONG_PRESS = 0xFFFFFFFF;
long longPressKey = -1; //长按下的那个键

void setup() {
  pinMode(ledPin, 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 ) {
    ledOn(ledPin);
    longPressKey = KEY_CODE_ONE;
  }
  //长按1键的事件
  if ( results.value == KEY_CODE_LONG_PRESS && longPressKey == KEY_CODE_ONE) {
    ledOn(ledPin);
  }

  //按下2键的事件
  if (results.value == KEY_CODE_TWO ) {
    ledOff(ledPin);
    longPressKey = KEY_CODE_TWO;
  }
  //长按 2键的事件
  if ( results.value == KEY_CODE_LONG_PRESS && longPressKey == KEY_CODE_TWO) {
    ledOff(ledPin);
  }
  //按下 3 键的事件
  if (results.value == KEY_CODE_THREE ) {
    flash(ledPin, 100, 100);
    longPressKey = KEY_CODE_THREE;
  }
  //长按 3 键的事件
  if ( results.value == KEY_CODE_LONG_PRESS && longPressKey == KEY_CODE_THREE) {
    flash(ledPin, 100, 100);
  }
  //按下 4 键的事件
  if (results.value == KEY_CODE_FOUR ) {
    fadeOn(1000, 5);
    fadeOff(1000, 5);
    longPressKey = KEY_CODE_FOUR;
  }
  //长按 4 键的事件
  if ( results.value == KEY_CODE_LONG_PRESS && longPressKey == KEY_CODE_FOUR) {
    fadeOn(1000, 5);
    fadeOff(1000, 5);
  }
}

// led亮灯
void ledOn(int ledPin) {
  digitalWrite(ledPin, HIGH);
}
// led熄灯
void ledOff(int ledPin) {
  digitalWrite(ledPin, LOW);
}
//led闪烁
void flash(int ledPin, long highDuration, long lowDuration) {
  digitalWrite(ledPin, HIGH);
  delay(highDuration);
  digitalWrite(ledPin, LOW);
  delay(lowDuration);
}
//呼吸灯On
void fadeOn(unsigned int time, int increament) {
  for (byte value = 0 ; value < 255; value += increament) {
    Serial.println(value);
    analogWrite(ledPin, value);
    delay(time / (255 / 5));
  }
}
//呼吸灯Off
void fadeOff(unsigned int time, int decreament) {
  for (byte value = 255; value > 0; value -= decreament) {
    Serial.println(value);
    analogWrite(ledPin, value);
    delay(time / (255 / 5));
  }
}
如下代码有让led渐亮渐暗的程序。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-21 00:31 , Processed in 0.057027 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表