查看: 31815|回复: 40

[基础教程] DFR0100 Arduino教程 16--遥控灯

[复制链接]
该教程实验平台:Arduino入门套件
上一篇教程:
Arduino教程 Lesson 15--红外接收

前一节对红外接收管如何使用有了简单的了解,这一节我们做个好玩儿的东西,遥控灯!

所需材料
  • 1×   5mm LED灯  
  • 1×   220欧电阻
  • 1×   红外接收管
  • 1×   Mini遥控器

STEP 1: 硬件连接
其实就是在原有的基础上,加了个LED和电阻,LED使用的是数字引脚10。红外接收管仍然接的是数字引脚11。
1.jpg


STEP 2: 输入代码
这里不建议一步一步输入代码,可以在原有的代码上进行修改,观察下相对前一段代码增加了哪些内容。
  1. #include <IRremote.h>
  2. int RECV_PIN = 11;              
  3. int ledPin = 10;                // LED – digital 10
  4. boolean ledState = LOW;         // ledstate用来存储LED的状态
  5. IRrecv irrecv(RECV_PIN);
  6. decode_results results;

  7. void setup(){
  8.      Serial.begin(9600);
  9.      irrecv.enableIRIn();
  10.      pinMode(ledPin,OUTPUT);       // 设置LED为输出状态
  11. }

  12. void loop() {
  13.       if (irrecv.decode(&results)) {     
  14.               Serial.println(results.value, HEX);

  15.               //一旦接收到电源键的代码, LED翻转状态,HIGH变LOW,或者LOW变HIGH
  16.          if(results.value == 0xFD00FF){
  17.                  ledState = !ledState;             //取反      
  18.                  digitalWrite(ledPin,ledState);    //改变LED相应状态        
  19.             }     
  20.             irrecv.resume();
  21.         }
  22. }
复制代码


STEP 3: 代码回顾
程序一开始还是对红外接收管的一些常规定义,按原样搬过来就可以了。
  1. #include <IRremote.h>      //调用IRremote.h库
  2. int RECV_PIN = 11;         //定义RECV_PIN变量为11
  3. IRrecv irrecv(RECV_PIN);   //设置RECV_PIN(也就是11引脚)为红外接收端
  4. decode_results results;    //定义results变量为红外结果存放位置

  5.      int ledPin = 10;                // LED – digital 10
  6. boolean ledState = LOW;         // ledstate用来存储LED的状态
复制代码
setup()函数中,对使用串口,启动红外解码,数字引脚模式进行设置。

到了主函数loop(),一开始还是先判断是否接收到红外码,并把接收到的数据存储在变量results中。
  1. if (irrecv.decode(&results))
复制代码

一旦接收到数据后,程序就要做两件事。第一件事,判断是否接收到了电源键的红外码。
  1. if(results.value == 0xFD00FF)
复制代码

第二件事,就是让LED改变状态。
  1. ledState = !ledState;             //取反      
  2.    digitalWrite(ledPin,ledState);    //改变LED相应状态
复制代码
这里可能对“!”比较陌生,“!”是一个逻辑非的符号,“取反”的意思。我们知道“!=”代表的是不等于的意思,也就是相反。这里可以类推为,!ledState是ledState相反的一个状态。“!”只能用于只有两种状态的变量中,也就是boolean型变量。

最后,继续等待下一组信号。
  1. irrecv.resume();
复制代码


可以做些其他的事
1、通过这个遥控项目,再结合上一个项目的风扇,能不能再给遥控器增加一个功能,既可控灯,还可控风扇。
2、DIY一个你的遥控作品吧!比如简单的会动的小人,结合我们前面的舵机,通过遥控器上不同的按键,让舵机转动不同的角度,感觉随你的控制转动,发挥你的想象做出更多Arduino作品吧!


fxt0706  初级技师

发表于 2014-8-1 21:56:31

本帖最后由 fxt0706 于 2014-8-1 22:02 编辑

给个赞
回复

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-8-4 11:35:26

回复

使用道具 举报

wanglei830205  初级技师

发表于 2014-10-3 20:44:29

刚刚用家里的电视机遥控器试了一下,可以替代Mini IR Remote Controller,没有mini遥控器的朋友可以试哈
回复

使用道具 举报

nivek  见习技师

发表于 2014-12-14 05:44:09

我一点下载就会出现:
C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5:16: error: 'TKD2' was not declared in this scope
int RECV_PIN = TKD2; // the pin the IR receiver is connected to
                ^
编译有误。

请各位大神解读一下
回复

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-12-14 12:57:35

wanglei830205 发表于 2014-10-3 20:44
刚刚用家里的电视机遥控器试了一下,可以替代Mini IR Remote Controller,没有mini遥控器的朋友可以试哈 ...

