2014-6-5 17:40:42 [显示全部楼层]
80023浏览
查看: 80023|回复: 55

[入门教程] Arduino教程16--红外遥控数码管「DFR0100 」

[复制链接]
【本篇课程内容于 2024年11月14日更新】
>本系教程配套硬件套件:【新版】Arduino入门套件 DFR0100

数码管,常见的用来显示数字的,像计算器屏幕上显示的数字就是一种数码管。在本项目之前我们先来了解一下数码管是如何工作的。数码管,其实也算是LED中的一种。数码管的每一段,都是一个独立的LED,通过数字引脚来控制相应段的亮灭就能达到显示数字的效果。现在,让我们通过完成项目的方式来感受一下数码管的神奇之处吧!

元件清单
Arduino教程16--红外遥控数码管「DFR0100 」图1

硬件连接

按下图连线图连接,注意数码管各段所对应的引脚。下边引脚说明图上为什么画这么几个箭头呢?个人觉得,这样看起来更方便。可以给你作为参考。我们从上面一排看,红色箭头的方向,从右往左,b → a → f → g的顺序正好对应,下面红色箭头逆时针顺序b → a → f → g。蓝色箭头也是表达的同样的意思。
我还特意在连线图上,对数码管所连接的引脚做了标示。这样就能更清楚的知道哪个引脚控制哪一段了。这8个电阻同样是起限流的作用。红外接收模块连线如图所示,如果有不清楚的地方请参考项目【红外遥控灯】。

Arduino教程16--红外遥控数码管「DFR0100 」图2
图 1 红外遥控数码管连线图

示例代码_1

样例代码1:
  1. //项目 – 红外遥控数码管_1
  2. void setup(){
  3.   for(int pin = 2 ; pin <= 9 ; pin++){      
  4. // 设置数字引脚2~9为输出模式
  5.       pinMode(pin, OUTPUT);
  6.       digitalWrite(pin, HIGH);
  7.   }
  8. }
  9. void loop() {
  10.      // 显示数字0         
  11.     int n0[8]={0,0,0,1,0,0,0,1};
  12. for(int pin = 2; pin <= 9 ; pin++){        
  13. // 数字引脚2~9依次按数组n0[8]中的数据显示
  14.        digitalWrite(pin,n0[pin-2]);
  15.     }
  16.     delay(500);
  17.    
  18.     // 显示数字1
  19.     int n1[8]={0,1,1,1,1,1,0,1};
  20. for(int pin = 2; pin <= 9 ; pin++){        
  21. // 数字引脚2~9依次按数组n1[8]中的数据显示
  22.        digitalWrite(pin,n1[pin-2]);
  23.     }
  24.     delay(500);
  25.    
  26.     // 显示数字2
  27.     int n2[8]={0,0,1,0,0,0,1,1};
  28. for(int pin = 2; pin <= 9 ; pin++){      
  29. // 数字引脚2~9依次按数组n2[8]中的数据显示
  30.        digitalWrite(pin,n2[pin-2]);
  31.     }
  32.     delay(500);   
  33.     // 显示数字3
  34.     int n3[8]={0,0,1,0,1,0,0,1};
  35. for(int pin = 2; pin <= 9 ; pin++){      
  36. // 数字引脚2~9依次按数组n3[8]中的数据显示
  37.        digitalWrite(pin,n3[pin-2]);
  38.     }
  39.     delay(500);  
  40.    
  41.     // 显示数字4
  42.     int n4[8]={0,1,0,0,1,1,0,1};
  43. for(int pin = 2; pin <= 9 ; pin++){      
  44. // 数字引脚2~9依次按数组n4[8]中的数据显示
  45.        digitalWrite(pin,n4[pin-2]);
  46.     }
  47.     delay(500);  
  48.    
  49.     // 显示数字5
  50.     int n5[8]={1,0,0,0,1,0,0,1};
  51. for(int pin = 2; pin <= 9 ; pin++){      
  52. // 数字引脚2~9依次按数组n5[8]中的数据显示
  53.        digitalWrite(pin,n5[pin-2]);
  54.     }
  55.     delay(500);
  56.    
  57.     // 显示数字6
  58.     int n6[8]={1,0,0,0,0,0,0,1};
  59. for(int pin = 2; pin <= 9 ; pin++){     
  60. // 数字引脚2~9依次按数组n6[8]中的数据显示
  61.        digitalWrite(pin,n6[pin-2]);
  62.     }
  63.     delay(500);
  64.    
  65.     // 显示数字7
  66.     int n7[8]={0,0,1,1,1,1,0,1};
  67. for(int pin = 2; pin <= 9 ; pin++){     
  68. // 数字引脚2~9依次按数组n7[8]中的数据显示
  69.        digitalWrite(pin,n7[pin-2]);
  70.     }
  71.     delay(500);
  72.    
  73.     // 显示数字8
  74.     int n8[8]={0,0,0,0,0,0,0,1};
  75. for(int pin = 2; pin <= 9 ; pin++){     
  76. // 数字引脚2~9依次按数组n8[8]中的数据显示
  77.        digitalWrite(pin,n8[pin-2]);
  78.     }
  79.     delay(500);
  80.    
  81.     // 显示数字9
  82.     int n9[8]={0,0,0,0,1,0,0,1};
  83. for(int pin = 2; pin <= 9 ; pin++){   
  84. //  数字引脚2~9依次按数组n9[9]中的数据显示
  85.        digitalWrite(pin,n9[pin-2]);
  86.     }
  87.     delay(500);
  88. }
