'multiple definition of'-Fehlermeldung bei Modularisierung

Hi,

ich versuche seit ein paar Stunden mich darin einen Code, der in einer .ino-Datei lag zu modularisieren und je erstmal Gewisse Teile des Codes in eine .cpp und .h auszulagern.

Dabei erhalte ich eine Fehlermeldung mit dem schönen Titel: ‘multiple definition of’ und ich fische total im Trüben.

Ich würde mich sehr freuen, wenn Ihr mir dabei helfen könntet um den Fehler herum zu schiffen. Da, ich auch eher das learining by doing voran komme, freue ich mich auch sehr über sonstige Typs auch gerne über Stilefragen.

Vielen Dank.

Der Code der .ino lautet:

//for moving ultrasonic sensor
#define SERVO 6  //Servo at Pin 6 etc.
#define IRSENS 2
#define PING 2

#include "Sensors.h"
#include "Sensors.cpp"
#include <Servo.h>

//for motors
#define dirA 12
#define dirB 13
#define PWMA 3//for speed
#define PWMB 11
#define brakeA 9
#define brakeB 8

int Start[DIFFERENCE];
int Final[DIFFERENCE];

void transposetoXY() {
}

void motors_setup() {
  //set speed for forward movement
  int speedA = 135;
  int speedB = 128;
  
  //set pins for direction
  pinMode(dirA, OUTPUT);
  pinMode(dirB, OUTPUT);
  
  //set pins for the break
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);
  
  //sets the speed of the movement
  analogWrite(PWMA, speedA);
  analogWrite(PWMB, speedB);
  
  //fasten break
  digitalWrite(brakeA, HIGH);
  digitalWrite(brakeB, HIGH);
}
  
void moveForward( int distance) {
  digitalWrite(dirA, HIGH);
  digitalWrite(dirB, HIGH);
  
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);
  
  delay(distance*105);//move distance in cm
  
  digitalWrite(brakeA, HIGH);
  digitalWrite(brakeB, HIGH);
}
  
  
void setup() {
  Serial.begin(115200);
  head.attach(SERVO);
  //head.write(LEFT);
   Serial.println (DIFFERENCE);
   motors_setup();
   moveForward(30);//move 30 cm
}


void loop() {
  moveSensor(Start, Final, DELAY);
  trackMotion(Start, Final);


}

Der der .cpp

#include <Servo.h>
#include <Arduino.h>//Arduino includes
#include "Sensors.h"
#ifndef PING
#define PING 2
#endif

Servo head;

//for moving ultrasonic sensor
const int DIFFERENCE = ((RIGHT - LEFT)/STEP)+1;
const int DELAY = PAUSE*STEP;


/*float getIR() {
  pinMode(IRSENS, INPUT);
  float voltage = analogRead(IRSENS);
  float distance = (6787/ (voltage - 3))-4;
  
  if (distance > 80.0)
    distance = 80.0;
  if (distance < 10.0)
    distance = 10.0;
    
  return distance;
}*/

int getPing(int pingPin) {
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  
  pinMode(pingPin, INPUT);
  
  float microseconds = pulseIn(pingPin, HIGH, 20300);//set to maximal 350 m
  int cm = int(microseconds/29/2);//output in cm, Ultrasound travels with 29 µs/cm
  
  return cm;  
}

int getDistance() {
  int distance;
  int i;
  const uint8_t COMPLETE = 3;
  
  do {
    //int distance = int(getIR());
    distance = getPing(PING);
    i++;
  } while (((distance > 290) || (distance <= 3)) && i < COMPLETE);
  return distance;
}

void moveSensor(int outStart[], int outFinal[], int Ending ) {
  int k = 0;
  int phi = 0;

  for (int i = LEFT; i < RIGHT; i = i + STEP) {
    head.write(i);
    outStart[k] = getDistance ();
    k++;
    delay(Ending);
  }
    
  for (int i = RIGHT; i > LEFT; i = i - STEP) {
    k--;
    head.write(i);
    outFinal[k] = getDistance();
    delay(Ending);
  }
}

void trackMotion (int inStart[], int inFinal[]) {
  
  int motion[DIFFERENCE];
  
  for (int k = 0; k < DIFFERENCE; k++) {
    int phi =  k*STEP + LEFT - FRONT;
    motion[k] = inFinal[k] - inStart[k];
    Serial.print("Die Entfernnung bei ");
    Serial.print(phi);
    Serial.print(" Grad betraegt: ");
    Serial.print(inStart[k]);
    Serial.print(" und ");
    Serial.print(inFinal[k]);
    Serial.print(" cm, Bewegung ist: ");
    Serial.print(motion[k]);
    Serial.println(" cm.");
  }
}

