在我的Arduino文件中,TimerTest.ino
#include "Arduino.h"
#include "Pulse.h"
#include <elapsedMillis.h>
elapsedMillis timeElapsed ;
Pulse trigger(45,60) ; //45 is pin number, 60 is pulse interval in msec
当我定义Pulse.cpp时
#include "Arduino.h"
#include "Pulse.h"
Pulse::Pulse(int pin, long interval)
{
_pin = pin ;
pinMode(_pin, OUTPUT);
_interval = interval);
}
void Pulse::PulseOut()
{
if(timeElapsed > _previousTime + _interval)
digitalWrite(_pin,LOW);
}
我收到编译错误,说timeElapsed不在此文件的此范围内, 我不太了解c ++以了解访问机制,有人可以指出我正确的解决方案。
答案 0 :(得分:0)
在草图中声明全局变量elapsedMillis timeElapsed;
时,它只对该文件可见,而不对其他文件可见。
在Pulse.cpp中,在包含之后,您可以添加语句
#include <elapsedMillis.h>
extern elapsedMillis timeElapsed;
告诉C ++编译器,在另一个文件中定义了一个全局变量,您要在此文件中使用该变量。然后,编译器将知道不为它分配新的存储空间,而是为它创建一个占位符,它将在链接阶段粘合在一起,指向草图中创建的存储。
答案 1 :(得分:0)
一般来说,全局变量并不是一个好主意。
根据你想用Pulse类和timeElapsed做什么,你有多种选择:
将timeElapsed作为参数传递给构造函数
将timeElapsed作为参数传递给PulseOut
make timeElapsed Pulse对象的字段(公共或私有getter / setter)
根本不使用OOP:如果您更熟悉C,请坚持使用它,您将有更好的机会生成可以根据需要运行的代码,并且更容易调试。恕我直言,Arduino不是学习OOP的最佳选择,因为它使得调试比依赖普通PC编程的典型OOP学习路径更难。