LCD 20x4 I2C

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
dobrman
Příspěvky: 1470
Registrován: 12 srp 2012, 02:00
Bydliště: J H

LCD 20x4 I2C

#1 Příspěvek 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

Uživatelský avatar
Zaky
Příspěvky: 6129
Registrován: 30 říj 2010, 02:00
Bydliště: Praha

#2 Příspěvek 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

Uživatelský avatar
flyingbird
Příspěvky: 54
Registrován: 09 říj 2008, 02:00
Bydliště: ValMez
Kontaktovat uživatele:

#3 Příspěvek 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

Uživatelský avatar
dobrman
Příspěvky: 1470
Registrován: 12 srp 2012, 02:00
Bydliště: J H

#4 Příspěvek 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

Uživatelský avatar
Honza_dy
Příspěvky: 2172
Registrován: 20 srp 2004, 02:00
Bydliště: Brno-venkov

#5 Příspěvek 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ě.

Uživatelský avatar
dobrman
Příspěvky: 1470
Registrován: 12 srp 2012, 02:00
Bydliště: J H

#6 Příspěvek 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.... :(

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#7 Příspěvek 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).

Uživatelský avatar
dobrman
Příspěvky: 1470
Registrován: 12 srp 2012, 02:00
Bydliště: J H

#8 Příspěvek 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 .....
Přílohy
LiquidCrystal_I2C1602V1.zip
(19.44 KiB) Staženo 179 x

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“