Hallo Leute =),
bin neu hier im Forum, und habe folgendes Problem.
An meinem Arduino ist ein 16x2 LCD Display angeschlossen, und ich habe eine Funktion, mit der ich die Ausgabe realisiert hab (zeige_an).
Das Arduino soll aus 3 Blöcken zu je 16 verschiedenen Texten einen raussuchen und Anzeigen.
Dabei wird jeweils 1 Block hochgezählt, und dann einer von 16 Texten zufällig ausgewählt - das funktioniert auch alles soweit:
void loop() {
// Einen Block weiter
k++;
if(k>2) { k = 0; }
// Dann ein Zufälliger Text
zaehler = random(16);
// Jetzt kommt die auswahl
if(k == 0) {
switch(zaehler) {
case 0: anzeigestring = "Text 1";break;
...
case 15:anzeigestring = "Text 16";break;
};
}
if(k == 1) {
switch(zaehler) {
case 0:anzeigestring = "Text 17";break;
...
case 15:anzeigestring = "Text 32";break;
};
} /*
if(k == 2) {
switch(zaehler) {
case 0:anzeigestring = "Text 33";break;
...
case 15:anzeigestring = "Text 48";break;
};
}*/
zeige_an();
delay(2000);
}
So nun das eigentliche Problem,
Sobald ich den "dritten Block" ( also if(k==2) { ...} ) mit rein nehme, passiert entweder gar nichts mehr (Display bleibt blau), Oder es kommt nur ein Random Text, danach schreibt er sinnlos Buchstaben.
Wenn ich aber nur die ersten beiden Blöcke abfrage (also k dann nur bis 1 gehen lasse, und den dritten abfrage-Block auskommentiere) funktioniert alles so wie es soll, und er zeigt abwechselnd einen zufälligen Text vom ersten oder zweiten Block an.
Der Sketch ist lediglich 10.000 Bytes groß (von 32.000), also kann es doch eigentlich nicht an der Länge des Codes liegen?
Hängt das irgendwie mit dem begrenzten Speicher des Mikrocontrollers zusammen?
Hallo,
in deinem Sketch verwendest du viele Strings, welche sehr/zu viel SRAM brauchen. Wenn du diese Strings im Flash Speicher unterbringst sollte es funktionieren.
Es gibt eine library, mit der das Speichern im Flash ganz einfach ist.
... und Code ohne Variablendefinition ist auch nur ein Rate-Schnipsel ...
Ich rate mal, anzeigestring ist leider kein char*. (mit PROGMEM sollte es dann ein prog_char* sein ... )
Leider gibt es nur die Methode
print(const __FlashStringHelper *);
um direkt aus dem Flash etwas auszugeben, da musst du dann in deinem weggeschnipselten ** **zeige_an()** **
noch ein bisschen feilen.
Leider zeigt die IDE nur die Größe des Flash-Speichers an, viel kritischer ist in der Regel aber der RAM. Und die ändert sich auch noch, vor allem wenn du String Objekte verwendet haben solltest.
ja, die Variablen sind Tatsächlich Strings, weil es bei Strings einfacher ist Länge auszulesen und einzelne Buchstaben an Position x;
Der fehlende Code:
// String zur Anzeige der einzelnen Buchstaben
String text = "";
// String zur weitergabe an die Zeilen-Umbruchs-Funktion
String anzeigestring = "";
// String mit den Komplimenten
// Funktion zum "tippen" der einzelnen Buchstaben
void tipp(int row){
Serial.print("tippe...");
int len = text.length() ;
for(int i = 0; i<len; i++) {
lcd.setCursor(i,row);
lcd.print(text.charAt(i));
delay(70);
}
}
Die funktion zeige_an() ist etwas lang, weil sie den Zeilenumbruch macht, der jetzt erstmal nichts mit dem Problem zu tun hat -> im Grunde ruft sie einfach nur die Funktion "tipp" auf, benötigt aber auch, die funktionen string.charAt(x) und String.length .
Also entweder brauche ich eine Möglichkeit, Strings vernüntig im flash zu speichern;
oder funktionen der Strings (charAt und length) für char*
-> Idee:
Wäre es nicht möglich die Texte in char* Feldern auf dem Flash zu speichern mittels Progmem und dann dynamisch (also während der Schleife) einfach an einen String zu übergeben? und mit diesem String kann ich dann all die tollen sachen machen, die mit Strings so möglich sind?
Lass Strings auf dem Arduino bleiben, dann ersparst Du dir einen Haufen Ärger. Mit C-Strings kannst Du alles genau so machen. Vielleicht nicht ganz so elegant, aber dafür funktioniert es.
char str[21]; // Char-Array für 20 Zeichen (+ abschließendem Null-Byte) definieren
char *str2 = "Ein Test"; // Zeiger auf Char definieren und auf String setzen
strcpy(str, str2); // Text kopieren
int len = strlen(str); // Stringlänge ermitteln
int len2 = strlen(str2);
char zeichen = str[4]; // Das Zeichen an der fünften Stelle auslesen
char zeichen2 = str2[4];
Wo ist das Problem und was ist da mit Strings einfacher?