Forum: Mikrocontroller und Digitale Elektronik Arduino Thermometer mit LCD I2C


von Adrian B. (adrianbbbbb)


Angehängte Dateien:

Lesenswert?

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!

von Stefan F. (Gast)


Lesenswert?

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.

von Johannes F. (Gast)


Lesenswert?

Der Bezeichner „positive“ ist nicht deklariert.
Evtl. wird ein String erwartet. Probier mal
1
"positive"
 statt
1
positive
 zu schreiben.

von Da Baby (Gast)


Lesenswert?

was soll blpol sein? Backlight Polarity? Schau doch einfach schnell in 
den Funktionsheader welcher Datentyp erwartet wird o.O

von Schlaumaier (Gast)


Lesenswert?

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.

von PittyJ (Gast)


Lesenswert?

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?

von Gerald B. (gerald_b)


Lesenswert?

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)

von Schlaumaier (Gast)


Lesenswert?

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. !!! ;)

von J. S. (jojos)


Lesenswert?

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
von Schlaumaier (Gast)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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. ;)

von J. S. (jojos)


Lesenswert?

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'.

von J. S. (jojos)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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.

von J. S. (jojos)


Lesenswert?

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
von PittyJ (Gast)


Lesenswert?

/*!
 @typedef
 @abstract   Define backlight control polarity
 @discussion Backlight control polarity. @see setBacklightPin.
 */
typedef enum { POSITIVE, NEGATIVE } t_backlightPol;

von Manfred (Gast)


Lesenswert?

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.

von J. S. (jojos)


Lesenswert?

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
Noch kein Account? Hier anmelden.