2014-6-5 17:40:23 [显示全部楼层]
79560浏览
查看: 79560|回复: 37

[入门教程] DFR0100 Arduino教程 15--红外接收

[复制链接]

项目十五 红外遥控数码管

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

所需元件

DFR0100 Arduino教程 15--红外接收图1

硬件连接

按下图连线图连接,注意数码管各段所对应的引脚。右边引脚说明图上为什么画这么几个箭头呢?个人觉得,这样看起来更方便。可以给你作为参考。我们从上面一排看,红色箭头的方向,从右往左,b → a → f → g的顺序正好对应,下面红色箭头逆时针顺序b → a → f → g。蓝色箭头也是表达的同样的意思。

我还特意在连接图上,对数码管所连接的引脚做了标示。这样就能更清楚的知道哪个引脚控制哪一段了。这8个电阻同样是起限流的作用。

输入代码

样例代码15-1

//项目15 – 数码管显示
void setup(){
 for(int pin = 2 ; pin <= 9 ; pin++){ // 设置数字引脚2~9为输出模式
 pinMode(pin, OUTPUT);
 digitalWrite(pin, HIGH);
 }
}
void loop() { 
 // 显示数字0 
 int n0[8]={0,0,0,1,0,0,0,1}; 
 //数字引脚2~9依次按数组n0[8]中的数据显示 
 for(int pin = 2; pin <= 9 ; pin++){ 
 digitalWrite(pin,n0[pin-2]);
 }
 delay(500);
 // 显示数字1 
 int n1[8]={0,1,1,1,1,1,0,1};
 // 数字引脚2~9依次按数组n1[8]中的数据显示
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin,n1[pin-2]);
 }
 delay(500);
// 显示数字2
 int n2[8]={0,0,1,0,0,0,1,1};
 // 数字引脚2~9依次按数组n2[8]中的数据显示
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin,n2[pin-2]);
 }
delay(500); 
 // 显示数字3
 int n3[8]={0,0,1,0,1,0,0,1};
 // 数字引脚2~9依次按数组n3[8]中的数据显示
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin,n3[pin-2]);
 }
 delay(500); 
// 显示数字4
 int n4[8]={0,1,0,0,1,1,0,1};
 // 数字引脚2~9依次按数组n4[8]中的数据显示
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin,n4[pin-2]);
 }
 delay(500); 
 // 显示数字5 
 int n5[8]={1,0,0,0,1,0,0,1};
 // 数字引脚2~9依次按数组n5[8]中的数据显示
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin,n5[pin-2]);
 }
 delay(500); 
 // 显示数字6 
 int n6[8]={1,0,0,0,0,0,0,1};
 // 数字引脚2~9依次按数组n6[8]中的数据显示
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin,n6[pin-2]);
 }
 delay(500); 
 // 显示数字7 
 int n7[8]={0,0,1,1,1,1,0,1};
 // 数字引脚2~9依次按数组n7[8]中的数据显示
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin,n7[pin-2]);
 }
 delay(500); 
 // 显示数字8
 int n8[8]={0,0,0,0,0,0,0,1};
 // 数字引脚2~9依次按数组n8[8]中的数据显示
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin,n8[pin-2]);
 }
 delay(500); 
// 显示数字9
 int n9[8]={0,0,0,0,1,1,0,1};
 // 数字引脚2~9依次按数组n9[8]中的数据显示
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin,n9[pin-2]);
 }
 delay(500);
}

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

硬件回顾

按键开关

数码管其实就是一个前面介绍的led的组合体,这个组合体包含8个led,所以也称之为八段数码管。说白了就八个灯。哪八段?不用多说了吧!a到g
以及小数点DP。其实用法和前面说的LED也是一样的,每段都是一个发光二极管,分别用8个数字口来控制它们的亮灭,通过不同段的显示,就能组成0\~9的数字。比如,我们让b,a,f,e,d,c亮起的话,就能显示一个数字“0”了。

