Librarys

Hallo,
hoffe mir kann hier jemand helfen!

Ich hab ein Problem mit der Library “LiquidCrystal_I2C”. Hab sie ganz normal eingebunden und auch die examples funktionieren ohne Probleme. Jedoch im eigentlichen sketch bekomme ich immer wieder den Fehler:
{{{ LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); }}}

line. It says [[[no matching function for call to ‘LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int)’]]].

Was mach ich falsch?

// Bench PSU Arduino LCD
// by Iqbal Ibrahim
// for Instructables.com
// August 2015

/*-----( Import needed libraries )-----*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define I2C_ADDR    0x27 // <<----- Add your address here.  Find it from I2C Scanner
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
#define Vpower 5.22
#define PWROK_PIN 4
#define PWRBTN 2
#define PWRTRANS 6

/*-----( Declare objects )-----*/

// Variables will change:
int PWRSTATE = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output flickers




LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
/*-----( Declare Variables )-----*/
byte blockChar[8] = {
	0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111
};

float threevoltin, fivevoltin, twelvevoltin, vronein, vrtwoin;
float threevolts, fivevolts, twelvevolts, vronevolts, vrtwovolts;


void LCDSetup(){
  lcd.begin(20,4);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print(" Bench PSU Monitor  ");
  lcd.setCursor(0,1);
  lcd.print("    V1.0   2015     ");
  lcd.setCursor(0,2);
  lcd.print("  By Iqbal Ibrahim  ");
  lcd.setCursor(0,3);
  lcd.print("  www.thebal.co.uk  ");
  delay(2000);
  lcd.clear();
  
  lcd.createChar(0, blockChar);
  
}

void LabelSetup(){
  lcd.setCursor(0,0);
  lcd.print("3V3:     V 5V:     V");
  lcd.setCursor(0,1);
  lcd.print("12V:      V");
  lcd.setCursor(0,2);
  lcd.print("VR1:      V POWER  ");
  lcd.setCursor(0,3);
  lcd.print("VR2:      V "); 
}

void topLeftBlock(){
 lcd.setCursor(18,2);
 lcd.write((uint8_t)0);
 lcd.print(" "); 
 lcd.setCursor(18,3);
 lcd.print("  ");
}

void topRightBlock(){
 lcd.setCursor(18,2);
 lcd.print(" ");
 lcd.write((uint8_t)0);
 lcd.setCursor(18,3);
 lcd.print("  ");
}

void bottomLeftBlock(){
 lcd.setCursor(18,2);
 lcd.print("  "); 
 lcd.setCursor(18,3);
 lcd.write((uint8_t)0);
 lcd.print(" "); 
}

void bottomRightBlock(){
 lcd.setCursor(18,2);
 lcd.print("  ");  
 lcd.setCursor(18,3);
 lcd.print(" ");
 lcd.write((uint8_t)0);
}

void readVoltages(){
  threevoltin =  (analogRead(A0)* Vpower)/1024.0;
  fivevoltin =   (analogRead(A1)* Vpower)/1024.0;
  twelvevoltin = (analogRead(A3)* Vpower)/1024.0;
  vronein =      (analogRead(A6)* Vpower)/1024.0;
  vrtwoin =      (analogRead(A7)* Vpower)/1024.0;
} 

void calculatePrintVoltages(){
  threevolts = threevoltin;
  lcd.setCursor(5,0); lcd.print(threevolts);
  
  fivevolts = (fivevoltin)/ (1770.0/(182.0+1770.0));
  lcd.setCursor(15,0); lcd.print(fivevolts);
  
  twelvevolts = (twelvevoltin ) / (1770.0/(4650.0+1770.0));
  lcd.setCursor(5,1); lcd.print(twelvevolts);
  
  vronevolts = (vronein ) / (1770.0/(11890.0+1770.0));
  lcd.setCursor(5,2); lcd.print(vronevolts);
  
  vrtwovolts = (vrtwoin ) / (1770.0/(11920.0+1770.0));
  lcd.setCursor(5,3); lcd.print(vrtwovolts);
  
}

void checkPowerOK(){
  if (digitalRead(PWROK_PIN) == HIGH) {
    lcd.setCursor(13,3);
    lcd.print("ON ");
  }
  else if (digitalRead(PWROK_PIN) == LOW) {
    lcd.setCursor(13,3);
    lcd.print("OFF");
  }
}

