Zur Feinjustierung meiner Steuerung für Heizung und Rollläden
möchte ich den Programmablauf auf der SD protokollieren.
Das funktioniert auch so wie mir das vorstelle.
Leider verbrauchen meine Texte enorm viel dynamischen Speichers.
Dabei ist es egal ob ich global oder in der Funktion meinen Text definiere.
Hier ein kleiner Ausschnitt, wie ich es jetzt gelöst habe. (Zeile 3)
if(vTempAussen < paTGrenzeK || vTempAussKLog == true){ //ist die Außentemperatur unter 5°C oder die Hysterese noch nicht erreicht
if(!bSDPrint[0]){ //wurde dieser Text schon gespeichert
String sLine = "die Außentemperatur ist unter 5°C;Aussentemp. = " + String(vTempAussen); writeProtokollToSD(sLine);
bSDPrint[0] = true; //als gespeichert markieren
}
Gibt es eine andere Möglichkeit die zum selben Ergebnis führt aber den dynamischen Speicher schont.
Wenn ich mein Beispiel Zeile 3 auskommentiere habe ich 58 Bytes mehr zur Verfügung.
Flexibilität nach allen möglichen Richtungen und Speicher sparen stehen sich oft gegenüber. Du musst da einen Mittelweg finden.
Was brauchst Du soviel Text auf der SD?
Wenn Du einen festen Aufbau (z.B. CSV) wählst, dann brauchst Du außer den Spaltenüberschriften überhaupt keinen festen Text und kannst es in einer Tabellenkalkulation Deiner Wahl auswerten..
Es gibt nur wenige Bibliotheken bei denen man einen String wirklich an einem Stück senden muss. Ich weiß nicht wieso Anfänger immer auf die Idee kommen alles vor einer Ausgabe verknüpfen zu müssen
Und sowas macht man auch nicht:
void writeProtokollToSD(String line)
Schau dir mal Referenzen an wenn du Objekte an eine Funktion übergeben willst.
Aber vernünftiger ist du machst die Ausgabe direkt in der Funktion. Da einen String zu basteln ist überflüssig. Egal ob Objekte oder char Arrays
Du kannst auch das machen:
void printTime(Print& p)
{
p.print(...);
}
Da kannst du dann ein File oder ein Serial Objekt übergeben um den Text auf verschiedenen Dingen auszugeben
Wenn man eine schönere und kürzere Schreibweise möchte gibt es wie gesagt das: http://arduiniana.org/libraries/streaming/
Das überläd den << Operator, wodurch die Ausgabe dann wie Standard C++ aussieht und man nicht jedesmal file.print() schreiben muss
Die Streaming-Lib wird viel zu wenig gewürdigt. Ich übersehe sie auch leider laufend.
Ich habe gerade mit der SD-Lib das Ganze probiert. Funktioniert problemlos.