Die Streaming Lib ändert nichts am Code gegenüber char Arrays! Die überlad wie gesagt nur den << Operator:
template<class T>
inline Print &operator <<(Print &stream, T arg)
{
stream.print(arg);
return stream;
}
Der Assembler Code sollte dabei identisch sein. Sie macht nur Ausgaben übersichtlicher und kompakter, da man nicht ständig Serial.print() schreiben muss und mehrere Ausgaben schön in einer Zeile schreiben kann.
z.B. das:
Serial << "Temp: " << temp << " Grad" << endl;
statt:
Serial.print("Temp: ");
Serial.print(temp);
Serial.println(" Grad");
Und wenn du das F() weglässt, landet der String wieder im RAM!
sprintf() hat den Vorteil, dass du Zahlen formatieren kannst. "%02d" sorgt dafür dass alle Ziffern zwei Zeichen breit sind. Das ist etwas du mit einer einfachen print() Anweisung nicht schaffst.
Was du da noch optimieren kannst, ist die _P Version und PSTR() zu verwenden:
snprintf_P(SD_Dateiname,sizeof(linebuf), PSTR("Y_%02d%02d%02d.txt"), Jahre, Monat, Tag);
Damit belegt der Format-String kein RAM mehr. Ähnlich wie das F() Makro für print()
Das bringt aber auch nicht viel wenn du generell schon an der Grenze bist.
Hier ist noch ein print() ohne F():
Serial.println("DS3231 I2C Busfehler");