复制代码

完成下载后,数码管就会循环显示0~9的数字。由于要看懂代码的话,首先需要了解数码管的构造,所以我们这回先说硬件部分。

硬件回顾
数码管其实就是一个前面介绍的LED的组合体,这个组合体包含8个LED,所以也称之为八段数码管。说白了就八个灯。哪八段?不用多说了吧!a到g以及小数点DP。其实用法和前面说的LED也是一样的,每段都是一个发光二极管,分别用8个数字口来控制它们的亮灭,通过不同段的显示,就能组成0~9的数字。比如,我们让b,a,f,e,d,c亮起的话,就能显示一个数字“0”了。
下面图2是个引脚说明图,不陌生了吧!在前面硬件连接的时候,已经看到过一次了。
这里,b → a → f → g → e → d → c → DP分别连接到Arduino数字引脚2~9。

Arduino教程16--红外遥控数码管「DFR0100 」图3
图 2 引脚连接说明图

数码管一共有10个引脚。a~DP 这8个引脚接到数字口,那还有两个引脚呢?另外两个引脚是公共端,LED只有一端是不能被点亮的。我们在项目【炫彩LED】中讲到过共阴共阳的问题,数码管也存在共阴共阳问题。所谓共阳就是公共端接+5V,共阴则是公共端接GND。
共阴共阳只是在代码上要稍作修改。我们这里选用的是共阳数码管。现在你对硬件有所了解了,我们来看看软件部分。

数码管的共阴共阳在使用上有什么区别?

共阳数码管,它们公共端接5V,那在代码中,控制另一端的数字引脚为LOW,这样才能让数码管点亮。如果是共阴数码管,公共端接GND,在代码中,控制另一端数字引脚为HIGH,才让数码管点亮。

代码回顾_1

硬件部分我们已经说过,数码管需要接到8个数字引脚,所以在一开始,需要定义8个数字引脚作为输出。这次我们用一个for循环来完成这8个数字引脚的设置。数码管b,a,f,g,e,d,c,DP分别和Arduino数字引脚2~9对应。

  1. for(int pin = 2 ; pin <= 9 ; pin++){ // 设置数字引脚2~9为输出模式
  2.       pinMode(pin, OUTPUT);
  3.       digitalWrite(pin, HIGH);
  4.   }
复制代码

从引脚2开始,一直循环到引脚9,都设为OUTPUT模式,初始化为HIGH。前面说过,共阳的话,设置HIGH,不被点亮,所以开始先不点亮数码管。(当
然,你一个一个引脚分开设置输出模式也是不会错的,只是会让代码显得很冗长)

好了,到了主函数,要分别显示0~9的数字。是不是觉得代码大部分都是相似的。所以,我们只要看明白如何显示数字0,那整段代码就都迎刃而解了。

int n0[8]={0,0,0,1,0,0,0,1};

这里我们要引入一个数组的概念。数组是一个变量的集合,可以通过索引号来找到数组中的元素。在我们的程序中,声明了一个int型的数组。并取名为n0。之后用8个数值来初始化这个数组。那如何获得数组中的元素呢?你只需要简单的指出这个元素的索引号。数组是从0开始索引的,这意味着数组中的第一个元素的索引号为0而不是1,因此数组中的8个元素的索引号是0~7。在这里元素4,对应索引号为3(n0[3]),值为1。元素8(索引号7,n0[7])的值为1。
声明中n0[8]的方括号中的8代表有8个元素。

