2016-04-12 8 views
-1

Ich versuche, eine benutzerdefinierte Arduino-Bibliothek zu erstellen, die eine andere Bibliothek verwendet. Ich möchte in der Lage sein, eine Bibliothek in meiner Bibliothek zu initialisieren. Dies ist das, was ich bisher bekommen habe. Es funktioniert gut, aber ich muss in der Lage sein, mehrere Instanzen zu erstellen und die Variable ändern, die bei der Initialisierung der Bibliothek erforderlich sind.Cusom-Bibliothek für Arduino, mit anderen Bibliotheken

Die .ino

#include "audiolux.h" 
#include <FastLED.h> 

Audiolux al1; 

void setup() { 
} 
void loop() { 
    al1.runs(); 
} 

Die .ccp Datei:

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

Die H-Datei

#ifndef audiolux_h 
#define audiolux_h 


#include "Arduino.h" 
#include <FastLED.h> 

class Audiolux 
{ 
    public: 
    Audiolux(); 
    void runs(); 
    private: 
    CRGB leds[100]; 

}; 

#endif 

Zum Beispiel in der Header-Datei wird die CRGB als LED initialisiert [100], wie würde ich es ändern, um eine Variable zu sein, die ich vom Ino aus ansprechen könnte?

+0

Sie könnten einen Konstruktor mit einem Argument hinzufügen, das die Anzahl der LEDs angibt. –

+0

Wie würde das aussehen? Wie ich verstehe, kann ich die 100 nicht einfach durch eine Variable ersetzen. Ich bin ein bißchen neu beim Schreiben von Bibliotheken, also wäre ich dankbar, wenn ich Anleitung in die richtige Richtung bekommen hätte, danke! – user1460002

Antwort

0

Ok, Sie möchten also ein Array variabler Größe erstellen. Sie haben zwei Möglichkeiten, dies zu tun.

Die erste ist, sie (wie Sie) mit einer maximalen Anzahl von unterstützten LEDs statisch zuzuteilen, dann verwenden Sie einfach einen Teil dieses Arrays. Dies ist ziemlich schwer auf RAM, da Sie das Array vollständig reservieren müssen.

können einige Code sein:

#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 

und

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

Die andere Methode ist das Array zur Laufzeit dynamisch zuzuteilen. Beachten Sie, dass in diesem Fall die Funktion fehlschlagen kann, da Sie keinen Speicher zuordnen können, wenn Sie nicht genügend Speicher haben. es ist darüber hinaus immer eine gute Gewohnheit, die destructor zu schreiben, auch wenn Sie nie ist

#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 

und

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

Mein persönlicher Rat #ifndef audiolux_h rufen die erste Lösung zu verwenden, wann immer es möglich: mit dynamischer Umgang Zuweisungen mit sehr schlechten Geräten wie Mikrocontrollern können zu vielen Problemen führen. Zumindest nach meiner persönlichen Erfahrung ...