Arduino Polska Forum

Pełna wersja: Błąd biblioteki LiquidCrystal_I2C
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Cześć, 

Jestem graczem ASG, znalazłem poradnik jak zbudować atrapę bomby na rozgrywki w Internecie wraz z całym schematem oraz skryptem, i o ile podłączenie wszystkiego do kupy nie sprawiło mi problemu tak wgranie programu już tak.
Mianowicie mam problem z biblioteką LiquidCrystal_I2C... Gość niestety w poradniku nie napisał z jakich bibliotek korzystał. Szukam i czytam, wgrywam nowe biblioteki, testuje ale nie potrafię rozwiązać tego problemu sam. Macie może jakąś radę jak dobrać tą bibliotekę? 

Program:

Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#define BACKLIGHT_PIN 3

int e;
int p=0;
char t;
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);

const byte wiersze= 4; //ilosc wierszy
const byte kolumny= 4; //ilosc kolumn

char mapaklawiszy[wiersze][kolumny]=
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

byte wiersze_piny[wiersze] = {9,8,7,6};//{0,1,2,3};
byte kolumny_piny[kolumny] = {5,4,3,2};//{4,5,6,7};

Keypad myKeypad= Keypad(makeKeymap(mapaklawiszy), wiersze_piny, kolumny_piny,wiersze, kolumny);


volatile int l=0;
int mykey[4];
int haslo[4];
int zapis_h[4]={-2,-2,-2,-2};
void setup()
{
Serial.begin(9600);
lcd.begin (16,2);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);

pinMode(10,OUTPUT);

pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);

lcd.home();
lcd.print("   GOTOWY ???    ");
lcd_czas_zero();
lcd_haslo_zero();

}

void loop()
{

int test=0;
char wybor;

wybor=myKeypad.getKey();

switch(wybor)
{
case 'A': //case '1':
{
opcja1();
}
break;

case 'C': //case '1':
{
lcd.setCursor(0,0);
lcd.print("ARE YOU READY ?  ");
lcd_czas_zero();
lcd_haslo_zero();
}
break;
}
}

int opcja1()
{
lcd_czas_zero();
lcd_haslo_zero();
lcd.setCursor(0,0);
lcd.print("  Ust. CZAS   ");
Serial.println("case 1");
jaki_czas();
}


int czas(int j, int i)
{

boolean czy=false;

lcd.setCursor(0,0);
lcd.print("   Ust. HASLO   ");

Serial.println("HASLO");
l=0;
haslo_glowne();

lcd.setCursor(0,0);
lcd.print(" ");

start_czas();

i=i*10;
 
while(j>-1)//(int x=j+1;j>-1;x--)
{

for(int y=i;y>-1;y--)
{
if(j<10)
{
lcd.setCursor(2,1);
lcd.print("0");
lcd.setCursor(3,1);
lcd.print(j);
}
else
{
lcd.setCursor(2,1);
lcd.print(j);
}
lcd.setCursor(4,1);
lcd.print(":");

if(y<100)
{
lcd.setCursor(5,1);
lcd.print("0");
lcd.setCursor(6,1);
lcd.print(y/10);
}
else
{
lcd.setCursor(5,1);
lcd.print(y/10);
}

if(y<100 & j==0)
{
lcd.setCursor(5,1);
lcd.print("0");
lcd.setCursor(6,1);
lcd.print(y/10);
if(y%10 == 0)
{
digitalWrite(10,HIGH);
lcd.noDisplay();
}
}
else if(y<100)
{
lcd.setCursor(5,1);
lcd.print("0");
lcd.setCursor(6,1);
lcd.print(y/10);
}
else
{
lcd.setCursor(5,1);
lcd.print(y/10);
}

test_haslo();

float odczyt1 = analogRead(A0);
float odczyt2 = analogRead(A1);


if(odczyt1 >1000.00 && odczyt2 >1000.00)
{

if(haslo[0]==zapis_h[0] && haslo[1]==zapis_h[1] && haslo[2]==zapis_h[2] && haslo[3]==zapis_h[3])
{
Serial.println("HASLO POPRAWNE");
lcd.display();
digitalWrite(10,LOW);
lcd.setCursor(4, 1);
czy=true;
break;
}
}
if(zapis_h[0]>-1 && zapis_h[1]>-1 && zapis_h[2]>-1 && zapis_h[3]>-1)
{
zapis_h[0]=-1;
zapis_h[1]=-1;
zapis_h[2]=-1;
zapis_h[3]=-1;
Serial.println("HASLO NIE POPRAWNE");
lcd_haslo_zero();
}

delay(70);
lcd.display();
digitalWrite(10,LOW);
delay(30);
}

float odczyt1 = analogRead(A0);
float odczyt2 = analogRead(A1);

if(odczyt1 >1000.00 && odczyt2 >1000.00)
{
if(haslo[0]==zapis_h[0] && haslo[1]==zapis_h[1] && haslo[2]==zapis_h[2] && haslo[3]==zapis_h[3])
{
Serial.println("HASLO POPRAWNE");
lcd.display();
digitalWrite(10,LOW);
lcd.setCursor(4, 1);
czy=true;
break;
}
}
i=600;
j=j-1;
}
int o=0;

if(czy)
{
lcd.setCursor(0, 0);
lcd.print("HASLO. POPRAWNE ");
while(o<3)
{
digitalWrite(10,HIGH);
delay(200);
digitalWrite(10,LOW);
delay(200);
o++;
}

}
else
{
lcd.setCursor(0, 0);
lcd.print("   BOOOOOM!!!   ");
digitalWrite(10,HIGH);
delay(5000);
digitalWrite(10,LOW);
}
 
}

