Noob: Funktionen in Datei auslagern?

Moin,
wie lagert man denn Funktionen richtig in andere Programmdateien aus, so dass sie auch fremde Funktionen aus Libraries ausführen können?

Konkret hapert es gerade beim Zugriff auf ein LCD-Objekt.
Als Block vor dem Setup funktionierts, jetzt hätt ich nur gerne die Sektion in einer separaten Datei untergebracht.

#include <Wire.h>
#include "RTClib.h"
#include "LiquidCrystal_I2C.h"
#include "WaterTimer.h"

LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS3231 rtc;

enum runmode {WTerror,WTsetup,WTaus, WTein, WTauto,WTpreon,WTpreoff,WTcountdown,WTprog};
char daysOfTheWeek[7][2] = {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
char LCDLine1[20];char LCDLine2[20];char LCDLine3[20];char LCDLine4[20];


/* ===========Dieser Teil soll raus ==========================
void LCDupdate (char Line1[20],char Line2[20],char Line3[20],char Line4[20])
{
    lcd.setCursor(0,0);
    lcd.print(Line1);
    lcd.setCursor(0,1);
    lcd.print(Line2);
    lcd.setCursor(0,2);
    lcd.print(Line3);
    lcd.setCursor(0,3);
    lcd.print(Line4);
}
=====================================================
*/
void setup () {
[...]

kopiere ich das in eine cpp, die ich durch include einbinde, scheitert es am augenscheinlich unbekannten lcd-Objekt. Testweise das lcd durch "LiquidCrystal_I2C" ersetzt ändert auch nichts. hatte ich mir in libraries abgeschaut, die von wire.-funktionen gebrauch machen. aber woh mit eigenen wire-objekten. hier möchte ich ja gerne das aus der hauptdatei verwenden. was also tun?

hier mal die gescheiterten versuche:

WaterTimer.cpp:

#include "WaterTimer.h"
#include "LiquidCrystal_I2C.h"
#include <inttypes.h>
#include <Arduino.h>
#include <Wire.h>


void LCDupdate (char Line1[20],char Line2[20],char Line3[20],char Line4[20])
{
    lcd.setCursor(0,0);
    lcd.print(Line1);
    lcd.setCursor(0,1);
    lcd.print(Line2);
    LiquidCrystal_I2C.setCursor(0,2);
    LiquidCrystal_I2C.print(Line3);
    LiquidCrystal_I2C.setCursor(0,3);
    LiquidCrystal_I2C.print(Line4);
}

WaterTimer.h:

#ifndef _WATERTIMER_H_
#define _WATERTIMER_H_

#include <Arduino.h>
#include <inttypes.h>
#include "LiquidCrystal_I2C.h"


void LCDupdate (char [20],char [20],char [20],char [20]);
    

#endif //_WATERTIMER_H_

Thx für Hilfe :o)

in WaterTimer.h hinzufügen

extern LiquidCrystal_I2C lcd;

?!?!

klappt. besten Dank!

Anderer Punkt - warum müssen die includes von rtc und lcd in Anführungszeichen stehen?
Wenn ich bibliothek hinzufüge und er sie in Spitzklammern einfügt schmeißt es Fehler bzgl mehrfacher Definition. Warum dann nicht (auch) bei Anführungszeichen?

Wenn ich bibliothek hinzufüge und er sie in Spitzklammern einfügt schmeißt es Fehler bzgl mehrfacher Definition

Kann ich mir kaum vorstellen.

Tipp:
Es gibt Auswertungsregeln!
Die kann man nachlesen.

Zusätzlich werden <> includes von der IDE für den Buildprozess verarbeitet...
Auch das Verfahren ist sicherlich irgendwo im Detail beschrieben.

Grundregel(stark simplifiziert):
Dateien im gleichen Ordner mit "" einbinden
Libraries mit <>

Ich würde sagen: eigene Dateien mit "", fremde Bibliotheken mit <>.

DrDiettrich:
Ich würde sagen: eigene Dateien mit "", fremde Bibliotheken mit <>.

Damit liegst Du falsch.

Dateien, die sich im gleichen Ordner befinden, wie der Sketch, werden mit Anfü^HZollzeichen eingebunden. Bei der Verwendung von Größer-/Kleiner-Zeichen muss sich die Datei (üblicherweise eine Bibliothek) lediglich irgendwo im Suchpfad für Bibliotheken befinden (wozu das aktuelle [Sketch-] Verzeichnis nicht gehört).

Gruß

Gregor

Damit liegst Du falsch.

Ich würde es nicht so krass formulieren....

Eigentlich wollte ich es so wie DrDiettrich formulieren, weil es oft stimmt.
Aber da steckt zuviel falsch drin.
Denn immer mehr nutze ich eigene Libraries.
Und werfe fremde *.h Dateien in "meine" Ordner.

Ja, es gibt, wenig falsch, viel falsch und auch so derbe falsch, dass noch nicht mal das Gegenteil richtig ist.

Aber das eigentliche Problem ist ja:

Wenn ich bibliothek hinzufüge und er sie in Spitzklammern einfügt schmeißt es Fehler bzgl mehrfacher Definition

Was da falsch läuft, ist mir noch nicht so klar.

gregorss:
Dateien, die sich im gleichen Ordner befinden, wie der Sketch, werden mit Anfü^HZollzeichen eingebunden. Bei der Verwendung von Größer-/Kleiner-Zeichen muss sich die Datei (üblicherweise eine Bibliothek) lediglich irgendwo im Suchpfad für Bibliotheken befinden (wozu das aktuelle [Sketch-] Verzeichnis nicht gehört).

Warum dann aber das scheitern bei Spitzklammer um Bibliothek, wie die Software sie auch automatisch beim einbinden der Libs setzt? Diese Dateien sind doch gar nicht im aktuellen Sketch-Verzeichnis zu finden, kompiliert aber bei Anführungszeichen? Schlägt da die eigentliche Einbindung mangels auffindbarer Datein (unbemerkt) fehl, ist aber an anderer Stelle schon gültig erfolgt und lässt sich deswegen bauen?
Irgendwie scheint mir der Fehlertext ja auch auf eine konkurrierende Definition hinzudeuten.

Wie muss das in sauber funktionierender Form aussehen?

Arduino: 1.8.5 (Windows 7), Board: "Arduino Nano, ATmega328P"

libraries\RTClib-master\RTClib.cpp.o (symbol from plugin): In function `DateTime::DateTime(unsigned long)':

(.text+0x0): multiple definition of `DateTime::DateTime(unsigned long)'

sketch\RTClib.cpp.o (symbol from plugin):(.text+0x0): first defined here

libraries\RTClib-master\RTClib.cpp.o (symbol from plugin): In function `DateTime::DateTime(unsigned long)':

[...ganz viele vergleichbare meldungen....]

collect2.exe: error: ld returned 1 exit status

exit status 1
Fehler beim Kompilieren für das Board Arduino Nano.

KA...

Du lieferst keinen testbaren Code...
Das bringt mich zu der Vermutung, dass du gar keine Lösung möchtest.
:o :o :o :o

libraries\RTClib-master\RTClib.cpp.o

Das Verzeichnis würde ich umbenennen!
Also \RTClib-master\ zu \RTClib\

combie:
Ich würde es nicht so krass formulieren....

„Krass“ wäre IMO etwas wie „Versager wie du machen sowas“. Aber „krass“ ist interpretationsfähig.

Falls das irgendwie „schlimm“ ankam, bitte ich um Entschuldigung.

BTW: Uneingeschränkt krass ist, was ich mir gerade reinziehe: „From dusk till dawn“ von Robert Rodriguez. Dass der sich mit Tarantino versteht, wundert mich nicht :slight_smile:

Gruß

Gregor

Ach, da mach dir mal keine Sorgen...

Das Verhalten mit <> oder "" ist zum großen Teil "Implementation defined".