Forum: Compiler & IDEs Arduino Library erstellen


von Andi K. (fry12)


Lesenswert?

Hallo Leute!

Ich versuche mich gerade daran, eine Arduino-Library zu schreiben. Das 
Problem dabei ist allerdings, dass ich nur C kann, jedoch keine 
Erfahrung in C++ habe. Um einen Einstieg zu finden, versuche ich das 
Standard-Beispiel zur LED-Ansteuerung nachzuvollziehen.

Hier mein Code der LED.h-Datei:
1
#ifndef LEDLIB_H
2
#define LEDLIB_H
3
4
#include <Arduino.h>
5
#include <SPI.h>
6
7
class LED
8
{
9
  public:
10
    LED(const uint8_t ledPin);
11
    void on();
12
    void off();
13
    boolean getStatus();
14
    
15
  private:
16
    uint8_t _ledPin;
17
    boolean _ledStatus;
18
};
19
20
#endif

Und der LED.cpp-Datei:
1
#include "LED.h"
2
3
LED::LED(const uint8_t ledPin) 
4
{
5
  _ledPin = ledPin;
6
  pinMode(_ledPin, OUTPUT);
7
  SPI.begin();
8
}
9
10
void LED::on() {
11
  digitalWrite(_ledPin, HIGH);
12
  _ledStatus = true;
13
}
14
15
void LED::off() {
16
  digitalWrite(_ledPin, LOW);
17
  _ledStatus = false;
18
}
19
20
boolean LED::getStatus() {
21
        return _ledStatus;
22
}

Beide Dateien liegen im gleichen Verzeichnis mit dem Namen LED unter 
"...\Documents\Arduino\libraries\LED" (Windows 8).

Rein zu Testzwecken habe ich die Library SPI.h eingebunden. Das 
funktioniert jedoch nicht wie gewollt, beim Compilen meines Sketches in 
der Arduino IDE, bekomme ich die Fehlermeldung:

...\Documents\Arduino\libraries\LED\LED.cpp: In constructor 
'LED::LED(uint8_t)':
...\Documents\Arduino\libraries\LED\LED.cpp:7: error: 'SPI' was not 
declared in this scope

Die SPI-Lib wird also aus irgendwelchen Gründen nicht eingebunden, 
obwohl doch bspw. die Arduino.h sofort erkannt wird? Woran liegt das?

Viele Grüße
Andi

von Andi K. (fry12)


Lesenswert?

Okay, das Problem habe ich durch relative Pfadangaben gelöst. Die 
Library habe ich in das Standardverzeichnis zu den mitgelieferten 
Libraries (SPI, EEPROM etc.) verschoben, damit die relative Pfadangabe 
Sinn ergibt.

Anstatt:
1
#include <SPI.h>

steht nun in meinem Header-File:
1
#include "../SPI/SPI.h"

Jetzt kommen immerhin keine Meldungen, dass SPI nicht deklariert wurde. 
Aber folgende Fehlermeldung erscheint nun:

C:\Program Files (x86)\Arduino\libraries\LED/LED.cpp:7: undefined 
reference to `SPIClass::begin()'

An der betreffenden Stelle (Zeile 7 im LED.cpp-File) steht der Aufruf:
1
SPI.begin();

Weiß jemand Rat?

Edit:
In meinem Sketch zum Testen der LED-Library habe ich nun spaßeshalber 
oberhalb der #include-Anweisung für LED.h die SPI.h-Library ebenfalls 
inkludiert. Jetzt funktioniert alles und der Compiler meckert nicht.

Allerdings ist das sehr unschön. Ich möchte, dass lediglich meine 
selbstgeschriebene Library inkludiert werden muss und nicht auch noch 
von Hand die, die von der Lib letzten Endes verwendet werden.
Außerdem befürchte ich, dass es da zu irgendwelchen doppelten und 
dreifachen includes kommt, die nur schwer zu durchschauen sind und 
irgendwo Probleme verursachen könnten.

: Bearbeitet durch User
von hp-freund (Gast)


Lesenswert?

http://arduino.cc/en/Hacking/Libraries

unten gibt es eine Test lib mit readme.

von Mike (Gast)


Lesenswert?

Andi K. schrieb:
> Außerdem befürchte ich, dass es da zu irgendwelchen doppelten und
> dreifachen includes kommt, die nur schwer zu durchschauen sind und
> irgendwo Probleme verursachen könnten.

Das kann nicht passieren, dafür sorgt der Preprozessor wegen
1
#ifndef LEDLIB_H
2
#define LEDLIB_H
3
...
4
#endif

von Helge (Gast)


Lesenswert?

>Allerdings ist das sehr unschön. Ich möchte, dass lediglich meine
>selbstgeschriebene Library inkludiert werden muss und nicht auch noch
>von Hand die, die von der Lib letzten Endes verwendet werden.

Dann mußt Du in LED.h SPI.H includieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.