Sketsch aufteilung

Hallo

Ja ich weis es ist etwas älteres Thema. Jedoch immer noch nicht verstanden.
Ich habe auch schon darüber gelesen.

Habe bis jetzt nix mit .h gemacht.
Ich habe einen Code von 300 Zeilen und möchte diese nun aufspalten. In diese Zeilen sind alles verschiedene Funktionen. Diese geben mit Variablen Infos weiter.
Wen ich jetzt in einen Tab den Wert X an einer Variabel int hour gebe, ist dieser Wert und Variabel nur in dem einen Tab gültig? und wen ja wie deklariere ich diese so das sie bei allen gültig sind.

GRüsse Benjamin

Denke nicht in Tabs, da spielt Arduino sein eigenes Spiel.

Stopfe deine Funktionen in *.cpp Dateien.
Erstelle für jede *.cpp eine *.h Datei.

In den *.h deklarierst du die in den *.cpp Dateien definierten Funktionen.
Global verfügbare Variablen deklarierst du in der *.h als extern.

Also dann sieht dass so aus, dass ich ein zweite/weitere Datei im gleichen Ordner erstelle mit der Endung *******.h

#ifdef TIME_h
#define TIME_h

int second = 0;
int minute = 0;
int hour = 0;
int weekDay = 0;
int monthDay = 0;
int month = 0;
int year = 2016;

#endif
void ASK_TIME() {

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);

  byte zero = 0x00;
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  second = bcdToDec(Wire.read());
  minute = bcdToDec(Wire.read());
  hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  monthDay = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());

}

Und in der **.cpp dann z.B.

Oder mus ich au hier noch #ifdefine TIME_h machen?

Danke für die Antwort.

Teil 1 meines Vorschlages hast du ja jetzt umgesetzt.

Teil 2 harrt noch der Dinge, welche da kommen müssen....

Bzgl. Tabs:
Die IDE geht da knallhart von links nach rechts vor. Legst Du eine Variable im 1. Tab an, so ist sie von überall zugreifbar.
Deklarierst Du eine Variable im 2. Tab und referenzierst sie im 1. Tab, meckert der Kompiler :o
Wiederum 2. Tab deklaration, 3. Tab Verwendung funktioniert wieder :slight_smile:

Die IDE geht da knallhart von links nach rechts vor.

Naja...
Verwendet man an der Stelle *.cpp und *.h Dateien tut sie genau das, was man da schreibt.

Verwendet man allerdings *.ino Dateien, erstellt sie selber Prototyoen und bindet die Dateien in alphabetischer Reihenfolge ein. Und das passiert nicht immer so, wie man sich das wünscht.

Danke

Habe jetzt mal die **.cpp und die **.h Datei erstellt und folgendes Geschrieben:

In der TIME.cpp

#define TIME_h
#if define TIME_h

void ASK_TIME() {

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);

  byte zero = 0x00;
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  second = bcdToDec(Wire.read());
  minute = bcdToDec(Wire.read());
  hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  monthDay = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());

}

#endif

und in der TIME.h

#define TIME_h
#if define TIME_h

int second = 0;
int minute = 0;
int hour = 0;
int weekDay = 0;
int monthDay = 0;
int month = 0;
int year = 2016;

#endif

Jetzt das ganze mal getestet jedoch kommt dann volgende Vehlermeldung das ASK_TIME (); nicht deklariert ist.

Was mache ich falsch. bzw. was stimmt nicht.
WEgen den Tabs, also wen ich das so mache dann funktioniert es immer? LINKS oder RECHTS ist EGAL?

In die *.h gehören keine Variablen Definitionen, sondern bestenfalls die zugehörigen extern Deklarationen.

Jetzt das ganze mal getestet jedoch kommt dann volgende Vehlermeldung das ASK_TIME (); nicht deklariert ist.

Kein Wunder.
(warum muss ich mich wiederholen?)

In den *.h deklarierst du die in den *.cpp Dateien definierten Funktionen.

Du nimmst also einfach den Funktionsprototypen und schreibst ihn in die *.h

Vielleicht solltest du lieber bei Tabs bleiben :slight_smile:

Die Tabs werden vor dem kompilieren in alphabetischer Reihenfolge in eine .cpp Datei kopiert und kompiliert. Wen man das beachtet ist Code auch untereinander verwendbar.

Jetzt das ganze mal getestet jedoch kommt dann volgende Vehlermeldung das ASK_TIME (); nicht deklariert ist.

Was mache ich falsch. bzw. was stimmt nicht.

Wenn du Header selbst schreibst kannst du dich nicht auf den Arduino Komfort verlassen

#define TIME_h
#if define TIME_h

Include Guards musst du dir auch noch mal ansehen. Man fragt erst ab ob das Makro nicht definiert und definiert dann das Makro. Damit es nur einmal gemacht wird

Außerdem wird das nur im Header gemacht! In der .cpp Datei inkludierst du dann nur den Header

Außerdem musst du auch Arduino Header inkludieren die du da braucht. Wie Wire.h

Okey
ich denke wirklich das tabs noch besser sind für mich :confused:
(Ach meno)

HAbe bis jetzt ausprobiert und :fearful: (ungefähr sa ich aus :smiley: )

Aber danke nochmals an euch für die Geduld und Hilfestellung.

Grüsse Benjamin

Wenn du willst, dann bekommst du das auch mit *.h und *.cpp Dateien hin.
Hat unter Anderem den Vorteil, dass dein Code dann von jedem C++ Compiler auf der Welt gefressen werden kann/könnte.
Das *.ino Gedöns wird nur von der Arduino IDE geschluckt.

Okey das stimmt. Der Code solte eben bald so fertig sein das er Eingesetzt und getestet werden kann. Ist eben für ein Schulprojektchen.
Aber für die Abschlussarbeit schaue ich dieses Thema sicher nochmal genauer an.

Grüsse
Benjamin