Hallo, ich habe mir eine Steuerung für mein Zimmergewächshaus gebaut. Als Display verwende ich ein LCD Modul 20x4 über i²C. Das funktioniert soweit auch wie es soll. Eine Sache stört mich aber daran: Bei jedem loop werden die Angezeigten Zeilen aktualisiert, was zu einem kurzen flackern führt und etwas nervig ist. Die Uhrzeit ist seltsamerweise nicht davon betroffen, wohl aber die ebenfalls aus der RTC ausgelesene Temperatur. Den gesamten Code habe ich als Anhang beigefügt. Vielleicht hat jemand eine Hinweis, wie ich das Flackern weg bekomme. Gruß Andreas
Andreas M. schrieb: > Bei jedem loop werden die Angezeigten Zeilen aktualisiert, was zu einem > kurzen flackern führt und etwas nervig ist. Was soll es anderes machen, wenn du mit LCD.clear() das Display löscht. Die Uhrzeit schreibst du danach als erstes rein, so dass das Flackern da nicht so auffällt.
Warum passiert das dann aber nicht auch in der 1. Zeile bei der Uhrzeit?
Du kannst problemlos die Daten auf dem Display überschreiben ohne sie vorher zu löschen. Du musst nur sicherstellen, dass die Länge der Texte gleich bleibt (zur Not mit Leerzeichen füllen).
Andreas M. schrieb: > Warum passiert das dann aber nicht auch in der 1. Zeile bei der Uhrzeit? Die Uhrzeit schreibst du direkt nach dem Löschen wieder mit dem neuen Wert. Verzichte einfach auf das Löschen. Bastele dir mit sprintf() jeweils die ganze Zeile als String, also genau 20 Zeichen lang, zusammen und überschreibe damit den alten Inhalt, ohne zu löschen.
Das funktioniert! Ich habe die Strings angepaßt - auf gleiche Länge und das lcd.clear() heraus genommen. Vielen Dank! Gruß Andreas
Andreas M. schrieb: > Ich habe die Strings angepaßt - auf gleiche Länge und das lcd.clear() > heraus genommen. LCD sind nicht die schnellsten, da sollte man schon so wenig wie nur irgendwie möglich schreiben bzw. ändern:
1 | lcd.setCursor(0, 1); |
2 | lcd.print("S1: "); |
3 | lcd.setCursor(0, 2); |
4 | lcd.print("S2: "); |
5 | lcd.setCursor(0, 3); |
6 | lcd.print("Licht "); |
7 | lcd.setCursor(10, 3); |
8 | lcd.print("Heiz. "); |
Und dies nur einmal am Anfang schreiben, nachher nur neue Werte, natürlich mit geänderten .setCursor Werten vorher.
:
Bearbeitet durch User
Andreas M. schrieb: > Bei jedem loop werden die Angezeigten Zeilen aktualisiert, > was zu einem kurzen flackern führt und etwas nervig ist. Was ist jetzt so schwierig daran? Werte merken und nur schreiben, wenn die sich um einen Mindestwert verändert haben.
Es wird Zeit, zu klären, was mit Andreas M. schrieb: > ... was zu einem kurzen flackern führt ... gemeint ist. [ ] Die Werte schwanken immer hin- und her, so dass man sie nicht in Ruhe ablesen kann [ ] Die Anzeige verschindet vorübergehen und kurze Zeit später werden die Werte (evtl. geändert) wieder angezeigt, i.e. die Anzeige ist kurz unterbrochen.
Marc V. schrieb: > Und dies nur einmal am Anfang schreiben, nachher nur neue Werte, > natürlich mit geänderten .setCursor Werten vorher. Danke für den Tipp. Das habe ich gleich umgesetzt. Andreas
Manche Displays (meine) werden blass, wenn man sie andauernd aktualisiert (auch ohne clear). Besser sicherstellen, dass zwischen den Aktualisierungen einige Millisekunden Pause sind.
Wolfgang schrieb: > [ ] Die Werte schwanken immer hin- und her, so dass man sie nicht in > Ruhe ablesen kann > > [ ] Die Anzeige verschindet vorübergehen und kurze Zeit später werden > die Werte (evtl. geändert) wieder angezeigt, i.e. die Anzeige ist kurz > unterbrochen. Stimmt, für den Außenstehenden, der Infos sucht ... Die Anzeige verschindet vorübergehen und kurze Zeit später werden die Werte (ggf. geändert) wieder angezeigt. Die Anzeige ist kurz unterbrochen. Andreas
:
Bearbeitet durch User
Stefan U. schrieb: > Manche Displays (meine) werden blass, wenn man sie andauernd > aktualisiert (auch ohne clear). Besser sicherstellen, dass zwischen den > Aktualisierungen einige Millisekunden Pause sind. Mir ist nicht klar, warum jemand für ein so triviales Problem externe Hilfe benötigt! Ich hole einen Meßwert und schreibe ihn in "LetzterWert". Beim nächsten Durchlauf kommt ein Vergleich zwischen "Wert" und "LetzterWert". Wenn ungleich (oder größer Hysterese), wird "LetzterWert" aktualisiert und "LCDFlag = LCDFlag+1". Das mache ich in allen Meßroutinen, dann kommt irgendwann LCD-Schreiben. Nur wenn "LCDFlag >0" wird geschrieben und "LCDFlag" auf Null gesetzt. Dafür brauche ich keinen Timer und schreibe halt nur, wenn es wirklich Sinn macht.
Stefan U. schrieb: > Besser sicherstellen, dass zwischen den > Aktualisierungen einige Millisekunden Pause sind. Ich erkenne im Display Uhrzeit/Datum, die sich alle 60000 Millisekunden, ein paar Temperaturwerte, die auf mehr oder weniger trägen Temperatursensoren beruhen, so das eine Aktualisierung alle 10000 Millisekunden angemessen scheint und die Schaltzustände, die man bei Änderung aktualisieren könnte. Die Pause darf also mindestens im Bereich 1000 Millisekunden liegen ;-)
Andreas M. schrieb: > Bei jedem loop werden die Angezeigten Zeilen aktualisiert wieso das denn? mehr als 4 Werte pro Sekunde kann man kaum lesen, also millis befragen und bei +250ms LCD neu schreiben. Ich hatte es mir leicht gemacht und alles was sich ändert wann wo egal in ein globales Schattenram geschrieben, also du schreibst in ein Array char lcd_txt[4][21] deine 4x20 Zeichen mit /0 am ZeilenEnde und alle 250ms kopierst du das ins LCD, fertig.
Nach 9 Monaten interessiert sich keiner mehr für deinen Beitrag (der übrigens keine neue Erkenntnis bringt) zu dem Thema. Der Drops ist längst gelutscht.
Stefan U. schrieb: > Nach 9 Monaten interessiert sich keiner mehr für deinen Beitrag (der > übrigens keine neue Erkenntnis bringt) zu dem Thema. Der Drops ist > längst gelutscht. nicht meckern ohne Wissen: Beitrag "Re: Projekt: Das Tomaten-Aufzucht-Häuschen mit Web-Interface"
Ist trotzdem interessant, auch wenn ich es inzwischen anders gelöst habe. Danke und Gruß Andreas
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.