好办法~
回复

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-12-14 12:58:13

nivek 发表于 2014-12-14 05:44
我一点下载就会出现:
C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5: ...

你完整代码什么样的?
回复

使用道具 举报

wanglei830205  初级技师

发表于 2014-12-18 18:37:01

直接论坛里面红外的例子的代码拿来改改就可以用,自己家的遥控器发射时,用AURDUINO捕捉,用电脑的串口查出每个按键的码,然后就可以编程序了
回复

使用道具 举报

wanglei830205  初级技师

发表于 2014-12-18 18:40:03

#include <IRremote.h>
int RECV_PIN = 11;              
int ledPin = 10;                // LED – digital 10
//int ledPin9=9;// LED – digital 9
//int ledPin8=8;// LED – digital 8
boolean ledState = LOW;         // ledstate用来存储LED的状态
//boolean ledState9 = LOW;         // ledstate用来存储LED9的状态
//boolean ledState8 = LOW;         // ledstate用来存储LED8的状态
IRrecv irrecv(RECV_PIN);
decode_results results;
#include <Servo.h>           // 声明调用Servo.h库
Servo myservo;               // 创建一个舵机对象

//int potpin = 0;              // 连接到模拟口0               
int val=0;                     //变量val用来存储从模拟口0读到的值
void setup(){
     Serial.begin(9600);
     irrecv.enableIRIn();
     pinMode(ledPin,OUTPUT);       // 设置LED为输出状态
//      pinMode(ledPin9,OUTPUT);       // 设置LED为输出状态
//       pinMode(ledPin8,OUTPUT);       // 设置LED为输出状态V
myservo.attach(9);          // 将引脚9上的舵机与声明的舵机对象连接起来
}

void loop() {
      if (irrecv.decode(&results)) {     
              Serial.println(results.value, HEX);

              //一旦接收到电源键的代码, LED翻转状态,HIGH变LOW,或者LOW变HIGH
       //  if(results.value == 0xFD00FF){
           if(results.value == 0xFD48B7){//Button 3
          //   if(results.value == 0x1EC81DBF){//TVButton 3
//                 ledState = !ledState;             //取反      
//                 digitalWrite(ledPin,ledState);    //改变LED相应状态        
                 val-=100;
                 
                 ledState = 1;
                 if(val<100)
                 {val=100;ledState=0;}
            }     
          if(results.value == 0xFD08F7){//Button1
          //if(results.value == 0x6BC6597B){//TVButton1
//                 ledState9 = !ledState9;             //取反      
//                 digitalWrite(ledPin9,ledState9);    //改变LED相应状态        
val+=100;

ledState = 1;
if(val>900)
{val=900;ledState=0;}


            }         
//             if(results.value == 0xFD8877){//Button2
//           //  if(results.value == 0x735B797E){//TVButton2
//                 ledState8 = !ledState8;             //取反      
//                 digitalWrite(ledPin8,ledState8);    //改变LED相应状态        
//            }        

if(ledState==1){
           int val1;
           Serial.println(val);
  val1 = map(val, 0, 1023, 0, 179);  //通过map函数进行数值转换   
              myservo.write(val1);               // 给舵机写入角度  
              ledState=0;
}
       delay(15);                        // 延时15ms让舵机转到指定位置  
            irrecv.resume();
        }
}
回复

使用道具 举报

wanglei830205  初级技师

发表于 2014-12-18 18:40:41

我用遥控来控制舵机
回复

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-12-19 10:18:35

nivek 发表于 2014-12-14 05:44
我一点下载就会出现:
C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5: ...

你可以看看wanglei830205的回帖~
回复

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-12-19 10:18:54

wanglei830205 发表于 2014-12-18 18:40
#include
int RECV_PIN = 11;              
int ledPin = 10;                // LED – digital 10

很不错呀哇~
回复

使用道具 举报

tyjjr  初级技匠

发表于 2014-12-19 18:05:27

赞一个~  
回复

使用道具 举报

flugkatze  见习技师

发表于 2014-12-26 19:24:21

nivek 发表于 2014-12-14 05:44
我一点下载就会出现:
C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5: ...

我也碰到这个问题
回复

使用道具 举报

flugkatze  见习技师

发表于 2014-12-26 21:01:14

nivek 发表于 2014-12-14 05:44
我一点下载就会出现:
C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5: ...

好像是arduino自带的库有问题,加载前一个实验里附件里的库就没问题了。
回复

使用道具 举报

droid_noob  见习技师

发表于 2015-2-8 21:04:26

