Frage: eigene Library schreiben und einbinden

Wie kann ich eine eigene Library schreiben und diese dann mit #include in mein sketch einbinden?
Kann mir da jemand weiterhelfen?

mfg
Michael

Gibt ein schönes Tutorial: http://arduino.cc/en/Hacking/LibraryTutorial

Danke für die Hilfe! Ich hab mir das Tutorial gleich durchgelesen und auch gleich meine Library geschrieben aber es funktioniert nicht.

LedDisplay.h:

#ifndef LedDisplay_h
#define LedDisplay_h

#include "Arduino.h"

class LedDisplay
{
	public:
		LedDisplay();
		void updateDisplay(int digit, int display_mode);
	private:
		int numbersca[10][8] =		//code for common anode display (ca)
		{
  		{0,0,1,0,0,0,0,1}, //0
  		{0,1,1,0,1,1,1,1}, //1
  		{0,0,1,1,0,0,1,0}, //2
  		{0,0,1,0,0,1,1,0}, //3
  		{0,1,1,0,1,1,0,0}, //4
  		{1,0,1,0,0,1,0,0}, //5
  		{1,0,1,0,0,0,0,0}, //6
  		{0,0,1,0,1,1,1,1}, //7
  		{0,0,1,0,0,0,0,0}, //8
  		{0,0,1,0,0,1,0,0}, //9
		};

		int numberscc[10][8] =		//code for commen cathode display (cc)
		{
 		{1,1,0,1,1,1,1,0}, //0
  		{1,0,0,1,0,0,0,0}, //1
  		{1,1,0,0,1,1,0,1}, //2
  		{1,1,0,1,1,0,0,1}, //3
  		{1,0,0,1,0,0,1,1}, //4
  		{0,1,0,1,1,0,1,1}, //5
  		{0,1,0,1,1,1,1,1}, //6
  		{1,1,0,1,0,0,0,0}, //7
  		{1,1,0,1,1,1,1,1}, //8
  		{1,1,0,1,1,0,1,1}, //9
		};
		int i;
}
#endif

LedDisplay.cpp:

#include "Arduino.h"
#include "LedDisplay.h"

void LedDisplay::updateDisplay(int Digit, int display_mode)
{
  
  	if(display_mode==0)
  	{
  		for(i=0; i<=7; i++)
  		{
    			digitalWrite(i, HIGH); //clear all segments (HIGH wegen common anode display)
  		}
  
  		for(i=0; i<=7; i++)
  		{
  			if(numbersca[Digit][i]==0)
   			{
        			digitalWrite(i, LOW);
        			delay(3);
        			digitalWrite(i,HIGH);
    			}
    			else
    			{
      				delay(3);
    			}
 		 }
	}	
  	else if(display_mode==1)
  	{
		for(i=0; i<=7; i++)
  		{
    			digitalWrite(i, LOW); //clear all segments (HIGH wegen common anode display)
  		}
  
  		for(i=0; i<=7; i++)
  		{
  			if(numbersca[Digit][i]==1)
   			{
        			digitalWrite(i, HIGH);
        			delay(3);
        			digitalWrite(i,LOW);
    			}
    			else
    			{
      				delay(3);
    			}
  		}
	}
}

mein Sketch:

#include <LedDisplay.h>

int i, n, j;
LedDisplay Display();

void setup()
{
  for(i=0; i<=7; i++)
  {
    pinMode(i,OUTPUT);
  }
}

void loop()
{
  for(n=0; n<=9; n++)
  {    
    for(j=0; j<=30; j++) 
      Dislplay.updateDisplay(n,0);
  }
}

Fehlermeldung nach dem Überprüfen: “new types may not be defined in a return type”

Bitte um Hilfe.

mfg
Michael

Auf den ersten Blick müsstest du m.M. nach noch die new Funktion hinzufügen:
LedDisplay::LedDisplay()
{
}

In dieser kannst du deine Klasse initialisieren

Hab das File LedDisplay.cpp um den Konstruktor ergänzt aber das ändert nichts.

mfg
Michael

Tritt der Fehler evtl. in dieser Zeile auf:

      ledDislplay.updateDisplay(n,0);

(Da ist ein Buchstabel zuviel. Aber das wäre eine wirklich blöde Fehlermeldung)

Sonst hilft es evtl. zu wissen wo der Fehler angemeckert wird...

Ist mir gerade aufgefallen, dass da ein Tippfehler ist aber daran liegt es nicht.
Die IDE markiert mir die 1. Zeile also das #include <LedDisplay.h>.
und untem im feld wo die ganzen Errors angezeicht werden steht folgendes:

In file included from _7segment_1digit.cpp:1:
C:\Users…/LedDisplay.h:17: error: a brace-enclosed initializer is not allowed here before ‘{’ token
C:\Users…/LedDisplay.h:28: error: ISO C++ forbids initialization of member ‘numbers_ca’
C:\Users…/LedDisplay.h:28: error: making ‘numbers_ca’ static
C:\Users…/LedDisplay.h:28: error: invalid in-class initialization of static data member of non-integral type ‘int [10][8]’
C:\Users…/LedDisplay.h:31: error: a brace-enclosed initializer is not allowed here before ‘{’ token
C:\Users…/LedDisplay.h:42: error: ISO C++ forbids initialization of member ‘numbers_cc’
C:\Users…/LedDisplay.h:42: error: making ‘numbers_cc’ static
C:\Users…/LedDisplay.h:42: error: invalid in-class initialization of static data member of non-integral type ‘int [10][8]’
_7segment_1digit:0: error: new types may not be defined in a return type
_7segment_1digit.cpp:4: note: (perhaps a semicolon is missing after the definition of ‘LedDisplay’)
_7segment_1digit:0: error: two or more data types in declaration of ‘setup’
_7segment_1digit.cpp: In function ‘void loop()’:
_7segment_1digit:18: error: request for member ‘updateDisplay’ in ‘ledDisplay’, which is of non-class type ‘LedDisplay ()()’

mfg
Michael

error: new types may not be defined in a return type

... ist ein Folge-Fehler davon, dass deine Klassen-Definition nicht geklappt hat.

Das hat jetzt mit Library schreiben an sich nichts zu tun, sondern damit, dass du
** **numbersca** **
als private class member so nicht initialisieren kannst.

Am einfachsten definierst du dein konstantes (?) Array ausserhalb der class.

Oder im constructor.

Der erste Tip, wenn du "initialize static const array c++" googlest, liefert schon eine brauchbare Lösung

Aber hier besser im PROGMEM, wenn es konstant ist.

Danke für die Hilfe, hab die beiden Arrays außerhalb der Klasse definiert. Aber es kommt noch immer ein Error.

_7segment_1digit.cpp: In function ‘void loop()’:
_7segment_1digit:18: error: request for member ‘updateDisplay’ in ‘Display’, which is of non-class type ‘LedDisplay ()()’

Sketch:

#include <LedDisplay.h>

LedDisplay Display();
int i,j,n;

void setup()
{
  for(i=0; i<=7; i++)
  {
    pinMode(i,OUTPUT);
  }
}

void loop()
{
  for(n=0; n<=9; n++)
  {    
    for(j=0; j<=30; j++) 
      Display.updateDisplay(n,0);
  }
}

mfg
Michael

'Display' ... is of non-class type 'LedDisplay ()()'

LedDisplay Display(); Deklariert eine Funktion mit dem Namen Display, die keine Paramter braucht und ein LedDisplay Objekt zurückliefert. So gesehen macht die Fehlermeldung wieder Sinn :wink:

LedDisplay Display; // ist wohl eher was du willst