Go Down

Topic: Frage: eigene Library schreiben und einbinden (Read 1 time) previous topic - next topic

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

mfg
Michael

sth77

Gibt ein schönes Tutorial: http://arduino.cc/en/Hacking/LibraryTutorial
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

#2
Jan 04, 2013, 12:58 am Last Edit: Jan 04, 2013, 03:17 pm by michael__k Reason: 1
Danke für die Hilfe! Ich hab mir das Tutorial gleich durchgelesen und auch gleich meine Library geschrieben aber es funktioniert nicht.

LedDisplay.h:
Code: [Select]

#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:
Code: [Select]

#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:
Code: [Select]

#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


mde110

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

michael_x

Tritt der Fehler evtl. in dieser Zeile auf:
Code: [Select]
      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...

#6
Jan 04, 2013, 01:43 am Last Edit: Jan 04, 2013, 02:02 am by michael__k Reason: 1
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

michael_x

Quote
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
http://forum.chip.de/c-c/static-const-array-1168150.html


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:
Code: [Select]
#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

michael_x

Quote
'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 ;)

LedDisplay Display; // ist wohl eher was du willst

Go Up