void togglePower(){
 static unsigned long last_interrupt_time = 0;
 unsigned long interrupt_time = millis();
 // If interrupts come faster than 200ms, assume it's a bounce and ignore
 if (interrupt_time - last_interrupt_time > 500) 
 {
   // set the power:
  digitalWrite(PWRTRANS, PWRSTATE);
 }
 PWRSTATE = !PWRSTATE;
 last_interrupt_time = interrupt_time;  
}


void setup()   /****** SETUP: RUNS ONCE ******/
{
 LCDSetup(); 
 LabelSetup();
 pinMode(PWRBTN, INPUT);
 pinMode(PWRTRANS, OUTPUT);
 attachInterrupt(0, togglePower, RISING);
 digitalWrite(PWRTRANS, PWRSTATE);
 
 
}
//--(end setup )---

void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{ checkPowerOK();
  readVoltages();
  calculatePrintVoltages();
  topLeftBlock();
  delay(250);
  readVoltages();
  calculatePrintVoltages();
  topRightBlock();
  delay(250);
  readVoltages();
  calculatePrintVoltages();
  bottomRightBlock();
  delay(250);
  readVoltages();
  calculatePrintVoltages();
  bottomLeftBlock();
  delay(250);
}

//--(end main loop )---






//*********( THE END )***********

Dann hast du in der Zeile einen Schreibfehler.
Ich vermute das “lcd” ist da zuviel drin.

und auch die examples funktionieren ohne Probleme

Und wie sieht bei denen die Zeile wo das lcd Objekt erzeugt wird, aus?

Deine hat 8 Parameter:

LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

Richtigerweise sollte man natürlich, wie der Compiler, in LiquidCrystal_I2C.h nachsehen.

Ups, da habe ich mich geirrt.

Das "lcd" gehört da rein.

Du solltest einfach noch mal mit den funktionierenden Beispielen vergleichen.

Das sieht ja in den einzelnen Libraries auch unterschiedlich aus.

Bei mir z.B. so:

//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

Aber wie michael_x schon schreibt, in deiner Lib nachschauen.

Den Backlight-Pin (bl) hast du sicher schon mal vergessen.

mal ne doofe Frage: gibt es da unterschiedliche Inhalte, bei der gleichen Library? Dachte die sind alle gleich :confused:

Chris24xx:
mal ne doofe Frage: gibt es da unterschiedliche Inhalte, bei der gleichen Library? Dachte die sind alle gleich :confused:

Was verstehst du unter "unterschiedliche Inhalte" ?

Und zeig doch mal den Sketch eines funktionierenden Beispiels.

den Aufbau, bzw. Inhalt, oder Ablauf der Library.
In dem Fall, ob es nun möglich ist mit 8 Parametern zu arbeiten. Ne andere verträgt vielleicht "nur" 5.

Chris24xx:
den Aufbau, bzw. Inhalt, oder Ablauf der Library.
In dem Fall, ob es nun möglich ist mit 8 Parametern zu arbeiten. Ne andere verträgt vielleicht "nur" 5.

Wenn du mit "ne andere" eine andere Library meinst, ist das natürlich richtig.

Es gibt x verschiedene Libraries mit dem Namen "LiquidCrystal_I2C". Die unterscheiden sich alle von einander.

Da musst du immer die richtige "Deklaration" mit den richtigen Parametern wählen.

Nochmal:

Zeig uns den Sketch eines funktionierenden Beispiels !

ok, verstanden, war mir neu!
@hotsystems: danke, das hat mir gefehlt! Das Beispiel kann ich erst heute Abend reinstellen. In dem Fall muss ich natürlich ein Beispiel der verwendeten Library nehmen.

Chris24xx:
ok, verstanden, war mir neu!
@hotsystems: danke, das hat mir gefehlt! Das Beispiel kann ich erst heute Abend reinstellen. In dem Fall muss ich natürlich ein Beispiel der verwendeten Library nehmen.

Ja, ok.
Dann sehen wir heute Abend weiter.