右图15-2是个引脚说明图,不陌生了吧!在前面硬件连接的时候,已经看到过一次了。

这里,b → a → f → g → e → d → c → DP分别连接到Arduino数字引脚2\~9。

数码管一共有10个引脚。a\~DP 这8个引脚接到数字口,那还有两个引脚呢?这是公共端,LED只有一端是不能被点亮的。我们在RGB灯那章讲到过共阴共阳的问题,数码管也存在共阴共阳问题。所谓共阳就是公共端接+5V,共阴则是公共端接GND。

共阴共阳只是在代码上要稍作修改。我们这里选用的是共阳数码管。硬件有了了解,我们来看看软件部分。

DFR0100 Arduino教程 15--红外接收图2

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

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

如果是共阴数码管,公共端接GND,在代码中中,控制另一端数字引脚为HIGH,才让数码管点亮。

代码回顾

硬件部分我们已经说过,数码管需要接到8个数字引
脚,所以在一开始,需要定义8个数字引脚作为输出。

这次我们用一个for循环来完成这8个数字引脚的设置。

数码管b,a,f,g,e,d,c,DP分别和Arduino数字引脚2\~9对应。

DFR0100 Arduino教程 15--红外接收图3

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

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

DFR0100 Arduino教程 15--红外接收图4

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

在这里元素4,对应索引号为3(n0[3]),值为1。元素8(索引号7,n0[7])的值为1。

声明中n0[8]的方括号中的8代表有8个元素。

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

DFR0100 Arduino教程 15--红外接收图5

这个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中其实准确的说应该叫一维数组,我们这里用到二维数据。这样一来,可以让代码看起来更简洁。动手输一下下面这段代码吧,看看是不是同样的效果!

样例代码15-2

//项目11 – 数码管数字显示 
int number[10][8] = 
{
 {0,0,0,1,0,0,0,1}, //显示0
 {0,1,1,1,1,1,0,1}, //显示1
 {0,0,1,0,0,0,1,1}, //显示2
 {0,0,1,0,1,0,0,1}, //显示3
 {0,1,0,0,1,1,0,1}, //显示4
 {1,0,0,0,1,0,0,1}, //显示5
 {1,0,0,0,0,0,0,1}, //显示6
 {0,0,1,1,1,1,0,1}, //显示7
 {0,0,0,0,0,0,0,1}, //显示8
 {0,0,0,0,1,1,0,1} //显示9
};
void numberShow(int i){ //该该函数用来显示数字
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin, number[i][pin - 2]);
 }
}
void setup(){
 for(int pin = 2 ; pin <= 9 ; pin++){ // 设置数字引脚2~9为输出模式
 pinMode(pin, OUTPUT);
 digitalWrite(pin, HIGH);
 }
}
void loop() { 
 for(int j = 0; j <= 9 ; j++){ 
 numberShow(j); //调用numberShow()函数,显示0~9
 delay(500);
 }
}

代码回顾 2

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

DFR0100 Arduino教程 15--红外接收图6[i]

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

代码1中,分别用10个数组,每个数组有8个元素,每个元素依次对应到数码管b\~DP引脚状态值,这样就能在数码管上反映为0\~9的数字显示。

而我们现在则是把前面散开的10个一维数组整合到一
起,变为一个二维数组。同样通过索引的方式来找到这些元素。但,还是不要忘了索引号也是从0开始的!前面的方括号写入的是只是元素个数。看一下代码:

DFR0100 Arduino教程 15--红外接收图7

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

DFR0100 Arduino教程 15--红外接收图8

上面这两段代码我们整合在一起看,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”的:

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

原理是一样的,通过给引脚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=3 → numberShow(9) → i=9 → number[9][pin-2] → 显示数字9

好了,这就是整段代码的分析过程,好好体会一下一维数组和二维数组的区别,以及整段代码如何巧妙运行的。

了解了数码管和红外接收管各自的工作原理后,我们需要把这两者结合起来,看看红外接收管和数码管结合能迸发出怎样的火花呢?想到了吗?遥控数码管!

