Auf eine SD schreiben über eine Funktion

Hallo,

in meiner Steuerung soll jede Aktion auf SD gespeichert werden.
Bis jetzt habe ich das immer so gemacht.

#include "Streaming.h"

File fProtokollF = SD.open(ProtoDateiName(), FILE_WRITE);
if(fProtokollF){
  fProtokollF<<TimeString()<<txtMin<<txtTA<<vTempAussen<<";"<<txtTK<<vTempKueche<<";"<<txtSollK<<vSollTempKueche<<";"
          <<txtRF<<txtWoO<<bStatRoWoO<<txtWoU<<bStatRoWoU<<txtReO<<bStatRoReO<<txtReU<<bStatRoReU<<txtLiO<<bStatRoLiO<<txtLiU
          <<bStatRoLiU<<txtFeWo<<bStatFeWo<<txtFeRe<<bStatFeRe<<txtFeLi<<bStatFeLi<<";"<<txtPump<<aHK_Pumpe<<";"<<txtLUX<<vLUX<<endl;
  fProtokollF.close();
}

// oder auch

File fProtokollF = SD.open(ProtoDateiName(), FILE_WRITE);
  if(fProtokollF){
    fProtokollF<<TimeString()<<txtStart<<endl;
    fProtokollF.close();
  }

Nun möchte ich das ganze in eine Funktion packen und diese mit meinen wechselden Protokolleinträgen aufrufen.

Kann jemand helfen?

Gruß Aron

Hallo,

was meinst Du mit "wechselnde Einträge"

ich sehe eigendlich einen Eintrag bestehend aus einem Datensatz der mehrere Werte enthält.

Ein Problem ist, dass der << Operator links ein Print Objekt braucht, rechts einen der von Print unterstützten Datentypen, das Print Objekt zurück liefert und so von links nach rechts verkettet werden kann.
Ich sehe jetzt nicht, wie du einer Funktion den rechten Teil der Kette mitgeben könntest, damit die dazu ein Print Objekt erzeugt.

Man kann auch eine Referenz auf ein Print Objekt übergeben

Wieso man diese riesige Anzahl an Werten an eine Funktion übergeben soll ist nicht ganz klar. Das sind ja lediglich Variablen die sonstwo im Programm existieren

Hab ich mir schon gedacht, dass es nicht geht.

Aber trotzdem Danke

Das geht schon. Ob es vernünftig ist ist eine andere Frage

Auch die Organisation dieser Variablen an sich könnte man vielleicht besser machen

Wenn Du mehrere verschiedene Datensätze hast, dann baue für jeden eine eigene Schreibfunktion.

Gruß Tommy

Hallo,
ich hab hier noch eine andere Möglichkeit.
Mit #define kann ich den Quelltext auch schön übersichtlich halten und
ich kann zwischen ProtoOpen und ProtoClose hinein schreiben was ich gerade brauche.

#include "Streaming.h"

#define ProtoOpen File fProtokollF = SD.open(ProtoDateiName(), FILE_WRITE);if(fProtokollF){fProtokollF<<TimeString()
#define ProtoClose fProtokollF.flush();}

//meine längste Variante

ProtoOpen <<txtMin<<txtTA<<vTempAussen<<";"<<txtTK<<vTempKueche<<";"<<txtSollK<<vSollTempKueche<<";"
          <<txtRF<<txtWoO<<bStatRoWoO<<txtWoU<<bStatRoWoU<<txtReO<<bStatRoReO<<txtReU<<bStatRoReU<<txtLiO<<bStatRoLiO<<txtLiU
          <<bStatRoLiU<<txtFeWo<<bStatFeWo<<txtFeRe<<bStatFeRe<<txtFeLi<<bStatFeLi<<";"<<txtPump<<aHK_Pumpe<<";"<<txtLUX<<vLUX<<endl;
ProtoClose


//meine kürzeste Variante

ProtoOpen <<txtT1<<mRolWo<<endl; ProtoClose

Oh nee, Objektorientiert mit grauenhafter Macroprogrammierung.

Das geht irgendwann durch Seiteneffekte schief.

Abgesehen davon das das nicht lesbar ist.

(Nur meine Meinung)
Ulli

beeblebrox:
Oh nee, Objektorientiert mit grauenhafter Macroprogrammierung.

Das geht irgendwann durch Seiteneffekte schief.

Abgesehen davon das das nicht lesbar ist.

(Nur meine Meinung)
Ulli

Für den Programmablauf macht es keinen unterschied, ob ich jetzt den ganzen "Sing-Sing" jedes mal
hin tippe oder ob ich es einmal definiere und der Compiler macht das für mich.

ar182:
Für den Programmablauf macht es keinen unterschied, ob ich jetzt den ganzen "Sing-Sing" jedes mal
hin tippe oder ob ich es einmal definiere und der Compiler macht das für mich.

Das sind doch nicht deine einzigen Optionen

Ohne den Rest des Programms zu kennen lässt sich halt schwer sagen wie man das am besten macht. Und wie gesagt fängt das Problem wahrscheinlich schon eher an

Serenifly:
Und wie gesagt fängt das Problem wahrscheinlich schon eher an

Ich weiß nicht was du mit "Problem" meinst?
Lies doch noch mal ganz oben.
Und dann #2 , was meiner Meinung nach die richtige Antwort ist.

In meinen Sketch steht 29 mal

File fProtokollF = SD.open(ProtoDateiName(), FILE_WRITE);
if(fProtokollF){

fProtokollF<<"nur das hier ändert sich"<<endl;

fProtokollF.close();
}

Das sind 29 x 4 Zeilen die ich gernen in eine Funktion gepackt hätte,
damit es nur noch 1 x 4 Zeilen sind.

Es funktioniert auch so wie es ist.

Ich kann mir auch nicht vorstellen das hier einer über 1800 Zeilen Programmcode durchgeht.

mit einem #define Makro ginge es evtl., wobei man aufpassen müsste, dass es nicht zu

myFile << ( "Hallo " << name ) << endl;  //   so geht's nicht !!!

präprozessiert wird.

Aber das würde auch die eigentliche Aufgabe --keine Code-Vervielfachung-- nicht lösen, sondern nur verstecken.