Problemchen mit der library "LiquidCrystal"

Hallo,

zur Verwendung von LC-Displays hat sich die "LiquidCrystal" Bibliothek bewährt, die eine breite Palette an LCDs mit Standard-Kontrollern abdeckt. Es muss eigentlich nur mittels "lcd.begin(x,y)" festgelegt werden, wieviele Spalten und Zeilen das Display aufweist, Beispiel lcd.begin(16,2) oder lcd.begin(20,4) usw.

Bei meinen ersten Versuchen mit einem Modell "TC1604a" zeigte sich eine kleine Schwäche bei der Position des Cursors in der 3. und 4. Reihe: die erste, linke Position war nicht dort, sondern 4 Zeichen versetzt...
Ich habe das Problem, das wohl auch schon anderen aufgefallen war, mit einem Eingriff in der "LiquidCrystal.cpp" library behoben (Zeile 173ff):

void LiquidCrystal::setCursor(uint8_t col, uint8_t row)
{
  int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };			// Änderung:  0x14 -> 0x10, 0x54 -> 0x50
  if ( row >= _numlines ) {
    row = _numlines-1;    // we count rows starting w/0
  }

Die Kommentierung, damit ich auch später weiß, was wo geändert ist.

So weit, so gut.

Beim nächsten Projekt kam ein JHD629-204A Display zum Einsatz, 4 Zeilen mit 20 Zeichen, Temperatur-, Feuchtewerte, zwei Sensoren und Meldungen brauchen halt Platz.

Es zeigte sich, dass wieder die Position des Cursors in der 3. und 4. Zeile falsch war;
ein erneuter Eingriff in die "LiquidCrystal.cpp" behob das Problem.

Nun werkel ich mit dem ersten Display, dem TC1604a herum, bzw. mit der mobilen Anzeigebox mit Anschlüssen für diverse Module, ob DHT zum Testen oder RF24L01 Funkmodule usw.
zeitgleich pflege ich die Steuerung der Box mit den Temp.- und Feuchtesensoren.
Auch hier kommt die Standard "LiquidCrystal" Library zum Einsatz und
ich stehe vor dem Problem, jedes Mal nachdenken zu müssen, ob sie "gepatcht" werden muss oder noch passt.

Kann ich zwei Versionen der "LiquidCrystal" bereit halten, wenn ja, wie, wo?
Mit der Library Verwaltung der aktuellen IDE 1.0.6 habe ich schon einiges an Zeit verbraten ...

Für Tipps wäre ich sehr verbunden

Manfred

Ich habe mich mit diesen "Eigenheiten" halt arrangiert.
Möglichkeit 1: Zeile 1 das 21. Zeichen ist dann das 1. Zeichen in Zeile 3 (analog 2 & 4)
Möglichkeit 2: für das 1. Zeichen in Zeile 3 oder 4 dann halt Pos. -3 oder -4 (genauen Wert habe ich vergessen). Ist zwar nicht besonders elegant, aber es funktioniert :wink:

Es spricht doch nichts dagegen, die angepassten Libs separat abzulegen und dann je nach Display einzubinden.

Klaus_ww:
Es spricht doch nichts dagegen, die angepassten Libs separat abzulegen und dann je nach Display einzubinden.

ja, aber dann eben mit unterschiedlichen Namen.

Die originale “LiquidCrystal” liegt m.W. unter “/Arduino/libraries” also im Programmverzeichnis,
importierte Libs dagegen im “(Sketchordner)/libraries”, bei mir getrennte Verzeichnisse.
Eine Art Library wird mittel #include “libxy.h” eingebunden, die andere Art mittels #include <libxy.h>.
Dies sehe ich als eine Möglichkeit, gleichlautende, aber abgeänderte Libraries einzubinden, was aber eine erhebliche Konzentration erfordert.

Manfred

Du könntest du Library so umschreiben, dass du im Konstruktor einen Parameter übergibst der verschiedene Konfigurationen auswählt.

ManfredH:
ja, aber dann eben mit unterschiedlichen Namen.
....
Dies sehe ich als eine Möglichkeit, gleichlautende, aber abgeänderte Libraries einzubinden, was aber eine erhebliche Konzentration erfordert.

Manfred

Naja, wenn Du >5 unterschiedliche LCD-Typen im ständigen Wechsel hast braucht das vielleicht etwas mehr Aufmerksamkeit. Ansonsten halte ich das für die einfachste Variante.

Sereniflys Ansatz ist natürlich besser, aber da muss man wieder wissen was man tut (ich fummel in Libs nicht rum, außer eben auch der Adressraumanpassung).

Klaus_ww:
.... (ich fummel in Libs nicht rum, außer eben auch der Adressraumanpassung).

ja, so sehe ich es an sich auch :wink:
Derzeit sind es nur die beiden erwähnten LCDs und wenn ich die eine Steuerung endgültig vom Tisch habe,
ist das Display damit auch aus den Augen ...

Danke für die Vorschläge

Manfred

Serenifly:
Du könntest du Library so umschreiben, dass du im Konstruktor einen Parameter übergibst der verschiedene Konfigurationen auswählt.

Ob Du wohl so nett wärst, dies so zu beschreiben, dass ich als IDE-Nutzer das in meinem Projekt nutzen könnte? Ich probiere noch, welche Library-Variante die besseren Ergebnisse liefert.

Hast du in generell schon mal was mit Klassen und Konstruktoren gemacht? Auch in einer anderen Sprache. Wenn nicht lass es lieber sein.

Es ist nicht wirklich kompliziert, aber du solltest wissen was du machst.

Objekte und Klassen haben mich bisher immer abgeschreckt, dann lasse ich auch die Finger von Konstruktoren, behalte diese Möglichkeit aber im Hinterkopf. Bei der Nutzung einer Bibliothek oder eines Betriebssystems beschleicht mich immer das Gefühl, ich weiß nicht, was ich tue. Aber das ist ein anderes Thema.
Danke trotzdem!