Arduino控制器把红外接收管从Mini遥控器那儿接到的信号,经处理传达给数码管。让Mini遥控器上0\~9对应在数码管上显示0\~9,除此之外,还有递减,递增的功能。

所需材料

所需元件

DFR0100 Arduino教程 15--红外接收图9

硬件连接

你会发现在硬件连接上同样就是把项目十四和十五结合在一起,并没有什么太大变化,如果在连接数码管时候有些不明白,可以回看一下项目十五。

DFR0100 Arduino教程 15--红外接收图10[i]

输入代码

样例代码13-1

//项目十三 - 红外遥控数码管
#include <IRremote.h> //调用IRremote.h库
int RECV_PIN = 11; //定义RECV_PIN变量为11
IRrecv irrecv(RECV_PIN); //设置RECV_PIN(即11引脚)为红外接收端
decode_results results; //定义results变量为红外结果存放位置
int currentNumber = 0; //该变量用于存放当前数字
long codes[12]= //该数组用来存放红外遥控器发出的红外码
{
 0xFD30CF,0xFD08F7, // 0 ,1
 0xFD8877,0xFD48B7, // 2 ,3
 0xFD28D7,0xFDA857, // 4 ,5
 0xFD6897,0xFD18E7, // 6 ,7
 0xFD9867,0xFD58A7, // 8 ,9
 0xFD20DF,0xFD609F, // + ,-
};
int number[10][8] = //该数组用来存放数码管显示的数字
{
 {0,0,0,1,0,0,0,1},//0
 {0,1,1,1,1,1,0,1},//1
 {0,0,1,0,0,0,1,1},//2
 {0,0,1,0,1,0,0,1},//3
 {0,1,0,0,1,1,0,1},//4
 {1,0,0,0,1,0,0,1},//5
 {1,0,0,0,0,0,0,1},//6
 {0,0,1,1,1,1,0,1},//7
 {0,0,0,0,0,0,0,1},//8
 {0,0,0,0,1,1,0,1} //9
};
void numberShow(int i) { //该函数用来让数码管显示数字
 for(int pin = 2; pin <= 9 ; pin++){
 digitalWrite(pin, number[i][pin - 2]);
 }
}
void setup(){
 Serial.begin(9600); //设置波特率为9600
 irrecv.enableIRIn(); //启动红外解码
 for(int pin = 2 ; pin <= 9 ; pin++){ //设置数字引脚2~9为输出模式
 pinMode(pin, OUTPUT);
 digitalWrite(pin, HIGH);
 }
}

void loop() {
//判断是否接收到解码数据,把接收到的数据存储在变量results中
 if (irrecv.decode(&results)) {
 for(int i = 0; i <= 11; i++){
//判断是否接收到0~9按键的红外码
 if(results.value == codes//该数组用来存放红外遥控器发出的红外码[i][i][i]&& i <= 9){
 numberShow(i); //在数码管上对应显示0~9
 currentNumber = i; //把当前显示的值赋给变量currentNumber
 Serial.println(i);
 break; 
 }
// 判断是否接收到递减的红外码,并且当前值不为0
 else if(results.value == codes[10]&& currentNumber != 0){
 currentNumber--; //当前值递减
 numberShow(currentNumber); //数码管显示递减后的值
 Serial.println(currentNumber); //串口输出递减后的值
 break; 
 }
//判断是否接收到递增的红外码,并且当前值不为9
 else if(results.value == codes[11]&& currentNumber != 9){
 currentNumber++; //当前值递增
 numberShow(currentNumber); //数码管显示递增后的值
 Serial.println(currentNumber); //串口输出递增后的值
 break; 
 }
 } 
 Serial.println(results.value, HEX); //串口监视器查看红外码
 irrecv.resume(); //等待接收下一个信号 
 }
}

DFR0100 Arduino教程 15--红外接收图11

下载完代码后,尝试按下上图15-4指出部分的按钮,看看是数码管是个怎样的变化。