Soweit ich das verstanden habe:
In c (oder c++) ist es möglich 2 oder mehrere Funktionen (oder sind es Objekte, Bitte korrigiert mich jemand) den gleichen Namen zu geben die aber andere Typen bzw Anzahl von übergebenen Parameter haben. So ist es zB möglich bei der standart Arduino LCD Bibliothek ( http://www.arduino.cc/en/Reference/LiquidCrystal ) das Display auf mehrere verschiedene Arten anzuschließen und anzusprechen.

LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

Grüße Uwe

In c (oder c++) ist es möglich 2 oder mehrere Funktionen (oder sind es Objekte, Bitte korrigiert mich jemand) den gleichen Namen zu geben die aber andere Typen bzw Anzahl von übergebenen Parameter haben

Ja, richtig verstanden:

  • c++
  • Gilt für alle Funktionen und Methoden von Klassen.
  • Hier wird es verwendet bei einem sogenannten Konstruktor: eine Methode, die ein Objekt erzeugt.
    Ein Konstruktor hat immer den Namen der Klasse, und oft gibt es verschiedene, mit unterschiedlichen Parametern.

michael_x:
Ja, richtig verstanden:

  • c++
  • Gilt für alle Funktionen und Methoden von Klassen.
  • Hier wird es verwendet bei einem sogenannten Konstruktor: eine Methode, die ein Objekt erzeugt.
    Ein Konstruktor hat immer den Namen der Klasse, und oft gibt es verschiedene, mit unterschiedlichen Parametern.

Ok, vielen Dank.

Das sind Informationen, die ich auch gebrauchen kann.
Manchmal fehlen einem die passenden und richtigen Bezeichnungen.

Ich halte ja einen Konstruktor mit so vielen Parametern für… unpassend (alles Pins die nicht erreichbar sind).
Mein I2C Display arbeitet mit einen Konstruktor mit 3 Parametern, I2C Adresse und Spalten und Zeilen.

LiquidCrystal_I2C lcd(0x27, 16, 2);

Meine Library habe ich von DFRobot, ich hänge sie der Einfachheit halber an.

LiquidI2c.zip (19.8 KB)

Ich halte ja einen Konstruktor mit so vielen Parametern für… unpassend (alles Pins die nicht erreichbar sind).

Ja, da ist was dran, zumal die Pin-Nummern nichts mit Arduino - Pins zu tun haben.

Andererseits wird die Display-Größe (16x2) bei lcd traditionell in einer begin Methode festgelegt.
Sollte dann also auch raus :wink:

Aber gut, ein weiteres Beispiel zur Bestätigung zu haben hierfür:

HotSystems:
Es gibt x verschiedene Libraries mit dem Namen “LiquidCrystal_I2C”. Die unterscheiden sich alle von einander.
Da musst du immer die richtige “Deklaration” mit den richtigen Parametern wählen.

Es spricht auch nichts gegen x+1 Library Versionen. Also eine, die man an seinen Bedarf anpasst.

Ob im begin oder im Konstruktor spielt ja keine Rolle, will die Library verschiedene Dimensionen unterstützen, muss sie es irgendwo erfahren.
Ich persönlich finde es im Konstruktor besser, aber das ist reine Geschmacksache.

Ob im begin oder im Konstruktor spielt ja keine Rolle

Vorsicht! Ein Konstruktor kann sehr früh drankommen. Mehr als sich die Parameter für später merken, sollte man sich gut überlegen ...

Befehlskompatibel zur "Standard" LiquidCrystal Library gilt sicher nicht für den Konstruktor, kann aber sonst schonmal praktisch sein.

Ich dachte da eher an die Dokumentation, also Lcd, I2C Adresse, Dimension, alles schön beieinander.
Ist ja auch eine Sache die Parameter zu übergeben und eine andere sie zu verwenden.
Die regelmäßig im Konstruktor übergebenen Pins bei Hardwareobjekten können halt erst in begin/init/setup/… wirklich benutzt werden (pinmode z.B.). Als Author einer Library muss man sich da mehr Gedanken machen als als deren Nutzer. Na ja, zumindestens bis es Probleme gibt. :wink: Da aber immer der Quelltext mitgeliefert wird, kann man prima nachschauen (und bekommt oftmals das Gruseln…).

zuerst einmal vielen Dank für alle für die Unterstützung! Wieder was gelernt :slight_smile:

Inzwischen ist die Fehlermeldung weg, hab eine recht gute Seite gefunden, falls auch jemand damit ein Problem hat, hier die Seite:
https://arduino-info.wikispaces.com/LCD-Blue-I2C