用于Arduino的Cusom Library,使用其他库

时间:2016-04-12 03:43:14

标签: arduino libraries

我正在尝试创建一个使用另一个库的自定义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中解决的变量?

1 个答案:

答案 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();
}

我个人的建议是尽可能使用第一种解决方案:处理非常差的设备(如微控制器)的动态分配会导致很多麻烦。至少根据我的个人经验...