代码回顾

程序一开始还是对红外接收管的一些常规定义,按项目十二搬过来即可。

DFR0100 Arduino教程 15--红外接收图15

#include <IRremote.h> int    //调用IRremote.h库
RECV_PIN = 11; IRrecv         //定义RECV_PIN变量为11
irrecv(RECV_PIN);                //设置RECV_PIN(即引脚11)为红外接收端
decode_results results;         //定义results变量为红外结果存放位置
int currentNumber = 0;        //该变量用于存放当前数字

在这里,我们多定义了一个变量currentNumber,通过名字应该就可以看出来含义了吧。这个变量的作用是,用来存储当前的数字,数字递增递减是能找到对应的参照点。

同样用数组的方式来存放这些红外码,0x-表示是16进制。long是变量的类型,如果你还想用遥控器上的其他按钮来控制做一些其他事情的话,把红外码替换掉就好了。

DFR0100 Arduino教程 15--红外接收图14

紧接着是,一个二维数组number[10][8]的定义。我们在数码管那一章节已有说明了,通过调用数组的元素,把这些元素的值依次赋给数码管显示段的控制引脚,并在numberShow()函数中得以实现数码管数字显示。

setup()函数中,仍然是波特率设置,启动红外解码,数字引脚模式设置等,这些常规设置。

到了主函数loop(),一开始还是先判断是否接收到红外码,并把接收到的数据存储在变量results中。

DFR0100 Arduino教程 15--红外接收图12

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

第一件事:

会有三种情况需要判断,第一种情况,按遥控器0\~9时,数码管显示数字0\~9。第二种情况,每按下“后退”键,数字在原有基础上递减一位,直到减到0为止。第三种情况,每按下“前进”键,数字在原有基础上增一位,直到增到9为止。

对这三种情况进行判断,这里呢,同样用到了if语句,与以往有所不同的,我们选择用 if…else if。if…else和if…else if的区别在哪儿?区别在于else if后面需要接判断表达式,else不需要判断表达式。然而,不管是else还是else if都是依附于if语句存在的,不能独立使用。

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

DFR0100 Arduino教程 15--红外接收图13

第一个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作品吧!


IRremote.rar

30.66 KB, 下载次数: 3197

Shuuei  高级技师

发表于 2019-4-12 08:13:40

额,建议上传bz或gz的压缩包。rar类型的包Linux默认不支持,度娘搜索适用树莓派上的rar软件下载安装后均出现问题,确认非位数的问题。下载7z后解压rar也出现问题,显示文件解压错误。

后面是我是在windows解压后用filezila传输到树莓派上的,可能有些麻烦,如果使用树莓派的同学遇到相同的情况可以参照。关键词:ssh, ifconfig, sftp, filezila


回复

使用道具 举报

电工狸的折耳猫  见习技师

发表于 2022-7-1 12:37:47