定义完数组后,进入又一个for循环。

  1. for(int pin = 2; pin <= 9 ; pin++){        
  2. // 数字引脚2~9依次按数组n0[8]中的数据显示
  3.        digitalWrite(pin,n0[pin-2]);
  4.     }
复制代码

这个for循环是给2~9引脚写入状态值,也就是HIGH还是LOW,digitalWrite()函数中写入HIGH的另一种形式就是写入“1”,LOW则可以写为“0”。我们通过数组索引的方式给2~9引脚赋值。
比如当pin=2,代入n0[pin-2]中,对应为n0[0],n0[0]意思是获得数组的第一个元素,为0。完成了引脚2置低(LOW)。我们前面说了,共阳的数码管,置低(LOW)的话,是被点亮,所以,b端被点亮了。循环到pin=3,a段被点亮。循环到pin=4,f段被点亮,依次类推……。

整个循环过程如下:
pin=2 → n0[0] =0 → digitalWrite(2,0) → b段点亮
pin=3 → n0[1] =0 → digitalWrite(3,0) → a段点亮
pin=4 → n0[2] =0 → digitalWrite(4,0) → f 段点亮
pin=5 → n0[3] =1 → digitalWrite(5,1) → g段不点亮
pin=6 → n0[4] =0 → digitalWrite(6,0) → e段点亮
pin=7 → n0[5] =0 → digitalWrite(7,0) → d段点亮
pin=8 → n0[6] =0 → digitalWrite(8,0) → c段点亮
pin=9 → n0[7] =1 → digitalWrite(9,1) → DP段不点亮

这样就完成了显示数字“0”了。同样用数组的方法显示数字1~9。自己动手画一下,哪几段亮,哪几段不亮就一目了然了。

如果样例代码1弄明白后,我们要教大家一种更简单的方法,继续看下方的样例代码2。

示例代码_2
我们这里要教大家实现这个数码管0~9循环的代码另一种写法,上面我们说到了数组,通过创建10个数组用于显示0~9。这里同样也还是用数组写,区别在于代码1中其实准确的说应该叫一维数组,我们这里用到二维数据。这样一来,可以让代码看起来更简洁。动手输一下下面这段代码吧,看看是不是同样的效果!

样例代码2:
  1. //项目 – 红外遥控数码管_2
  2. int number[10][8] =
  3. {
  4.   {0,0,0,1,0,0,0,1},   //显示0
  5.   {0,1,1,1,1,1,0,1},   //显示1
  6.   {0,0,1,0,0,0,1,1},   //显示2
  7.   {0,0,1,0,1,0,0,1},   //显示3
  8.   {0,1,0,0,1,1,0,1},   //显示4
  9.   {1,0,0,0,1,0,0,1},   //显示5
  10.   {1,0,0,0,0,0,0,1},   //显示6
  11.   {0,0,1,1,1,1,0,1},   //显示7
  12.   {0,0,0,0,0,0,0,1},   //显示8
  13.   {0,0,0,0,1,0,0,1}    //显示9
  14. };
  15. void numberShow(int i){         //该函数用来显示数字
  16.     for(int pin = 2; pin <= 9 ; pin++){
  17.        digitalWrite(pin, number[i][pin - 2]);
  18.     }
  19. }
  20. void setup(){
  21.   for(int pin = 2 ; pin <= 9 ; pin++){ // 设置数字引脚2~9为输出模式
  22.       pinMode(pin, OUTPUT);
  23.       digitalWrite(pin, HIGH);
  24.   }
  25. }
  26. void loop() {      
  27.     for(int j = 0; j <= 9 ; j++){  
  28.           numberShow(j);       //调用numberShow()函数,显示0~9
  29.           delay(500);
  30.     }
  31. }
复制代码

代码回顾_2
对比一下样例代码1,能发现明显的区别在哪里了吗?代码1中,我们创建了10个一维数组,代码2只需要创建一个二维数组就全部搞定了。不要被什么一维、二维数组的名字给吓唬到,其实用法一样的。

Arduino教程16--红外遥控数码管「DFR0100 」图4

