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ů ..
![Very Happy :D](./images/smilies/icon_biggrin.gif)
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](http://www.valachnet.cz/lvanek/diy/homebrain/base_gallery/display.jpg)
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 ....
![Very Happy :D](./images/smilies/icon_biggrin.gif)
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 ....
![Sad :(](./images/smilies/icon_sad.gif)
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....
![Sad :(](./images/smilies/icon_sad.gif)
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
![Smile :)](./images/smilies/icon_smile.gif)
), 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 .....