Hallo zusammen, ich habe gerade ein Projekt bei dem ich mit dem Arduino, DHT11 Sensor und dem LCD I2C Display eine kleines Temperatur und Luftfeuchtigkeit Messgerät bauen will. Bei dem Code für den Arduino hab ich jetzt aber ein Problem. Hier sagt er mir einen Fehler (siehe Anhang) beim setzen der Adresse des LCD. Hätte jemand Lösungsvorschläge oder schon selber Erfahrung gehabt ? Danke schon mal im voraus für die Hilfe!
Werfe mal einen Blick in die Dokumentation der Bibliothek. Wenn es keine online gibt, dann steht sie wohl direkt im Quelltext. Ich habe gerade mal kurz gegoogelt, aber dabei nur Versionen gefunden, deren Konstruktor viel weniger Parameter hat. Für konkrete Hilfe wäre es gut, exakt zu wissen, welche Bibliothek du verwendest.
Der Bezeichner „positive“ ist nicht deklariert. Evtl. wird ein String erwartet. Probier mal
1 | "positive" |
statt
1 | positive |
zu schreiben.
was soll blpol sein? Backlight Polarity? Schau doch einfach schnell in den Funktionsheader welcher Datentyp erwartet wird o.O
Ihr habt so Ahnung. Der Aufruf ist Mist. include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display 0x27 <- i2c- Adresse 20 <- Anzahl der Zeichen 4 <- Anzahl der Zeilen Kleiner Hinweis: Von beim Aufruf so viele Pins stehen, ist es ein DIREKT-Anschluß kein i2c. Und wenn der TO auch noch die richtigen PINS angeschlossen hat, läuft das Teil. Mit folgenden Code lcd.init(); // initialize the lcd lcd.backlight(); // Init die Beleuchtung lcd.clear(); <- Display löschen lcd.setCursor(0,1); // setz Cursor in Zeile 0 Spalte 1 lcd.print("Guckguck in bin da"); Schreibt in die Zeile. Anleitungen gibt es im Netz mehr als ich Kohle habe.
Normalerweise stehen in der .h Datei die Prototypen der Konstruktoren mit allen Parametern und deren Typen. Warum kann man also nicht einfach LiquidCrystal_I2C.h öffnen und dort nachschauen, was erwartet wird. Das sollte doch fast schon mit einem Doppelklick auf die Datei gehen?
nach dem Verkabeln und vor dem eigentlichen Code, kann es nicht schaden, mal einen I2C Scanner auf den Arduino zu flashen und zu gucken, ob der I2C Scanner das Display unter der vermuteten Adresse findet. Findet er nichts, die beiden I2C Busleitungen mal tauschen. Hilft das nicht, checken, ob die Terminierungswiderstände (meist 4,7K) vorhanden sind, bzw. ob es hilft, die zu verkleinern. Wird ein Device gefunden, dann steht dessen Adresse im seriellen Monitor. Auch da kann es mitunter Überraschungen geben, wenn der Chinaproduzent statt des PCF8574 plötzlich einen PCF8574A verbaut hat (anderer Adressraum)
PittyJ schrieb: > Normalerweise stehen in der .h Datei die Prototypen der Konstruktoren > mit allen Parametern und deren Typen. > > Warum kann man also nicht einfach > LiquidCrystal_I2C.h > öffnen und dort nachschauen, was erwartet wird. > Das sollte doch fast schon mit einem Doppelklick auf die Datei gehen? Nochmal. Das Problem ist der Code selbst. include <LiquidCrystal_I2C.h> <- setzt eine Verbindung mit 2 !!! Leitungen + Strom voraus. Diese 2 Leitungen MÜSSEN an den i2c-Port angeklemmt werden. Wo der ist, sagt ein das Pin-Layout. include <LiquidCrystal.h> <- setze eine voll-Belegte Kabel-Anschluss voraus. Da der NICHT vorgeben ist, müssen die Pins einzeln angeben werden. Wenn man sich den Code genau ansieht erkennt man das 2 Sachen vermischt wurden. Ein i2c-Aufruf mit einer Init-Befehl für einen Direkt-Anschluss. Da muss ich keine Libs analysieren um zu merken das ich Äpfel mit Birnen mische. Das gibt nämlich nur gemischten Salat. Das ist Arduino für Anfänger. Lade die IDE runter, benutze die Beispiele und gut ist. Ein LCD mit den üblichen China-Adapter auf i2c , der nicht gejumpertes ist,liegt fast immer auf 0x27. Aber selbst dazu gibt es ein Beispiel (i2c-Scanner) in der IDE. Unter der Bedingung das sie korrekt installiert ist. !!! ;)
Schlaumaier schrieb: > Das Problem ist der Code selbst. Nein, das Problem ist der Arduino IDE Murks bei den Libraries, man kann keine Version spezifizieren. Die Libs sind global installiert, und zwei mit gleichem Namen können kollidieren. PlattformIO macht das besser, schon ein Grund das zu benutzen. Und genau das passiert hier: der Code und die Lib passen nicht zusammen. Der gezeigte Code gehört wahrscheinlich zur: https://github.com/fmalpartida/New-LiquidCrystal/blob/master/LiquidCrystal_I2C.h#L91-L93 Allerdings muss 'positive' da gross geschrieben werden, das steckt da in einem enum. Und da wird auch der Extender verwendet, aber es kann noch die Zuordnung der Extender Pins zum Display angegeben werden. Diese Library ist vermutlich nicht installiert und es wird von ArduinoIDE mitgelieferte verwendet, da sieht der Konstruktor eben anders aus. Schlaumaier schrieb: > Da muss ich keine Libs analysieren um zu merken das ich Äpfel mit Birnen > mische. Das gibt nämlich nur gemischten Salat. das ergibt deine Oberflächlichkeit und ständig falschen Hinweise.
:
Bearbeitet durch User
J. S. schrieb: > das ergibt deine Oberflächlichkeit und ständig falschen Hinweise. Damit auch du es lernst. DAS ist die Anleitung für i2c. https://funduino.de/nr-19-i%c2%b2c-display Und das die Anleitung für DIREKT-VERBINDUNG https://starthardware.org/lcd/ #include <LiquidCrystal.h> ' <- NIX _i2c an der Libs. !!!!!!! Nun wird das LiquidCrystal-Objekt mit dem Namen LCD angelegt. Die digitalen Output-Pins, die man verwendet hat, werden als Parameter angegeben: const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); Und nun schau dir den Code an. Er ruft die i2c auf, und als INI den Befehl für NO - i2c.
Nachtrag: wenn er 4 Zeichen wegnimmt, sollte sein Code laufen. Die zeichen sind : _i2c Wobei sich die Frage stellt, ob er so viel Ports verschwendet hat. ;)
Schlaumaier schrieb: > Damit auch du es lernst. DAS ist die Anleitung für i2c. Es gibt nicht 'die' Anleitung, Code und Lib müssen zusammen passen. Ich habe doch eine Lib mit gleichem Namen verlinkt, was verstehst du daran nicht? Und auch beim Extender müssen die IO nicht immer gleich angeordnet sein, das berücksichtigt die Lib die ich verlinkt habe. Und die verwendet auch den Extender. Deine Anahme das viele Pinangaben automtisch einen Parallelport mein ist falsch. Die Chinesen kopieren Kopien von Kopien, da liegt man mit Anahmen von Standards schnell falsch. Bei den beliebten SSD1306 OLED habe ich Module mit vier Pins und GND/VCC sind unterschiedlich angeordnet. Soviel zu 'so ist das'.
Schlaumaier schrieb: > wenn er 4 Zeichen wegnimmt, sollte sein Code laufen. > > Die zeichen sind : _i2c > > Wobei sich die Frage stellt, ob er so viel Ports verschwendet hat. ;) du raffst es einfach nicht. Der Extener wird verwendet.
J. S. schrieb: > du raffst es einfach nicht. Der Extener wird verwendet. 1. unter 2 Namen im gleichen Thread zu posten ist unerwünscht. Und zum 2. Schau dir die 3 Zeile in den Foto an am anfang des Threads. Und das ist das letzte was ich dazu sagt. Ihr rafft es einfach nicht. Und dann tausche einfach mal LiquidCrystal_I2C lcd( viel zu viele Parameter) gegen LiquidCrystal_I2C lcd(0x27,20,4); aus. Und fertig ist das ganze. Nur mal so als Spass. Wenn du es nicht willst auch gut. Man soll Leute nicht zu ihren Glück zwingen.
Schlaumaier schrieb: > 1. unter 2 Namen im gleichen Thread zu posten ist unerwünscht. Dummer Vorwurf. Ich bin angemeldet und poste nur unter diesem Namen, auch in diesem Thread. Der TO hat den Code irgendwo herkopiert und nicht die passende Lib installiert. Du verstehst offensichtlich kein Englisch, sondern hättest die Info in der Beschreibung vielleicht verstanden: https://github.com/fmalpartida/New-LiquidCrystal Oder die Kommentare im Konstruktor:
1 | @param En[in] LCD En (Enable) pin connected to the IO extender module |
2 | @param Rw[in] LCD Rw (Read/write) pin connected to the IO extender module |
3 | @param Rs[in] LCD Rs (Reset) pin connected to the IO extender module |
4 | @param d4[in] LCD data 0 pin map on IO extender module |
5 | @param d5[in] LCD data 1 pin map on IO extender module |
6 | @param d6[in] LCD data 2 pin map on IO extender module |
7 | @param d7[in] LCD data 3 pin map on IO extender module |
was meinst du was 'connected to the IO extender module' heißt? Tipp: die Nummern die da im Code vom TO stehen haben nix mit den Digital IO des Arduino zu tun. Schlaumaier schrieb: > Und fertig ist das ganze. Nur wenn der IO Extender des TO so verdrahtet ist wie die simple Arduino Lib es annimmt.
:
Bearbeitet durch User
/*! @typedef @abstract Define backlight control polarity @discussion Backlight control polarity. @see setBacklightPin. */ typedef enum { POSITIVE, NEGATIVE } t_backlightPol;
Schlaumaier schrieb: Mal wieder groben Unfug > Der Aufruf ist Mist. Das sieht in einer hier funktionierenden Anwendung fast genauso aus, IDE_1.7.4:
1 | LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); |
2 | lcd.begin(20,4); // initialize the lcd |
3 | StartDisplay(); // hier zeigt das Gerät seinen Starttext an |
Wenn ich nun "positive" klein schreibe, bekomme ich genau diese Fehlermeldung:
1 | Discharger.ino:224:53: error: 'positive' was not declared in this scope |
2 | Fehler beim Kompilieren. |
Also: Die A*-IDE ist Case sensitive, Groß- / Kleinschreibung beachten! Bitte auch auf Umlaute und Sonderzeichen verzichten, die sind auch für Überraschungen gut. J. S. schrieb: > Der TO hat den Code irgendwo herkopiert und nicht die passende Lib > installiert. Die Lib und der Code dürften Bestandteil der IDE sein und funktionieren bei vielen Leuten klaglos. Es ist nicht verwerflich und sogar gewollt, für Standardaufgaben auf diese zurück zu greifen.
Manfred schrieb: > Also: Die A*-IDE ist Case sensitive, Groß- / Kleinschreibung beachten! das ist durch die Programmiersprache vorgegeben, nicht durch die IDE. J. S. schrieb: > Allerdings muss 'positive' da gross geschrieben werden, das steckt da in > einem enum schrieb ich schon, ist im Schlaumeier Rauschen wohl untergegangen. Manfred schrieb: > Die Lib und der Code dürften Bestandteil der IDE nö, die muss man extra installieren. Und da gibt es eben mindestens zwei Versionen. Die, die auf Arduino.cc dokumentiert ist, die hat nicht den Konstruktor mit der einstellbaren Zuordnung.
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.