通过上面这个图,元素、一维数组、二维数组之间的关系就一目了然了。一维数组由元素组成,而二维数组则是由一个个一维数组组成的,关系就是那么简单。

样例代码1中,分别用10个数组,每个数组有8个元素,每个元素依次对应到数码管b~DP引脚状态值,这样就能在数码管上反映为0~9的数字显示。
而我们现在则是把前面散开的10个一维数组整合到一起,变为一个二维数组。同样通过索引的方式来找到这些元素。但还是不要忘了索引号也是从0开始的!前面的方括号写入的只是元素个数。
看一下代码:

Arduino教程16--红外遥控数码管「DFR0100 」图5

这就是一个二维数组。索引号从0开始,如果让你找number[0][0],能找到是哪个数吗?就是二维数组中第1行的第1个数,为0。number[9][7]也就是第10行的第8个数,为1。

  1. void numberShow(int i){         //该函数用来显示数字
  2.     for(int pin = 2; pin <= 9 ; pin++){
  3.        digitalWrite(pin, number[i][pin - 2]);
  4.     }
  5. }
  6. void loop() {      
  7.     for(int j = 0; j <= 9 ; j++){  
  8.           numberShow(j);    //调用numberShow()函数,显示0~9
  9.           delay(500);
  10.     }
  11. }
复制代码

上面这两段代码我们整合在一起看,loop()主函数中,for循环让变量j在0~9循环,j每赋一次值,numberShow()函数就要运行一次。

numberShow()函数整个运行过程如下:程序一开始j=0,numberShow(j)为numberShow(0),跳回到上面的numberShow()函数,i现在的值就为0了,pin初始值为2,所以digitalWrite()现在值为digitalWrite(2, number[0][0]),回到数组number[10][8]中找到number[0][0]对应的值,为0。此时,digitalWrite(2,0),代表引脚2被置LOW,引脚2 对应的b段点亮(共阳数码管置LOW才被点亮)。之后再是循环pin=3,pin=4,……,一直到pin=9整个for循环才结束,也代表数组的第一行的8个元素全被运行了一遍,最终显示一个数字“0”。

回顾一下样例代码1是如何显示一个数字“0”的:

  1. // 显示数字0         
  2. int n0[8]={0,0,0,1,0,0,0,1};
  3. for(int pin = 2; pin <= 9 ; pin++){        
  4. // 数字引脚2~9依次按数组n0[8]中的数据显示
  5. digitalWrite(pin,n0[pin-2]);
  6. }
复制代码

原理是一样的,通过给引脚2~9循环赋值,控制数码管b~DP段亮灭,就能显示出一个我们想要的数字。numberShow(0)循环完后,再次回到loop()中的for函数:

j=1→ numberShow(1)→ i =1 → number[1][pin-2] → 显示数字1
j=2 → numberShow(2) → i=2 → number[2][pin-2] → 显示数字2
j=3 → numberShow(3) → i=3 → number[3][pin-2] → 显示数字3
……
j=9 → numberShow(9) → i=9 → number[9][pin-2] → 显示数字9
好了,这就是整段代码的分析过程,好好体会一下一维数组和二维数组的区别,以及整段代码如何巧妙运行的。了解了数码管和红外接收管各自的工作原理后,我们需要把这两者结合起来,看看红外接收管和数码管结合能迸发出怎样的火花呢?想到了吗?遥控数码管!Arduino控制器把红外接收管从Mini遥控器那儿接到的信号,经处理传达给数码管。让Mini遥控器上0~9对应在数码管上显示0~9,除此之外,还有递减,递增的功能。

示例代码_3

