Stránka 1 z 1

Inicializácia displeja po detekcii I2C adresy

Napsal: 30 črc 2022, 00:02
od martinius96
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é.

Re: Inicializácia displeja po detekcii I2C adresy

Napsal: 30 črc 2022, 00:36
od gilhad
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);
  // ...
}

Re: Inicializácia displeja po detekcii I2C adresy

Napsal: 30 črc 2022, 01:20
od martinius96
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++;
}