Arduino LCD hängt sich auf

Hallo zusammen,

Ich habe eine RS485 Kommunikation zwischen zwei Arduino Uno's, die Kommunikation Funktionierte bis anhin Perfekt und ohne Unterbrüche.

Nun wollte ich als "nice to have" ein 20x4 LCD Screen an den Empfänger hängen.

Nun habe ich das Problem, das sich der Arduino manchmal aufhängt (Displaybeleuchtung löscht aus, werte werden nicht mehr verändert, sind aber noch sichtbar)

Das Display muss schnell viele Informationen Anzeigen was ich wie Folgt löse:

 lcd.setCursor(0,1);
 lcd.print(lcd_not_aus_1);
 lcd.print("  ");
 lcd.print(lcd_not_aus_2);
 lcd.print("  ");
 lcd.print(lcd_ein);
 lcd.print("  ");
 lcd.print(lcd_aus);
 lcd.print(" ");
 lcd.print(lcd_rechts);
 lcd.print(" ");
 lcd.print(lcd_links);
 lcd.print(" ");
 lcd.print(lcd_time);
 lcd.print("  ");
 lcd.print(lcd_fast);
 lcd.setCursor(0,3);
 lcd.print(lcd_slow);
 lcd.print("  ");
 lcd.print(lcd_alarm);
 lcd.print(" ");
 lcd.print(lcd_befehl);
 lcd.print(" ");
 lcd.print(lcd_hacken);

ich habe auch schon die Leerzeichne weggelassen und die Adresse direckt mit "lcd.setCursor(0,3);" angewählt.

Nun so mit den Leerzeichen hängt sich der Arduino nicht mehr so oft auf aber kommt immernoch vor.

Die Variablen bestehen aus Zahlen von 1-16 als integer definiert.
Gruss Schnibli

versuch es mal mit dem F Makro

 lcd.setCursor(0,1);
 lcd.print(lcd_not_aus_1);
 lcd.print(F("  "));
 lcd.print(lcd_not_aus_2);
 lcd.print(F("  "));
 lcd.print(lcd_ein);
 lcd.print(F("  "));
 lcd.print(lcd_aus);
 lcd.print(F(" "));
 lcd.print(lcd_rechts);
 lcd.print(F(" "));
 lcd.print(lcd_links);
 lcd.print(F(" "));
 lcd.print(lcd_time);
 lcd.print(F("  "));
 lcd.print(lcd_fast);
 lcd.setCursor(0,3);
 lcd.print(lcd_slow);
 lcd.print(F("  "));
 lcd.print(lcd_alarm);
 lcd.print(F(" "));
 lcd.print(lcd_befehl);
 lcd.print(F(" "));
 lcd.print(lcd_hacken);

Ich behaupte mal, das ist viel zu schnell
hintereinander. Wie hast du das Display angeschlossen? I2C ?
Wie lang sind die Leitungen? was könnte in der
Nähe elektromagnetisch stören ?

Stefan

Wie Stefan schon geschrieben hat, liegt das Problem vermutlich an den Anschlüssen des LCD.
Leitungen zu lang oder durch externen Einfluss gestört.

Warum postest du nicht den kompletten Sketch. Aus Fragmenten ist immer schlecht ein Fehler zu erkennen.

Und dann noch eine Schaltung, damit wir überprüfen können, ob alles richtig angeschlossen ist.

Das Display ist über I2C angeschlossen, es sind die langen Standart Jumper-Kabel (ca. 20cm)
Können zu lange kabel dazu führen dass sich der arduino aufhängt?

Gruss Schnibli

Die Länge von 20 cm ist noch unkritisch, wenn du Pullup-Widerstände (4,7 k gegen +5Volt) verbaut hast und keine großen Störquellen in der Nähe hast.
Wackelkontakte am Steckkontakt sind auch sehr kritisch.

Hallo,
für mich sieht das aus, als wenn es einfach zum Speicher/ZeilenÜberlauf im Display kommt.
Es wird doch alles hintereinander geschrieben.
Gruß und Spaß
Andreas

ardubu:
versuch es mal mit dem F Makro

Empfehle ich auch. Ohne das F-Makro werden die Textinhalte ins Ram kopiert. Dort kommt es bei umfangreichen Projekten leicht zu Speicherüberläufen, die zu seltsamen, schlecht nachvollziehbaren Abstürzen und Fehlfunktionen führen. Leider fehlt der komplette Sketch um mehr sagen zu können.
Was wird nach dem Compilieren des Sketch als Speicherauslastung angezeigt?

Ihr habt recht, es hat mit dem Überlauft zu tun.

Könnt ihr mir erklären wie das mit dem F-Makro Funktioniert :slight_smile:

Hab es mal Probiert jedoch krieg ich bei:

 lcd.print(F(lcd_not_aus_1))//<---- hier;
 lcd.print(F("  "));

einen Fehler :s
array must be initialized with a brace-enclosed initializer :s

Deklaration:

int lcd_not_aus_1=0;
int lcd_not_aus_2=0;
int lcd_kontaktliste=0;
int lcd_ueberlast=0;
int lcd_schlaffseil=0;
int lcd_links=0;
int lcd_kontaktliste_oben=0;
int lcd_schnell_bne=0;
int lcd_schnell_last=0;
int lcd_alarm =0;
int lcd_hacken=0;
int lcd_befehl = 0;
int lcd_sonderbetrieb=0;
int lcd_vakum =0;
int lcd_button_p =0;

Du kannst nur Strings ("Test-String") die du mit print ausgeben willst, in das F-Makro setzen, keine Variablen.

Hmm kann ich sonst noch irgendwie den Arduino entlasten mit dem Display?

schnibli:
Hmm kann ich sonst noch irgendwie den Arduino entlasten mit dem Display?

Was soll "Hmm" heissen, hast es nur bei den Leerzeichen mit F probiert oder nicht?

lcd.setCursor(0,1);
 lcd.print(lcd_not_aus_1);
 lcd.print(F("  "));              //<nur hier
 lcd.print(lcd_not_aus_2);
 lcd.print(F("  "));              //<und hier
 ...

MfG
Andi

schnibli:
Hmm kann ich sonst noch irgendwie den Arduino entlasten mit dem Display?

Bestimmt. Du zeigst ja nur den Tropfen, der das Fass bzw den Speicher zum überlaufen bringt. Außer F-Macro kann man da nicht viel machen.
Im restlichen Programm sind bestimmt auch noch einige Optimierungen möglich. Da du es geheim hältst, können wir dir da keine Hinweise geben.

Und auch ist noch interessant, wie hoch dein Speicherverbrauch (Ram) nach der Kompilierung ist.
Daraus kann man auch erkennen, ob das schon an der Grenze ist.

Das F-Makro kannst du sicher auch bei der RS485-Übertragung anwenden.

Frage:
Wie hast du es herausgefunden, dass es tatsächlich am Speicherüberlauf liegt ?