样例代码3:

  1. //项目 - 红外遥控数码管_3
  2. #include <IRremote.h>      //调用IRremote.h库
  3. int RECV_PIN = 11;         //定义RECV_PIN变量为11
  4. IRrecv irrecv(RECV_PIN);   
  5. //设置RECV_PIN(也就是11引脚)为红外接收端
  6. decode_results results;    //定义results变量为红外结果存放位置
  7. int currentNumber = 0;     //该变量用于存放当前数字
  8. long codes[12]=             //该数组用来存放红外遥控器发出的红外码
  9. {
  10.    0xFD30CF,0xFD08F7,               // 0 ,1
  11.    0xFD8877,0xFD48B7,               // 2 ,3
  12.    0xFD28D7,0xFDA857,               // 4 ,5
  13.    0xFD6897,0xFD18E7,               // 6 ,7
  14.    0xFD9867,0xFD58A7,               // 8 ,9
  15.    0xFD20DF,0xFD609F,               // 前进 ,后退
  16. };
  17. int number[10][8] =            //该数组用来存放数码管显示的数字
  18. {
  19.   {0,0,0,1,0,0,0,1},//0
  20.   {0,1,1,1,1,1,0,1},//1
  21.   {0,0,1,0,0,0,1,1},//2
  22.   {0,0,1,0,1,0,0,1},//3
  23.   {0,1,0,0,1,1,0,1},//4
  24.   {1,0,0,0,1,0,0,1},//5
  25.   {1,0,0,0,0,0,0,1},//6
  26.   {0,0,1,1,1,1,0,1},//7
  27.   {0,0,0,0,0,0,0,1},//8
  28.   {0,0,0,0,1,0,0,1} //9
  29. };
  30. void numberShow(int i) {            //该函数用来让数码管显示数字
  31.   for(int pin = 2; pin <= 9 ; pin++){
  32.      digitalWrite(pin, number[i][pin - 2]);
  33.   }
  34. }
  35. void setup(){
  36.   Serial.begin(9600);            //设置波特率为9600
  37.   irrecv.enableIRIn();           //启动红外解码
  38.   
  39.   for(int pin = 2 ; pin <= 9 ; pin++){  
  40. //设置数字引脚2~9为输出模式
  41.       pinMode(pin, OUTPUT);
  42.       digitalWrite(pin, HIGH);
  43.   }
  44. }
  45. void loop() {
  46.   //判断是否接收到解码数据,把接收到的数据存储在变量results中
  47.   if (irrecv.decode(&results)) {
  48.       for(int i = 0; i <= 11; i++){
  49.          //判断是否接收到0~9按键的红外码
  50.          if(results.value == codes[i]&& i <= 9){
  51.                numberShow(i);  //在数码管上对应显示0~9
  52.                currentNumber = i;  
  53. //把当前显示的值赋给变量currentNumber
  54.                Serial.println(i);
  55.                break;        
  56.          }
  57.          
  58.          //判断是否接收到递减的红外码,并且当前值不为0
  59.          else if(results.value == codes[10]&& currentNumber != 0){
  60.                currentNumber--;           //当前值递减
  61.                numberShow(currentNumber); //数码管显示递减后的值
  62.                Serial.println(currentNumber);//串口输出递减后的值
  63.                break;        
  64.          }
  65.          
  66.          //判断是否接收到递增的红外码,并且当前值不为9
  67.          else if(results.value == codes[11]&& currentNumber != 9){
  68.                currentNumber++;           //当前值递增
  69.                numberShow(currentNumber); //数码管显示递增后的值
  70.                Serial.println(currentNumber);//串口输出递增后的值
  71.                break;            
  72.          }
  73.     }
  74.    
  75.    Serial.println(results.value, HEX);  //串口监视器查看红外码
  76.    irrecv.resume();   //等待接收下一个信号
  77.   }
  78. }
复制代码

上传完代码后,尝试按下图3指出部分的按键,看看是数码管是个怎样的变化。

Arduino教程16--红外遥控数码管「DFR0100 」图6
图 3 遥控器按键说明

代码回顾_3

程序一开始还是对红外接收管的一些常规定义,按项目【红外遥控灯】搬过来即可(注意:IRremote库选择2.6.0版本)。

  1. #include <IRremote.h>      //调用IRremote.h库
  2. int RECV_PIN = 11;         //定义RECV_PIN变量为11
  3. IRrecv irrecv(RECV_PIN);   
  4. //设置RECV_PIN(也就是11引脚)为红外接收端
  5. decode_results results;    //定义results变量为红外结果存放位置
  6. int currentNumber = 0;     //该变量用于存放当前数字
复制代码