请教:
拿这个电路和 Lesson 14--自制风扇 的电路简单合并了一下(就是把手动开关,换成红外遥控的)

发现一个奇怪情况,只要直流电机并在电路里面。
一旦继电器被导通,电机 LED开始工作,IRemote 部分似乎就罢工了,什么反映都没有。
Arduino板子上只要收到红外信号,总有个LED会闪亮,这种情况下,不论怎么发信号都不亮

但是只要把直流电机从里面拿走,剩下的部分可以非常完美的工作。
怎么破?
回复

使用道具 举报

droid_noob  见习技师

发表于 2015-2-8 21:18:36

droid_noob 发表于 2015-2-8 21:04
请教:
拿这个电路和 Lesson 14--自制风扇 的电路简单合并了一下(就是把手动开关,换成红外遥控的)

刚又试了一把,电机运作的时候,红外部分可以工作了
但是从串口里面出来的数据像是随机的,一般长按会一直吐FFFFFF
这种情况下面出来每一条都不一样,也不是FFFFFF
回复

使用道具 举报

Jane  管理员
 楼主|

发表于 2015-2-9 10:05:42

droid_noob 发表于 2015-2-8 21:18
刚又试了一把,电机运作的时候,红外部分可以工作了
但是从串口里面出来的数据像是随机的,一般长按会一 ...

你把电机直接接在UNO上,5V上驱动的了吗?会不会转一会儿就停了,或者POWER灯变暗了
回复

使用道具 举报

droid_noob  见习技师

发表于 2015-2-9 23:17:57

Jane 发表于 2015-2-9 10:05
你把电机直接接在UNO上,5V上驱动的了吗?会不会转一会儿就停了,或者POWER灯变暗了  ...

我去掉原型盾板,直接在 Uno 主板上试,效果是一样一样的

遥控器上挑一个键一直按住,从串口log上来看,IRemote 吐出来的东西是随机的
我去!直流电机还能不能一起快乐的玩耍了,一直干扰红外工作

截取一段串口数据:
...
AAD5B6D4 // 这东西位数都不对了,正常应该是6位,这7、8位
44172A6A
C40BD817
FEAC02E4
202F132B
4CB0FADF
3021E99
4AB0F7B5
DBE32B77
DE80C3EB
69DBBC3E
...

===========================================================

你说的:会不会转一会儿就停了,或者POWER灯变暗了
这个真没见着。

===========================================================

其实电路很简单,红外控制继电器开合,继电器4脚6脚,连直流电机两端

验证这个电路也很简单,直流电机换成一个LED就行了,LED 的时候,完美工作啊

要不楼主试试,很诡异
回复

使用道具 举报

Jane  管理员
 楼主|

发表于 2015-2-10 10:16:38

droid_noob 发表于 2015-2-9 23:17
我去掉原型盾板,直接在 Uno 主板上试,效果是一样一样的

遥控器上挑一个键一直按住,从串口log上来看, ...

好啊,你把你的代码和连接图贴上来,我试试看
回复

使用道具 举报

droid_noob  见习技师

发表于 2015-2-10 22:07:07

本帖最后由 droid_noob 于 2015-2-12 00:40 编辑
Jane 发表于 2015-2-10 10:16
好啊,你把你的代码和连接图贴上来,我试试看


## 这图里的 继电器可能型号有点问题,找了个样子有点像的## 总归就是Lesson 14里说的那种6脚的继电器,1、2脚做输入控制,输出脚只用4、6

直流电机本质上就是一根导线,工作之后是不是把板子局部短路了,才出这种问题的?
但是板子还是可以收信号的,只是解析出来的结果有问题,请教  

下面是代码,仅仅改了几句话而已
#include <IRremote.h>
int RECV_PIN = 11;              
int relayPin = 2;                // Relay – digital 2
boolean relayState = LOW;         // 继电器初始状态为LOW
IRrecv irrecv(RECV_PIN);        //设置RECV_PIN(11脚)为红外接收端
decode_results results;

void setup(){
     Serial.begin(9600);
     irrecv.enableIRIn();          //启动红外解码
     pinMode(relayPin,OUTPUT);       // 设置relayPin为输出状态
}

void loop() {
      //是否接收到解码数据,把接收到的数据存储在变量results中
      if (irrecv.decode(&results)) {     
              Serial.println(results.value, HEX);

         //一旦接收到电源键的代码, relay翻转状态,HIGH变LOW,或者LOW变HIGH
         if(results.value == 0xFD00FF) {
                 relayState = !relayState;             //取反      
                 digitalWrite(relayPin,relayState);    //改变relay相应状态        
         }     
         irrecv.resume(); // 继续等待接收下一组信号
      }
}




回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail