我正在尝试创建一个使用另一个库的自定义Arduino库。我希望能够在我的库中初始化一个库,这是我到目前为止所获得的。 它运行良好,但我需要能够创建多个实例并更改初始化库时所需的变量。
.ino
#include "audiolux.h"
#include <FastLED.h>
Audiolux al1;
void setup() {
}
void loop() {
al1.runs();
}
.ccp文件:
#include "Arduino.h"
#include "audiolux.h"
#include <FastLED.h>
Audiolux::Audiolux()
{
FastLED.addLeds<NEOPIXEL, 6>(leds, 100);
}
void Audiolux::runs(){
leds[2] = CRGB::Red;
FastLED.show();
}
.h文件
#ifndef audiolux_h
#define audiolux_h
#include "Arduino.h"
#include <FastLED.h>
class Audiolux
{
public:
Audiolux();
void runs();
private:
CRGB leds[100];
};
#endif
例如,在头文件中,CRGB被初始化为leds [100],我如何将其更改为我可以从ino中解决的变量?
答案 0 :(得分:0)
好的,所以你想制作一个可变大小的数组。你有两种方法可以做到这一点。
第一个是使用最大数量的受支持的LED静态分配它(就像你一样),然后简单地使用该数组的一部分。这在RAM上相当沉重,因为你需要完全分配数组。
有些代码可以是:
#ifndef audiolux_h
#define audiolux_h
#include "Arduino.h"
#include <FastLED.h>
#define MAX_LEDS 100
class Audiolux
{
public:
Audiolux(uint8_t nLeds);
void runs();
private:
uint8_t _nLeds;
CRGB leds[MAX_LEDS];
};
#endif
和
#include "audiolux.h"
Audiolux::Audiolux(uint8_t nLeds)
{
if (nLeds <= MAX_LEDS)
{
_nLeds = nLeds;
FastLED.addLeds<NEOPIXEL, 6>(leds, _nLeds);
}
}
void Audiolux::runs(){
// If you need to know the length of leds, look for _nLeds
leds[2] = CRGB::Red;
FastLED.show();
}
另一种方法是在运行时动态分配数组。请注意,在这种情况下,该函数可能会失败,因为如果内存不足,您将无法分配它。此外,编写析构函数总是一个好习惯,即使你永远不会调用#ifndef audiolux_h
#define audiolux_h
#include "Arduino.h"
#include <FastLED.h>
class Audiolux
{
public:
Audiolux(uint8_t nLeds);
~Audiolux();
void runs();
private:
uint8_t _nLeds;
CRGB *leds = NULL;
};
#endif
和
#include "audiolux.h"
Audiolux::Audiolux(uint8_t nLeds)
{
_nLeds = nLeds;
leds = new CRGB[_nLeds];
FastLED.addLeds<NEOPIXEL, 6>(leds, _nLeds);
}
Audiolux::~Audiolux()
{
delete[] leds;
}
void Audiolux::runs(){
leds[2] = CRGB::Red;
FastLED.show();
}
我个人的建议是尽可能使用第一种解决方案:处理非常差的设备(如微控制器)的动态分配会导致很多麻烦。至少根据我的个人经验...