Stránka 1 z 1

LCD 20x4 I2C

Napsal: 25 črc 2016, 11:24
od dobrman
Zdravím,
včera mi volal známý, že nemůže rozchodit komunikaci s tímto modulem,
tak první co mě napadlo, byla adresa. A bylo to tak...nebyla tam jak psali 0x27, ale 0x3F ....

Chtěl jsem se zeptat, protože s podobnýma modulama s I²C nemám zkušenosti, ta adresa je daná a nebo jde nějak adresy přidělovat (nastavit)? Ptám se jen proto, že mě to zajímá....

Předem dík za rozšíření obzorů .. :D

Napsal: 25 črc 2016, 11:36
od Zaky
Jestli je na tom modulu PCF8574, tak pohledem do datasheetu (strana 9) zjistíš vše potřebné: https://www.nxp.com/documents/data_sheet/PCF8574.pdf Modul vypadá, že má adresové propojky přímo na sobě: http://www.ebay.com/itm/LCD1602-1602-HD ... SwDk5TxjeN

Napsal: 25 črc 2016, 11:37
od flyingbird
Záleží to na použitém obvodu: PCF8574P má rozsah adres 0×20 - 0×27, PCF8574AP 0×38 - 0×3F.

Nastavuje se to propojkama A0 - A2.

Obrázek

Napsal: 25 črc 2016, 12:05
od dobrman
Dík,
já to měnit nebudu, ani nechci, ale zajímalo mě, jak to vlastně "funguje"

jinak, mě stačí, když se adresu nějakýho modulu dozvím a když ji použiju, tak že to funguje .... :D

Napsal: 25 črc 2016, 22:43
od Honza_dy
Koupil jsem úplně stejný adaptér za 25,- na ebay a měl jsem úplně stejné problémy. Pomohl I2C sniffer, který našel právě jinou adresu 0x3F. Jinak to chodí celkem uspokojivě.

Napsal: 31 říj 2017, 08:59
od dobrman
Tak jsem se včera snažil půl dne rozchodit LCD 20x4 I2C .... :(
Už jsem to chtěl vzdát a koupit nový display.
Nakonec jsem se dopátral (s pomocí netu) k tomu, že je chyba v knihovně LiquidCrystal_I2C.h .

Nakonec stačilo:
V knihovně, v souboru LiquidCrystal_I2C.cpp
je potřeba změnit z return 0 na 1 v této části kódu

#define printIIC(args) Wire.write(args)
inline size_t LiquidCrystal_I2C::write(uint8_t value) {
send(value, Rs);
return 0;


Setkal se s tím někdo?

Uf.... :(

Napsal: 01 lis 2017, 21:33
od mtajovsky
Jak jste na tu změnu došel, resp. jak je potřeba toho vysvětlena?

Edit: tak vysvětlení není nikde na netu napsáno, ale podle mých zjištění je následující:
Třída LiquidCrystal_I2C je potomkem třídy Print. Pokud voláme metodu LiquidCrystal_I2C::print() pro výstup na displej, tak voláme de-facto metodu Print::print(), která v konečném důsledku volá čistě virtuální metodu

Kód: Vybrat vše

virtual size_t Print::write(uint8_t) = 0;
A tato metoda je implementována právě naším potomkem LiquidCrystal_I2C.

Třída Print se dostane k metodě write(uint8_t) při výstupu řetězce takto:

Kód: Vybrat vše

size_t Print::print(const char str[])
{
  return write(str);
}
a následně:

Kód: Vybrat vše

    size_t write(const char *str) {
      if (str == NULL) return 0;
      return write((const uint8_t *)str, strlen(str));
    }
a konečně:

Kód: Vybrat vše

size_t Print::write(const uint8_t *buffer, size_t size)
{
  size_t n = 0;
  while (size--) {
    if (write(*buffer++)) n++;
    else break;
  }
  return n;
}
Zde používá výše uvedenou metodu write(uint8_t) přetíženou v našem LiquidCrystal_I2C. Je vidět, že pokud se vrátí 0, cyklus tisku řetězce se přeruší pomocí break. Proto je nutné vracet v metodě LiquidCrystal_I2C::write(uint8_t) nenulovou hodnotu.

Mimochodem, tohle dává taky návod, jak napsat vlastní třídu (arduiňácky knihovnu :) ), která má někam posílat textová data ke zobrazení. Třídu pojmeme jako potomka třídy Print a stačí přetížit její čistě virtuální metodu pro výstup jednoho znaku: write(uint8_t). O řetězcové záležitosti se postarají metody třídy Print. Při výstupu se pak volá metoda print() naší nové třídy (která je ale už implementována v Print).

Napsal: 01 lis 2017, 22:45
od dobrman
knihovnu (v příloze - neopravená) jsem měl už při instalaci IDE

jelikož sběrnice I2C komunikovala (šlo zapínat i vypínat podsvit), hledal jsem na netu, až jsem narazil na
tohle
tak jsem to zkusil, no a po přepsání vše funguje tak jak má....


nejsem programátor a proto to nedovedu vysvětlit.
Jen se to učím a hraju si .....