//wyswietlenie czasu ktory jest nieznany
int lcd_czas_zero()
{
lcd.setCursor(0,1);
lcd.print("T~--:--");
}
//wyswietlenie hasła ktore jest nieznane
int lcd_haslo_zero()
{
lcd.setCursor(10,1);
lcd.print("H~****");
}

int jaki_czas()
{

lcd_czas_zero();

int i,j;

for(int q=0;q<4;q++)
{
mykey[q]=0;
}

i=0;
j=0;
l=0;

while(l<4)
{

char keypressed = myKeypad.getKey();
if (keypressed)
{
mykey[l]=keypressed-'0';
if(l<=1)
{
lcd.setCursor(l+2,1);
lcd.print(mykey[l]);
}
else
{
lcd.setCursor(l+3,1);
lcd.print(mykey[l]);
}
l++;
Serial.println(keypressed);
}
}

i=(mykey[0]*10)+mykey[1];//i=((mykey[0]-'0')*10)+(mykey[1]-'0');
j=(mykey[2]*10)+mykey[3];// j=((mykey[2]-'0')*10)+(mykey[3]-'0');

lcd.setCursor(0,0);
lcd.print("               ");

while(l!=66)
{
l=myKeypad.getKey();
if(l==67)
{
jaki_czas();
}
}

czas(i,j);

}

int start_czas()
{
int l=0;
while(l!=35)
{
l=myKeypad.getKey();
}
lcd.setCursor(0,0);
lcd.print(" START ");
Serial.println("START");
}


int haslo_glowne()
{
lcd_haslo_zero();
l=0;
while(l<4)
{
char keypressed_1 = myKeypad.getKey();
if (keypressed_1) //if (keypressed != NO_KEY)
{
haslo[l]=keypressed_1-'0';
lcd.setCursor(l+12,1);
lcd.print(haslo[l]); 
l++;
}
}
while(l!=35)
{
l=myKeypad.getKey();
Serial.println("2 while");
if(l==67) //C = 67, B=66
{
haslo_glowne();
}
}
lcd_haslo_zero();
Serial.println("HASLO ZAPISANE");
}

int test_haslo()
{

int keypressed_2 = 0;

if(zapis_h[0]==-1)
{
p=0;
}

keypressed_2 = myKeypad.getKey()-'0';

if( p<4 && keypressed_2>0 )
{
zapis_h[p]=keypressed_2;
lcd.setCursor(p+12,1);
lcd.print(zapis_h[p]); 
p++;
}
}

Oraz komunikat błędu:
Kod:
Arduino:1.8.19 (Windows Store 1.8.57.0) (Windows 10), Płytka:"Arduino Uno"





















sketch_may26a:10:41: error: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int)'

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);

                                         ^

In file included from C:\Users\grabe\Documents\Arduino\sketch_may26a\sketch_may26a.ino:2:0:

C:\Users\grabe\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:3: note: candidate: LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)

   LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);

   ^~~~~~~~~~~~~~~~~

C:\Users\grabe\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:3: note:   candidate expects 3 arguments, 8 provided

C:\Users\grabe\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: candidate: constexpr LiquidCrystal_I2C::LiquidCrystal_I2C(const LiquidCrystal_I2C&)

class LiquidCrystal_I2C : public Print {

       ^~~~~~~~~~~~~~~~~

C:\Users\grabe\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note:   candidate expects 1 argument, 8 provided

C:\Users\grabe\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: candidate: constexpr LiquidCrystal_I2C::LiquidCrystal_I2C(LiquidCrystal_I2C&&)

C:\Users\grabe\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note:   candidate expects 1 argument, 8 provided

C:\Users\grabe\Documents\Arduino\sketch_may26a\sketch_may26a.ino: In function 'void setup()':

sketch_may26a:37:6: error: 'class LiquidCrystal_I2C' has no member named 'setBacklightPin'; did you mean 'setBacklight'?

  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);

      ^~~~~~~~~~~~~~~

      setBacklight

sketch_may26a:37:36: error: 'POSITIVE' was not declared in this scope

  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);

                                    ^~~~~~~~

exit status 1

no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int)'



Ten raport powinien zawierać więcej informacji jeśli w
File -> Preferencje zostanie włączona opcja "Pokaż
szczegółowe informacje podczas kompilacji"

Poradnik jest z 2016 (nie wiem czy ma to jakieś znaczenie), jakaś rada jak próbować znaleźć tą bibliotekę?
Są biblioteki, gdzie możesz podać piny przypisane do adaptera I2C, są takie, które mają jedno ustawienie. Znasz adres to zamień tę linię na:
LiquidCrystal_I2C lcd(0x27);
Ale kolejne funkcje z tej biblioteki mogą się inaczej nazywać, więc możliwe że to daleko nie pomoże, trzeba otworzyć swoja bibliotekę, zobaczyć jakie są funkcje, jakie mogą mieć argumenty, przeanalizować przykłady i odpowiednio wszystko podmieniać. Albo szukać dalej.
I dalej od razu widać kolejny błąd, bo biblioteka nie ma lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);.
Ale składając te dwie informacje do kupy w Google znajduje to: https://github.com/esp8266/Basic/tree/ma...uidCrystal
Ta biblioteka ma funkcję do ustawienia osobno pinu backlightpin.