Inicializácia displeja po detekcii I2C adresy

Odpovědět
martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Inicializácia displeja po detekcii I2C adresy

Příspěvek od martinius96 » 30 črc 2022, 00:02

Ahoj, používam knižnicu LiquidCrystal_I2C z Githubu od fdebrabander: https://github.com/fdeb.../Arduino-Liqu ... 2C-library

Pre displej sa vytvorí objekt zavolaním konštruktora, ktorý obsahuje vopred nastavenú adresu displeja:

Kód: Vybrat vše

LiquidCrystal_I2C lcd(0x3F, 16, 2);
Chcel by som I2C adresu displeja detekovať automaticky (cez I2C scanner) a vytvoriť objekt až potom, keďže občas používam displeje s adresou 0x27, 0x3F, prípadne aj inými, ak sú na I2C module zospájkované plôšky A0, A1... Neviem ale ako ten konštruktor zavolať v setupe() tak, aby bol ten objekt globálny a dalo sa k nemu pristupovať aj v loope(). Je to nejak možné?

Napadá ma už len urobiť to v loope(), kedy tam bude nejaká one-time podmienka, kedy sa vytvorí objekt a zároveň sa inicializuje displej a vypíšu sa statické údaje na displej, ktoré budú nemenné.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Inicializácia displeja po detekcii I2C adresy

Příspěvek od gilhad » 30 črc 2022, 00:36

Deklaroval bych si globalní ukazatel, v setupu vytvořil objekt a nasměroval na ten ukazatel a v loopu bych ten ukazatel dereferencoval.

Asi nějak takto

Kód: Vybrat vše

LiquidCrystal_I2C *lcd;
// ...
void setup() {
  // ...
  adresa = scaner();
  lcd = LiquidCrystal_I2C(adresa, 16, 2);
  // ...
}

void loop () {
  // ...
  lcd->funkce(parametry); // misto lcd.funkce(parametry);
  // ...
}

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Inicializácia displeja po detekcii I2C adresy

Příspěvek od martinius96 » 30 črc 2022, 01:20

Ano, podarilo sa to cez globálny pointer. Ďakujem za pomoc ;)

Kód: Vybrat vše

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C* lcd;
int val = 0;
void setup() {
  Wire.begin();
  byte error, address;
  for (address = 1; address < 127; address++ )
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0)
    {
      break;
    }
  }
  lcd = new LiquidCrystal_I2C(address, 16, 2);
  lcd->begin();
  lcd->backlight();
}
 
void loop() {
  lcd->clear();
  lcd->setCursor(0, 0);
  lcd->print(val, DEC);
  delay(1000);
  val++;
}

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů