Strings und Sketch | Programmspeicher

Guten Tag,

zu meiner Frage:
Ich habe mir ein 3,5 Zoll Display für das Arduino gekauft. So weit läuft alles, es funktioniert auch.

Ich habe nur extrem viele Strings zum ausgeben. Habe nun alle Strings in den PROGMEM gespeichert und auch zum Abrufen der Strings eine Funktion geschrieben:

void text_a(unsigned int i, unsigned int durchlauf, unsigned int b){
char buffer[54];
unsigned int a=0;
a = b;
for (i; i < durchlauf; i++){
  strcpy_P(buffer, (char*)pgm_read_word(&(p[i]))); // Casts und Dereferenzierung des Speichers
  my_lcd.Print_String(buffer, 0, a=a+12); 
}
}

Nun zu meiner eigentlichen Frage:
Die Strings die im PROGMEM gespeichert sind, zählen die zum Sketch oder nicht?

Der Sketch verwendet 46284 Bytes (143%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
text section exceeds available space in board. Globale Variablen verwenden 196 Bytes (9%) des dynamischen Speichers, 1852 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Ich will nämlich auf einen AtMega verzichten und mit dem Arduino Uno das Programm zum Laufen bringen. Weiß aber nicht mehr was ich noch kürzen soll.

Vielleicht hat einer Zeit, kurz den Code anzusehen und mir sagen was oder ob ich noch etwas kürzen kann oder eine andere Methode möglich ist, die Strings zu speichern bzw. abzurufen um den Sketch zu verkleinern.

Lg Owaroana

programm.ino (12.8 KB)

switch_font.c (48.5 KB)

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Ja, sie zählen zum Programmspeicherplatz.

Gruß Tommy

Das mit den Code-Tags hat noch nicht funktioniert.

Und wieso willst du auf einen Atmega verzichten ?
Der Uno nutzt den Atmega328, was willst du dann verwenden ?

vieleicht die ganzen duplikate entfernen?
const char berg19[] PROGMEM = "Lebt wohl ihr Berge, sonnige Hoehen";
const char berg20[] PROGMEM = "Bergkameraden sind treu, ja treu";
const char berg21[] PROGMEM = "Lebt wohl ihr Berge, sonnige Hoehen";
const char berg22[] PROGMEM = "Bergkameraden sind treu";

const char fuhr4[] PROGMEM = "Nimm d'Peitsch'n in die Hond und schrei hue!";
const char fuhr6[] PROGMEM = "Nimm d'Peitsch'n in die Hond und schrei hue!";
const char fuhr8[] PROGMEM = "Jo owa i schrei hue, aber i steiho,";
const char fuhr9[] PROGMEM = "Jo owa i schrei hue, aber i steiho,";
const char fuhr13[] PROGMEM = "Sie woscht mir beim Bierwog'n die Radln,";
const char fuhr15[] PROGMEM = "Sie woscht mir beim Bierwog'n die Radln,";

andererseits, was spricht gegen den MEGA?

Eigentlich sind es keine Duplikate :slight_smile:

Es soll einen Text ergeben, da ich ja jede Zeile einzeln ausgeben muss ...

Weil der Mega ein bisschen größer ist und ich Platz sparen muss ;=)

*edit:
Stimmt das sind Duplikate xD
Danke ;=)

Du könntest die Liedtexte auch zeilenweise in Dateien auf einer SD speichern und von dort aus einlesen.

Gruß Tommy

Oder in einem externen EEPROM oder einem externen FRAM.

oder besorg dir einen Arduino Mega Pro ... ist kleiner als ein UNO.

und ja - es sind Duplikate. statt berg21 könntest ja auch einfach berg19 ausgeben, ein if, ein switch case was auch immer - löst dir das sicher ...

Nimm d'Peitsch'n in die Hond und schrei hue!

45 Zeichen. Da geht sicher was.

so, jetzt nehm' ich die Peitsche und schrei: Mach was :wink:

Kann ich die Textzeilen von der SD-Karte dann in eine String konvertieren?
Würde dann natürlich weniger Speicher sein, stimmt :slight_smile:

Ungenau ausgedrückt ... einen AtMega2560 :wink:

owaroana:
Weil der Mega ein bisschen größer ist und ich Platz sparen muss ;=)

Ok, du meinst den Mega (Atmega2560)als genauere Chipbezeichnung.

owaroana:
Kann ich die Textzeilen von der SD-Karte dann in eine String konvertieren?

Ja, kannst Du in char-Arrays einlesen.
Zeichenweise einlesen bis zum '\n', das durch '\0' ersetzen, Zeichen <0x20 (Leerzeichen) ignorieren und schon hast Du Deine Zeile.

Gruß Tommy

Dann müsste ich wenn ich den bestimmten Text brauche, die SD-Karte auslesen? Und nicht am Anfang alles auslesen und abspeichern?

Denn das würde den Speicher wieder überlasten oder?

owaroana:
Die Strings die im PROGMEM gespeichert sind, zählen die zum Sketch oder nicht?

Natürlich. Irgendwo müssen sie gespeichert sein. PROGMEM verhindert dass sie alle automatisch ins RAM kopiert werden

owaroana:
Dann müsste ich wenn ich den bestimmten Text brauche, die SD-Karte auslesen? Und nicht am Anfang alles auslesen und abspeichern?

Denn das würde den Speicher wieder überlasten oder?

Ja, natürlich. Für jedes Lied eine eigene Datei und dann immer eine Zeile einlesen und anzeigen.

Gruß Tommy

Tommy56:
Ja, natürlich. Für jedes Lied eine eigene Datei und dann immer eine Zeile einlesen und anzeigen.

Gruß Tommy

Vielen Dank Tommy :wink:
Auch an die anderen Danke! :slight_smile: