Speicherplatzprobleme RAM (viele Strings)

Hallo,
Ich arbeite gerade an der Umsetzung für ein Telemetriedisplay und habe das Problem, dass der Speicherplatz langsam knapp wird. Ich habe immer maximal 21 Zeichen pro Zeile und pro Seite 8 Zeilen.

Der Code sieht so aus:

                    //line 0:                                  
                    snprintf((char *)&hott_txt_msg->text[0],21," LIPO CAL        <>");
                    //line 1:
                    snprintf((char *)&hott_txt_msg->text[1],21,"Volt: %i.%iv",(int) lipo.getVolt (), ((int) (lipo.getVolt ()*100)) % 100);
                    //line 2:
                    snprintf((char *)&hott_txt_msg->text[2],21,"Current: %i.%iA",(int) lipo.getCurrent(), ((int) (lipo.getCurrent()*100)) % 100);
                    //line 3:
                    snprintf((char *)&hott_txt_msg->text[3],21," Volt Off: %imV",(Volt_Offset));
                    //line 4:
                    snprintf((char *)&hott_txt_msg->text[4],21,"    SCALE: %i.%imV/V",(int) (Volt_SCALE/10) , (int) (Volt_SCALE % 10)); 
                    //line 5:
                    snprintf((char *)&hott_txt_msg->text[5],21," Cur. Off: %imV",(Current_Offset));
                    //line 6:
                    snprintf((char *)&hott_txt_msg->text[6],21,"    SCALE: %i.%imV/A",(int) Current_SCALE/10 , (int) (Current_SCALE % 10));
                    //line 7:
                    snprintf((char *)&hott_txt_msg->text[7],21,"Strom2HoTT  %d/3",page_settings); //Showing page number running down the screen to the right

Ich habe also immer einen Text und den Wert einer Variablen. Ich habe jetzt schon ein bißchen gelesen und bin dabei auf PROGMEM gestoßen. Damit soll es ja möglich sein Texte in den Flash zu schreiben. Wie mache ich das aber mit meine Variablen? Werden die bei der Ausgabe automatisch in Werte umgewandelt wenn ich den Text zurück lese aus dem Flash oder muss ich das alles einzeln zusammen setzen?
Oder gibt es noch eine bessere Idee wo ich Speicher in der Ausgabe sparen kann?

Hallo,

ob es mit "snprintf" auch so funktioniert, bin ich leider überfragt. Aber mit den "print"-Anweisungen kannst du es normalerweise mit dem "F-Makro" machen.

Beispiel:

Serial.print(F("Dies ist ein Text"));

Teste es einfach mal.

Wie du es mit Variablen lösen kannst, gibt es hier ein gutes Beispiel.

Das ganze mit print()/println() zu machen ist am besten. Wenn man eine angenehmere Syntax will nimmt man das:
http://arduiniana.org/libraries/streaming/
Damit hat man was wie Output Streams in C++ aussieht. Und F() geht genauso

Bei sprintf() gibt es noch sprintf_P() wo man mit PSTR() den Format-String ins Flash schreiben kann (sehr empfehlenswert). Und man kann mit %S statt %s einen Parameter String im Flash übergeben.

Aber printf() brauchst du auf dem Arduino eigentlich nur wenn du wirklich die Formatierungs-Funktionen verwendest. Also führende Nullen und ähnliches.

MBard:
Hallo,
Ich arbeite gerade an der Umsetzung für ein Telemetriedisplay und habe das Problem, dass der Speicherplatz langsam knapp wird. Ich habe immer maximal 21 Zeichen pro Zeile und pro Seite 8 Zeilen.

Wenn Du 8 Zeilen formatieren und ausgeben möchtest, ist es völliger Quatsch, dafür 8 verschiedene Zeilenpuffer-Variablen zu verwenden und damit massenhaft RAM-Speicher zu verschwenden.

Viel speicherparender wäre es, nur RAM für eine EINE EINZIGE Variable als Zeilenpuffer zu reservieren und den auszugebenden Inhalt immer in derselben Puffervariablen zu formatieren.

Also in einer Schleife mit 8 Schleifendurchläufen achtmal einen verschiedenen Inhalt im selben Zeilenpuffer formatieren und dann den Zeilenpuffer ausgeben.