在这里,我们多定义了一个变量currentNumber,通过名字应该就可以看出来含义了吧。这个变量的作用是,用来存储当前的数字,数字递增递减时能找到对应的参照点。
同样用数组的方式来存放这些红外码,0x-表示是16进制。long是变量的类型,如果你还想用遥控器上的其他按键来控制做一些其他事情的话,把红外码替换掉就好了。

  1. long codes[12]=             //该数组用来存放红外遥控器发出的红外码
  2. {
  3.    0xFD30CF,0xFD08F7,               // 0 ,1
  4.    0xFD8877,0xFD48B7,               // 2 ,3
  5.    0xFD28D7,0xFDA857,               // 4 ,5
  6.    0xFD6897,0xFD18E7,               // 6 ,7
  7.    0xFD9867,0xFD58A7,               // 8 ,9
  8.    0xFD20DF,0xFD609F,               // 前进 ,后退
  9. };
复制代码

紧接着是,一个二维数组number[10][8]的定义。我们在代码回顾_2已有说明了,通过调用数组的元素,把这些元素的值依次赋给数码管显示段的控制引脚,并在numberShow()函数中得以实现数码管数字显示。setup()函数中,仍然是波特率设置,启动红外解码,数字引脚模式设置等常规设置。
到了主函数loop(),一开始还是先判断是否接收到红外码,并把接收到的数据存储在变量results中。

if (irrecv.decode(&results))

一旦接收到数据后,程序就要做两件事。第一件事,判断是哪个红外码,也就能对应找到是哪个按键按下的。第二件事,找到对应按键后,让数码管干什么事?让我们接着看看程序是如何完成这两件事的。

第一件事:
会有三种情况需要判断,第一种情况,按遥控器0~9时,数码管显示数字0~9。第二种情况,每按下后退键,数字在原有基础上递减一位,直到减到0为止。第三种情况,每按下前进键,数字在原有基础上增一位,直到增到9为止。
对这三种情况进行判断,这里呢,同样用到了if语句,与以往有所不同的,我们选择用 if…else if。if…else和if…else if的区别在哪儿?区别在于else if后面需要接判断表达式,else不需要判断表达式。然而,不管是else还是else if都是依附于if语句存在的,不能独立使用。

回到代码中,这就是以下三种情况:

if(results.value == codes&& i <= 9)
if(results.value == codes[10]&& currentNumber != 0)
if(results.value == codes[11]&& currentNumber != 9)

第一个if判断的是第一种情况,显示数字0~9。判断条件就是接收到的数据 results.value的值是不是数组中codes[0]~codes[9]的红外码。
第二个if判断的是第二种情况,是否接到后退键指令,也就是code[10]= 0xFD20DF,并且当前显示数字不为0。
第三个if判断的是第三种情况,是否接到前进键指令,也就是code[11]= 0xFDA857,并且当前显示数字不为9。
还有一个问题——如何找到数组中的元素呢?所以,就需要在if判断前设置一个for循环,让变量i一直在0~11之间循环。

第一件事判断是哪个红外码完成后,开始执行第二件事。
就是每个if语句后,都有相应的执行代码。就不一一详细说了。

整段代码就讲完了,这段代码应该是所有项目中最复杂的代码,可能一开始不能完全看明白,不过没关系,实践出真知,通过一遍遍不断的尝试,相信你总有一天能明白的。


课后练习

学习了如何使用遥控功能,DIY一个你的遥控作品吧!比如简单的会动的小人,结合我们前面的舵机,通过遥控器上不同的按键,让舵机转动不同的角度,发挥你的想象做出更多Arduino作品吧!

droid_noob  见习技师

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

本帖最后由 粒子 于 2022-1-5 16:45 编辑
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(); // 继续等待接收下一组信号
      }
}




回复

使用道具 举报

张_  学徒

发表于 2022-10-3 20:39:50

Arduino:1.8.19 (Windows 10), 开发板:"Arduino Uno"
sketch_sep30a:7:10: fatal error: IRremoteTools.h: No such file or directory

#include <IRremoteTools.h> //调用IRremoteTools.h库

          ^~~~~~~~~~~~~~~~~
compilation terminated.

exit status 1

IRremoteTools.h: No such file or directory

请问各位大神,编译出现以上信息是啥意思啊?



回复

使用道具 举报

Mr.why  见习技师

发表于 2015-3-8 20:12:03

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

https://lamb-mei.com/436/使用-arduino-1-5-x-ide-編譯有引用-irremote-出現-error-tkd2-was-not-declared-in-this-scope/
回复

使用道具 举报

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 吐出来的东西是随机的
我去!直流电机还能不能一起快乐的玩耍了:curse:,一直干扰红外工作

截取一段串口数据:
...
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上来看, ...

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

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

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

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

mail