und der Header sieht wie folgt aus:

#include <Arduino.h>//Arduino includes


#define PAUSE 20
#define STEP 1
#define FRONT 99
#define LEFT 79
#define RIGHT 119


//float getIR();
int getPing(int pingPin);
int getDistance();
void moveSensor(int outStart[], int outFinal[], int Ending );
void trackMotion (int inStart[], int inFinal[]);

Ich habe soetwas noch nicht gemacht und deshalb für mich ausprobiert, da ich gerade ein größeres Projekt versuche. Bei mir mit IDE 1.5.8 sagt der Compiler:

Der Sketch verwendet 5.910 Bytes (18%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 461 Bytes (22%) des dynamischen Speichers, 1.587 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.

Möglicherweise hilft es den Experten, wenn Du verrätst, wie Du compilierst. Gutes Gelingen!

Ist zwar nett; daß Du uns den Titel der Fehlermeldungen mitteilst; die gesamten Fehlermeldungen wären aber hilfreicher.
Grüße Uwe

Hi,

ich kompiliere in der Arduino-IDE und habe mir gerade für Windows die Version 1.6.3 installiert.

Die Datein sind im Ordner der .ino-Datei enthalten und werden somit gleich mit der .ino in der IDE geöfnet. Ich wähle, die .ino aus und kompliere dann wie normal.

Die Fehlermeldung lautet:


C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp\Sensors.cpp.o: In function `getPing(int)':

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp/Sensors.cpp:28: multiple definition of `getPing(int)'

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp\Ardubot_-_MotionTracker.cpp.o:C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp/Sensors.cpp:28: first defined here

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp\Sensors.cpp.o: In function `getPing(int)':

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp/Sensors.cpp:28: multiple definition of `getDistance()'

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp\Ardubot_-_MotionTracker.cpp.o:C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp/Sensors.cpp:28: first defined here

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp\Sensors.cpp.o: In function `getPing(int)':

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp/Sensors.cpp:28: multiple definition of `moveSensor(int*, int*, int)'

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp\Ardubot_-_MotionTracker.cpp.o:C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp/Sensors.cpp:28: first defined here

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp\Sensors.cpp.o: In function `getPing(int)':

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp/Sensors.cpp:28: multiple definition of `head'

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp\Ardubot_-_MotionTracker.cpp.o:C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp/Sensors.cpp:28: first defined here

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp\Sensors.cpp.o: In function `getPing(int)':

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp/Sensors.cpp:28: multiple definition of `trackMotion(int*, int*)'

C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp\Ardubot_-_MotionTracker.cpp.o:C:\Users\SEBAST~1\AppData\Local\Temp\build2680162274735454356.tmp/Sensors.cpp:28: first defined here

collect2.exe: error: ld returned 1 exit status

Fehler beim Kompilieren.

Aber kann man daraus was herauslesen?

Die omninöse Sensors.cpp ist die .cpp für die Auslagerung.

Versuch mal, dies in .h zu löschen:

//float getIR();
int getPing(int pingPin);
int getDistance();
void moveSensor(int outStart[], int outFinal[], int Ending );
void trackMotion (int inStart[], int inFinal[]);

Wäre mein Vorgehen :slight_smile:

Es kann sein, dass da die Arduino IDE mit ihren automatischen Funktions-Prototypen irgendwo dazwischenpfuscht.

agmue:
Versuch mal, dies in .h zu löschen:

//float getIR();
int getPing(int pingPin);
int getDistance();
void moveSensor(int outStart, int outFinal, int Ending );
void trackMotion (int inStart, int inFinal);

Wäre mein Vorgehen :slight_smile:

Also ich habe im Header schonmal versucht alles auskommentiert und dass entfernen hat auch nichts daran geändert.

Wäre es also Ratsam eine andere IDE zu nutzen, bei solchen Problemen? Was funktioniert denn gut? Habe bisher noch keine Erfahrungen mit anderen IDEs im Einsatz für Arduino sammeln können.

Am einfachsten ist es du verzichtest auf die Aufteilung in Header und .cpp Datei wenn die nicht gleich eine Klasse draus machst.

Pack das einfach (ohne Prototypen) in eine .ino Datei. Den Rest erledigt die IDE für dich. Die kopiert dann die .ino Dateien in eine .cpp Datei und kompiliert diese.
Der einzige Haken dabei, ist dass die .ino Dateien in alphabetischer Reihenfolge bearbeitet werden. Aber das ist auch kein Problem wenn man die Dateien entsprechend benennt.

Ich nutze seit Dezember letzten Jahres IDE 1.5.8 beta und bin damit zufrieden. Eine Probeinstallation von 1.6.2 habe ich wieder gelöscht. Sowas ist natürlich auch eine Mentalitätsfrage, ich würde da keinen Rat geben wollen.

Hi,

habe mich darin versucht nun Mal, wie beschrieben, Header und .cpp in einer .ino zusammen zufassen und diese mit

#include “Sensors.ino”

aufzurufen. (Die .cpp und den Header habe ich zuvor aus dem Ordner gelöscht.)

Habe er die Präprozessoranweisungen, dann die Funktionsköpfe, dann sonstiges und dann die Funktionen in alphabetischer Reihenfolge.

#include <Arduino.h>//Arduino includes

#include <Servo.h>
#ifndef PING
#define PING 2
#endif

Servo head;

#define PAUSE 20
#define STEP 1
#define FRONT 99
#define LEFT 79
#define RIGHT 119


//float getIR();
int getPing(int pingPin);
int getDistance();
void moveSensor(int outStart[], int outFinal[], int Ending );
void trackMotion (int inStart[], int inFinal[]);

Servo head;

//for moving ultrasonic sensor
const int DIFFERENCE = ((RIGHT - LEFT)/STEP)+1;
const int DELAY = PAUSE*STEP;

int getDistance() {
  int distance;
  int i;
  const uint8_t COMPLETE = 3;
  
  do {
    //int distance = int(getIR());
    distance = getPing(PING);
    i++;
  } while (((distance > 290) || (distance <= 3)) && i < COMPLETE);
  return distance;
}

/*float getIR() {
  pinMode(IRSENS, INPUT);
  float voltage = analogRead(IRSENS);
  float distance = (6787/ (voltage - 3))-4;
  
  if (distance > 80.0)
    distance = 80.0;
  if (distance < 10.0)
    distance = 10.0;
    
  return distance;
}*/

int getPing(int pingPin) {
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  
  pinMode(pingPin, INPUT);
  
  float microseconds = pulseIn(pingPin, HIGH, 20300);//set to maximal 350 m
  int cm = int(microseconds/29/2);//output in cm, Ultrasound travels with 29 µs/cm
  
  return cm;  
}

void moveSensor(int outStart[], int outFinal[], int Ending ) {
  int k = 0;
  int phi = 0;

  for (int i = LEFT; i < RIGHT; i = i + STEP) {
    head.write(i);
    outStart[k] = getDistance ();
    k++;
    delay(Ending);
  }
    
  for (int i = RIGHT; i > LEFT; i = i - STEP) {
    k--;
    head.write(i);
    outFinal[k] = getDistance();
    delay(Ending);
  }
}

void trackMotion (int inStart[], int inFinal[]) {
  
  int motion[DIFFERENCE];
  
  for (int k = 0; k < DIFFERENCE; k++) {
    int phi =  k*STEP + LEFT - FRONT;
    motion[k] = inFinal[k] - inStart[k];
    Serial.print("Die Entfernnung bei ");
    Serial.print(phi);
    Serial.print(" Grad betraegt: ");
    Serial.print(inStart[k]);
    Serial.print(" und ");
    Serial.print(inFinal[k]);
    Serial.print(" cm, Bewegung ist: ");
    Serial.print(motion[k]);
    Serial.println(" cm.");
  }

}

Die Fehlermeldung lautet, dabei ganz einfach:

Arduino: 1.6.3 (Windows 8.1), Platine: "Arduino Uno"

Verwende die Bibliothek Servo im Ordner: C:\Program Files (x86)\Arduino\libraries\Servo 


C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10603 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard -IC:\Program Files (x86)\Arduino\libraries\Servo\src C:\Users\SEBAST~1\AppData\Local\Temp\build7675335043445401528.tmp\Ardubot_-_MotionTracker.cpp -o C:\Users\SEBAST~1\AppData\Local\Temp\build7675335043445401528.tmp\Ardubot_-_MotionTracker.cpp.o 

Ardubot_-_MotionTracker.ino:6:23: fatal error: Sensors.ino: No such file or directory

compilation terminated.

Fehler beim Kompilieren.

Mit anderen IDEs was zu versuchen, habe ich was runtergeladen…^^ (Das Addon für eclipse, aber das nicht zum Laufen gebracht und dann die eigenenständige Arduino Eclipse, die sich aber nicht starten ließ. Verträgt sich eine 32bit Version nicht mit 64bit Java?)

Verträgt sich eine 32bit Version nicht mit 64bit Java?

Stimmt, verträgt sich nicht.
Sollte aber auch ein 32bit Java vorhanden sein, das mit der Arduino-Software mitkommt.

#include "Sensors.ino" halte ich für eine schlechte Idee.

#include sollte man nur für Header-Dateien verwenden.
Wenn dein Projekt aus mehreren .ino und .cpp Dateien besteht, findet die Arduino IDE das von selbst, wenn sie alle im selben Ordner sind.

michael_x:
#include "Sensors.ino" halte ich für eine schlechte Idee.

#include sollte man nur für Header-Dateien verwenden.
Wenn dein Projekt aus mehreren .ino und .cpp Dateien besteht, findet die Arduino IDE das von selbst, wenn sie alle im selben Ordner sind.

Hi, was muss ich dann aber tuen, damit der Compiler weiß, was wo steht?

Also habe es zum Laufen bekommen, aber nun steht alles außer den Funktionsdefinitionen wieder in der ersten .ino. In der ersten .ino stehen auch die Prototypen der Funktionen.

Was muss in die "Main".ino und was kann in weitere Ausgelagert werden und warum? Das würde helfen. Die Anzahl der weiterer .ino's zum Auslagern ist unbegrenzt?

Was kann man in welche Datei schreiben und was ist sinnvoll?

Das macht die IDE für dich. Arduino funktioniert an dieser Stelle nicht wie Standard C++. Die IDE kopiert automatisch Dateien zusammen und erstellt automatisch Funktionsprototypen.

Das kann auch Probleme verursachen, vor allem da der Prototyp Parser Probleme mit einigen Konstrukten wie default Parameter, templates oder enums als Parameter hat. Bedingt kompilierte Include Direktiven werden auch nicht richtig erkannt.
Aber wenn es funktioniert ist es ganz nett.

Wenn du es “richtig” machen willst, machst du 3 Dateien:

main.ino

#include "MyInclude.h"
int data;  // Hier ist die Definition
void setup()
{ 
    data = 1234;
    Serial.begin(9600);
    func();
}
void loop() {data++;}

MyInclude.h

#ifndef _MYINCLUDE
#define _MYINCLUDE
extern int data; // Deklarationen
void func();
#endif

myfuncs.cpp

#include <Arduino.h>
#include "MyInclude.h"  // myfuncs kennt func() und data
void func()
{ 
   Serial.print ("func wurde gefunden und aufgerufen\n data=");
   Serial.println (data);
}

Nachtrag:
Die definitions.h und alle #include Anweisungen kannst du dir sparen, wenn du myfuncs.cpp in myfuncs.ino umbenennst. Dann macht die Arduino Software aus deinen .ino Dateien C++ Code.

Nachtrag2: noch eine Variablen-Deklaration als Beispiel zugefügt.

Vielen Dank
für diesen letzten Tipp. Das ist eigentlich, was ich die ganze Zeit schon wollte, aber bisher noch nie geklappt hat. Zur Zeit versuche ich es also mit dem Ratschlag nochmal leide aber an folgender Fehlermeldung:

C:\Users\SEBAST~1\AppData\Local\Temp\build1309896020203218489.tmp\Sensors.cpp.o:(.bss.head+0x0): multiple definition of `head'

C:\Users\SEBAST~1\AppData\Local\Temp\build1309896020203218489.tmp\Ardubot_-_MotionTracker.cpp.o:(.bss.head+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

Fehler beim Kompilieren.

Danach habe ich den letzten Verweiß von head aus der “main”.ino gelöscht und

head.attach(SERVO);

in den Header gesteckt.

Dann kommt es zu folgender Fehlermeldung. Warum ist ja ein Objekt, warum macht das ein Problem? In der .cpp entsteht derselbe Fehler

C:\Users\SEBAST~1\AppData\Local\Temp\build1309896020203218489.tmp\Sensors.h:14:1: error: 'head' does not name a type

head.attach(SERVO);

^

Fehler beim Kompilieren.

Der Code sieht zur Zeit wie folgt aus:

Die “main”.ino

//for moving ultrasonic sensor
#include "Sensors.h"

/*#define SERVO 6  //Servo at Pin 6 etc.
#define IRSENS 2
#define PING 2
*/





//for motors
#define dirA 12
#define dirB 13
#define PWMA 3//for speed
#define PWMB 11
#define brakeA 9
#define brakeB 8

int Start[DIFFERENCE];
int Final[DIFFERENCE];

void transposetoXY() {
}

void motors_setup() {
  //set speed for forward movement
  int speedA = 135;
  int speedB = 128;
  
  //set pins for direction
  pinMode(dirA, OUTPUT);
  pinMode(dirB, OUTPUT);
  
  //set pins for the break
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);
  
  //sets the speed of the movement
  analogWrite(PWMA, speedA);
  analogWrite(PWMB, speedB);
  
  //fasten break
  digitalWrite(brakeA, HIGH);
  digitalWrite(brakeB, HIGH);
}
  
void moveForward( int distance) {
  digitalWrite(dirA, HIGH);
  digitalWrite(dirB, HIGH);
  
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);
  
  delay(distance*105);//move distance in cm
  
  digitalWrite(brakeA, HIGH);
  digitalWrite(brakeB, HIGH);
}
  
  
void setup() {
  Serial.begin(115200);
  //head.write(LEFT);
   Serial.println (DIFFERENCE);
   motors_setup();
   moveForward(30);//move 30 cm
}


void loop() {
  moveSensor(Start, Final, DELAY);
  trackMotion(Start, Final);


}

Sensors.cpp

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


int getDistance() {
  int distance;
  int i;
  const uint8_t COMPLETE = 3;
  
  do {
    //int distance = int(getIR());
    distance = getPing(PING);//select IR or Ultrasonic PING sensor
    i++;
  } while (((distance > 290) || (distance <= 3)) && i < COMPLETE);
  return distance;
}

float getIR() {
  pinMode(IRSENS, INPUT);
  float voltage = analogRead(IRSENS);
  float distance = (6787/ (voltage - 3))-4;
  
  if (distance > 80.0)
    distance = 80.0;
  if (distance < 10.0)
    distance = 10.0;
    
  return distance;
}

int getPing(int pingPin) {
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  
  pinMode(pingPin, INPUT);
  
  float microseconds = pulseIn(pingPin, HIGH, 20300);//set to maximal 350 m
  int cm = int(microseconds/29/2);//output in cm, Ultrasound travels with 29 µs/cm
  
  return cm;  
}

void moveSensor(int outStart[], int outFinal[], int Ending ) {
  int k = 0;
  int phi = 0;

  for (int i = LEFT; i < RIGHT; i = i + STEP) {
    head.write(i);
    outStart[k] = getDistance ();
    k++;
    delay(Ending);
  }
    
  for (int i = RIGHT; i > LEFT; i = i - STEP) {
    k--;
    head.write(i);
    outFinal[k] = getDistance();
    delay(Ending);
  }
}

void trackMotion (int inStart[], int inFinal[]) {
  
  int motion[DIFFERENCE];
  
  for (int k = 0; k < DIFFERENCE; k++) {
    int phi =  k*STEP + LEFT - FRONT;
    motion[k] = inFinal[k] - inStart[k];
    Serial.print("Die Entfernnung bei ");
    Serial.print(phi);
    Serial.print(" Grad betraegt: ");
    Serial.print(inStart[k]);
    Serial.print(" und ");
    Serial.print(inFinal[k]);
    Serial.print(" cm, Bewegung ist: ");
    Serial.print(motion[k]);
    Serial.println(" cm.");
  }

}

Sensors.h

#ifndef PING

#define SERVO 6  //Servo at Pin 6 etc.
#define IRSENS 2
#define PING 2
#define PAUSE 20
#define STEP 1
#define FRONT 99
#define LEFT 79
#define RIGHT 119

#include <Servo.h>
Servo head;
head.attach(SERVO);

//for moving ultrasonic sensor
const int DIFFERENCE = ((RIGHT - LEFT)/STEP)+1;
const int DELAY = PAUSE*STEP;

//float getIR();
int getPing(int pingPin);
int getDistance();
void moveSensor(int outStart[], int outFinal[], int Ending );
void trackMotion (int inStart[], int inFinal[]);

#endif

Könnt ihr eigentlich ein gutes C++ Buch empfehlen, für jemanden der schon einigermaßen prozedural Programmieren kann?

Nachtrag:

Habe noch etwas Probiert. Die .h und .cpp in eine .ino zusammengefasst, oder nur die .cpp in .ino umbenannt. Funktioniert nicht.

Er bemängelt zum Beispiel: nun dass ich die Servo.h in dem Header steht. Warum geht das nicht? und wenn der Header nicht im Header steht, sondern in der “main”…
Dann kommt die Fehlermeldung:

Arduino: 1.6.3 (Windows 8.1), Platine: "Arduino Uno"

Verwende die Bibliothek Servo im Ordner: C:\Program Files (x86)\Arduino\libraries\Servo 



C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10603 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard -IC:\Program Files (x86)\Arduino\libraries\Servo\src C:\Users\SEBAST~1\AppData\Local\Temp\build7619232678002540824.tmp\Ardubot_-_MotionTracker.cpp -o C:\Users\SEBAST~1\AppData\Local\Temp\build7619232678002540824.tmp\Ardubot_-_MotionTracker.cpp.o 

In file included from Ardubot_-_MotionTracker.ino:2:0:

C:\Users\SEBAST~1\AppData\Local\Temp\build7619232678002540824.tmp\Sensors.h:12:1: error: 'head' does not name a type

 head.attach(SERVO);

 ^

Ardubot_-_MotionTracker.ino:11:7: error: redefinition of 'Servo head'

In file included from Ardubot_-_MotionTracker.ino:2:0:

C:\Users\SEBAST~1\AppData\Local\Temp\build7619232678002540824.tmp\Sensors.h:11:7: error: 'Servo head' previously declared here

 Servo head;

       ^

Ardubot_-_MotionTracker.ino:12:1: error: 'head' does not name a type

Fehler beim Kompilieren.

Header Servo.h in Sensors.ino

Arduino: 1.6.3 (Windows 8.1), Platine: "Arduino Uno"

Verwende die Bibliothek Servo im Ordner: C:\Program Files (x86)\Arduino\libraries\Servo 



C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10603 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard -IC:\Program Files (x86)\Arduino\libraries\Servo\src C:\Users\SEBAST~1\AppData\Local\Temp\build7619232678002540824.tmp\Ardubot_-_MotionTracker.cpp -o C:\Users\SEBAST~1\AppData\Local\Temp\build7619232678002540824.tmp\Ardubot_-_MotionTracker.cpp.o 

Sensors.ino:5:1: error: 'head' does not name a type

Fehler beim Kompilieren.

Langsam am Verzweifeln. :frowning:

Hi konnte das Problem lösen,

habe es ungefähr so gemacht wie es michael_x in seinem Post vorgeschlagen hat, nur dass die .cpp in eine .ino umbenennen musste.

Da ich anders nicht, die Code Dopplungen zu umgehen wusste, die der Kompiler fand, da ich in der "main".ino Funktionen/Werte aufrufen wollte, die in anderen Dateien gespeichert waren.

Desweitere bin ich darauf gestoßen, dass

servo.attach(pin) nur in der void setup() oder void loop() angewendet werden kann. Sonst gibt es eine Fehlermeldung, um den Code noch einigermaßen Modular zu halten, habe ich eine Servo_Setup() geschrieben, die nichts anderes tut, als in der void (setup) aufgerufen zu werden und dort servo.attach(pin) ausführt.

Frohe Ostern :wink:

head.attach(SERVO); ist vermutlich ausführbarer Code, der daher nur innerhalb einer Funktion vorkommen kann. ( Üblicherweise in setup() ).

Den Unterschied zwischen Deklaration (= Bekannt machen was es gibt) und Definition (= Platz im Speicher reservieren und diesem einen Namen geben) kann anfangs verwirrend sein.
Deklaration muss für jeden sichtbar sein der’s braucht, Definition darf nur einmal erfolgen.

Aber wenn es für dich ok ist, hat der Arduino Hokuspokus ja seinen Sinn erfüllt. Ich hoffe, dich nicht verwirrt zu haben.

Sehr vielen Dank allen. Es scheint soweit erstmal zu funktionieren. Ganz zufrieden bin ich nicht, da ich nicht das Gefühl es ganz Verstanden zu haben.

Liebe Grüße.