Arduino ide 1.6.9 遇到的问题 error: 'TKD2' was not declared in this scope

之前用过arduino链接红外接收器来接受遥控器发送的指令。控制一些外围设备。用的是github上下载的库。

这几天又要用的时候。发现遇到了个问题。首先一个错误是
D:\Tools\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

            ^

exit status 1
为开发板 Arduino/Genuino Uno 编译时出错。

提示我。TKD2没找到。
然后还一个问题说是找到两个IRremote的库。使用了其中一个库。那个我们可以吧他给的路径的不是arduino ide安装目录的那个库删掉。使用arduino ide里的library提供的IRemote库来写 然而还是有这个错误。

D:\Tools\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

            ^

exit status 1
为开发板 Arduino/Genuino Uno 编译时出错。

我使用的是arduino.cc 官方提供的遥控器例子。
https://www.arduino.cc/en/Tutorial/RobotRemoteControl

他这个例子东西太多。很多我没必要的。我只是要他的遥控接收按键编码。就够了。但是提示library里的一个cpp有错误。

看似是arduino ide提供的library里的一个cpp有错误。于是乎。打开看看。
打开错误提示的这个cpp文件。
D:\Tools\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp

#include "IRremote.h"
#include "IRremoteTools.h"
#include 

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

void beginIRremote(){
    irrecv.enableIRIn(); // Start the receiver
}

bool IRrecived(){
    return irrecv.decode(&results);
}

void resumeIRremote(){
    irrecv.resume(); // resume receiver
}

unsigned long getIRresult(){
    return results.value;
}

我们发现他有个 TKD2 这个东西。但是上面没有找到具体的声明或者define 然后我们找他的h头文件。

#ifndef IRREMOTETOOLS_H
#define IRREMOTETOOLS_H

extern void beginIRremote();

extern bool IRrecived();

extern void resumeIRremote();

extern unsigned long getIRresult();

#endif

也没有 TKD2 的声明

然后继续来找 D:\Tools\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp
里面的引入的几个.h头文件。看看有没有 TKD2 这个东西。
然而。我吧

#include "IRremote.h"
#include "IRremoteTools.h"

这两个都找了。就是没有 TKD2 这个东西。 至于

#include 

这个就不用去找了。因为这是arduino的环境带的东西。外部的library肯定不会有某个变量或者define放到这里面去。
所以 我们得到的结论是 这个arduinio ide官方提供的这个库代码有问题???? 表骗我。我读书少。但是就我们找出来的原因 就是他官方提供的库文件代码错误。。。。好吧。

我到官方找了反馈问题的地方。先在里面搜索了一下。有人说 1.6.7里面就有这个问题了。
然而。他们用的 要么是不知所以然的东西。要么不是用官方教程写的代码。然后一些留言回复之类的也看的不知所云。
当然这里我要说说一下。我这里得到的这个错误。是按照arduino.cc 官方教程里的代码写的 原版复制粘贴。并检查基本语法错误都没问题。编译就出这个错误

error: 'TKD2' was not declared in this scope

arduino.cc 官方遥控器库使用教程
https://www.arduino.cc/en/Tutorial/RobotRemoteControl

我再次直接复制粘贴。还是有这个错误。

哎。我们就来自己解决吧 也比较简单。

我们有两种方法来解决这个问题。
第一种:
修改报错文件的这个cpp
D:\Tools\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp

#include "IRremote.h"
#include "IRremoteTools.h"
#include 

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

void beginIRremote(){
    irrecv.enableIRIn(); // Start the receiver
}

bool IRrecived(){
    return irrecv.decode(&results);
}

void resumeIRremote(){
    irrecv.resume(); // resume receiver
}

unsigned long getIRresult(){
    return results.value;
}

里面的TKD2 改成11 或者你用来插红外接收头的数据接收端口的IO口
改成像下面这样

#include "IRremote.h"
#include "IRremoteTools.h"
#include 

int RECV_PIN = 11; // 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

void beginIRremote(){
    irrecv.enableIRIn(); // Start the receiver
}

bool IRrecived(){
    return irrecv.decode(&results);
}

void resumeIRremote(){
    irrecv.resume(); // resume receiver
}

unsigned long getIRresult(){
    return results.value;
}

我这里改成了 11

当然。这样要是需要修改端口的时候。还要修改arduino ide的library的库的cpp文件。这有点扯淡。来上第二种改法。
第二种方法。是用C++的语法来写。
当然。你可以直接copy我的代码就够了。
修改
D:\Tools\Arduino\libraries\RobotIRremote\src\IRremoteTools.h

#ifndef IRREMOTETOOLS_H
#define IRREMOTETOOLS_H

extern void beginIRremote();

extern bool IRrecived();

extern void resumeIRremote();

extern unsigned long getIRresult();

#endif

把这个h文件修改成

#ifndef IRREMOTETOOLS_H
#define IRREMOTETOOLS_H

extern void beginIRremote( int receivePin );

extern bool IRrecived();

extern void resumeIRremote();

extern unsigned long getIRresult();

#endif

就是把 extern void beginIRremote( int receivePin );
这个方法 里添加了个参数
然后我们修改
D:\Tools\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp

#include "IRremote.h"
#include "IRremoteTools.h"
#include 

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

void beginIRremote(){
    irrecv.enableIRIn(); // Start the receiver
}

bool IRrecived(){
    return irrecv.decode(&results);
}

void resumeIRremote(){
    irrecv.resume(); // resume receiver
}

unsigned long getIRresult(){
    return results.value;
}

改成

#include "IRremote.h"
#include "IRremoteTools.h"
#include 

//int RECV_PIN = TKD2; // the pin the IR receiver is connected to
//IRrecv irrecv(RECV_PIN); // an instance of the IR receiver object
IRrecv *irr;
decode_results results; // container for received IR codes

void beginIRremote( int receivePin ){
    //irrecv.enableIRIn(); // Start the receiver
    irr = new IRrecv( receivePin );
    irr->enableIRIn(); 
}

bool IRrecived(){
    //return irrecv.decode(&results);
    return irr->decode(&results);
}

void resumeIRremote(){
    //irrecv.resume(); // resume receiver
    irr->resume();
}

unsigned long getIRresult(){
    return results.value;
}

好了。修改好之后。我们来看我们的使用的代码

#include 
#include 

void setup() {
  Serial.begin(9600);

  beginIRremote(11); // Start the receiver
}

void loop() {
  if (IRrecived()) {
    unsigned long res = getIRresult();
    Serial.println( res );
    resumeIRremote(); // resume receiver
  }
}

然后编译


项目使用了 4,772 字节,占用了 (14%) 程序存储空间。最大为 32,256 字节。
全局变量使用了432字节,(21%)的动态内存,余留1,616字节局部变量。最大为2,048字节。

OK 改好了。

再次给出arduino.cc 官方的遥控器库的使用教程地址
https://www.arduino.cc/en/Tutorial/RobotRemoteControl

20160617

—–by brok1n

你可能感兴趣的:(arduino)