if(results.value == codes//该数组用来存放红外遥控器发出的红外码[i][i][i]&& i <= 9){
这一行报错:
exit status 1
invalid types 'long int[int]' for array subscript
咋整呢?
回复

使用道具 举报

Melody-王俊皓  见习技师

发表于 2022-8-24 16:31:27

电工狸的折耳猫 发表于 2022-7-1 12:37
if(results.value == codes//该数组用来存放红外遥控器发出的红外码&& i

我也是这样的问题,咋解决
回复

使用道具 举报

yoyojacky  初级技匠

发表于 2014-11-6 00:58:25

学习了。
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-11-7 09:47:52


:victory:
回复

使用道具 举报

a82107335  学徒

发表于 2015-2-9 13:52:42

回复

使用道具 举报

iatgm  见习技师

发表于 2015-5-28 22:54:06

本帖最后由 iatgm 于 2015-5-28 23:15 编辑

我遥控器对准红外接收管,也接收到错误的代码,请问一下,是怎么回事。
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-6-1 18:03:46

iatgm 发表于 2015-5-28 22:54
我遥控器对准红外接收管,也接收到错误的代码,请问一下,是怎么回事。
...

接收到错误信号的概率大吗?
回复

使用道具 举报

siska  初级技师

发表于 2015-7-17 16:11:25

构建选项已变更,全部重新构建

D:\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
                ^
编译有误。

  报告将会包含更多的信息
  "在编译时,输出详细信息"
  在 文件>首选项 中启用

这是怎么回事,代码跟LZ你的一模一样:(
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-7-17 18:19:57

siska 发表于 2015-7-17 16:11
构建选项已变更,全部重新构建

D:\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5:16: error:  ...

你是不是没有加载库呀?
回复

使用道具 举报

siska  初级技师

发表于 2015-7-17 23:01:14

Jane 发表于 2015-7-17 18:19
你是不是没有加载库呀?

是啊是啊,我太马虎了:loveliness:
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-7-30 11:14:44

siska 发表于 2015-7-17 23:01
是啊是啊,我太马虎了

下回就攒经验了~
回复

使用道具 举报

EricKong  学徒

发表于 2015-7-30 19:02:11

210的入门set里的IR错误率实在太高了。。。。简直不忍直视啊!!!!!!
回复

使用道具 举报

EricKong  学徒

发表于 2015-7-30 19:02:30

210的入门set里的IR错误率实在太高了。。。。简直不忍直视啊!!!!!!
回复

使用道具 举报

EricKong  学徒

发表于 2015-7-31 10:46:24

我是来认错的,是我代码的问题,与delay有关,改成如下就没问题。
   
//是否接收到解码数据,把接收到的数据存储在变量results_cur中
    if (irrecv.decode(&results_cur))
    {
        //接收到的数据以16进制的方式在串口输出
        Serial.println(results_cur.value, HEX);

        //用IR控制伺服电机
        if(results_cur.value != results_pre.value)
        {
          process_servo(results_cur.value); // 根据IR输入控制伺服电机旋转角度
          delay(10);                        // 等待伺服电机旋转角度
          results_pre = results_cur;      
        }
        
        irrecv.resume();                    // 继续等待接收下一组信号
    }
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-7-31 15:03:15

EricKong 发表于 2015-7-31 10:46
我是来认错的,是我代码的问题,与delay有关,改成如下就没问题。

哈哈哈~没事儿
回复

使用道具 举报

diaosiki  见习技师

发表于 2016-1-5 17:03:19

成功接收到红外信号如下图:
DFR0100 Arduino教程 15--红外接收图1
然而过程中仍存在疑问:在将IRremote库加载后,编译虽然成功,但是出现了这样的告警字样:

IRremote.h" 对应多个库
已使用: /Users/diaosiji/Documents/Arduino.app/Contents/Java/libraries/IRremote
未使用:/Users/diaosiji/Documents/Arduino.app/Contents/Java/libraries/RobotIRremote

请问这个问题是为什么,如何消除?
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2016-1-13 18:39:46

diaosiki 发表于 2016-1-5 17:03
成功接收到红外信号如下图:

然而过程中仍存在疑问:在将IRremote库加载后,编译虽然成功,但是出现了这样 ...

那是不是库没有加载对?
回复

使用道具 举报

diaosiki  见习技师

发表于 2016-1-14 16:14:47

Jane 发表于 2016-1-13 18:39
那是不是库没有加载对?

已经解决。
回复

使用道具 举报

木龙小驴  见习技师

发表于 2016-3-22 09:21:22

求大神帮助啊
我已经删掉库里带的robotremot还有irremotetool的相关文件,也能编译通过,但是遥控器什么的木有反应,用手碰一碰会打印一些数字,遥控器不好使。
是不是传感器的问题?还是需要换遥控器?
回复

使用道具 举报

ljs2016cn  学徒

发表于 2016-10-24 10:34:14

怎样加载库
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2016-11-1 10:32:46

回复

使用道具 举报

david.ding  见习技师

发表于 2017-2-3 13:27:35

新手学习

赞一下
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail