i2c připojení. Připojení LCD obrazovky LCM1602 s I2C k Arduinu

  • Modul FC-113 je založen na čipu PCF8574T, což je 8bitový posuvný registr - I/O expandér pro sériovou sběrnici I2C. Na obrázku je mikroobvod označen DD1.
  • R1 - trimr pro úpravu kontrastu LCD displeje.
  • Jumper J1 slouží k zapnutí podsvícení displeje.
  • Piny 1…16 slouží k připojení modulu k pinům LCD displeje.
  • Kontaktní plošky A1 ... A3 jsou potřebné pro změnu I2C adresy zařízení. Připájením příslušných propojek můžete změnit adresu zařízení. Tabulka ukazuje shodu mezi adresami a propojkami: "0" odpovídá otevřenému obvodu, "1" - je nainstalována propojka. Ve výchozím nastavení jsou všechny 3 propojky otevřené a adresa zařízení 0x27.

2 Schéma zapojení LCD displeje k Arduinu přes I2C protokol

Modul je standardně připojen k Arduinu pro sběrnici I2C: SDA výstup modulu je připojen k analogovému portu A4, výstup SCL je připojen k analogovému portu A5 Arduina. Modul je napájen +5 V z Arduina. Samotný modul je připojen piny 1…16 k odpovídajícím pinům 1…16 na LCD displeji.


3 Knihovna pro práci přes I2C protokol

Nyní potřebujeme knihovnu pro práci s LCD přes rozhraní I2C. Můžete použít například tento (odkaz v řádku "Stáhnout ukázkový kód a knihovnu").

Stažený archiv LiquidCrystal_I2Cv1-1.rar rozbalit do složky \knihovny\, který se nachází v adresáři Arduino IDE.

Knihovna podporuje sadu standardních funkcí pro LCD obrazovky:

FunkceÚčel
Tekutý krystal() vytvoří proměnnou typu LiquidCrystal a akceptuje parametry připojení displeje (čísla pinů);
začít() inicializace LCD displeje, nastavení parametrů (počet řádků a symbolů);
Průhledná() vymazání obrazovky a návrat kurzoru do původní polohy;
Domov() návrat kurzoru do výchozí polohy;
setCursor() nastavení kurzoru na danou pozici;
napsat() zobrazí znak na LCD obrazovce;
tisk() zobrazuje text na LCD obrazovce;
kurzor() ukazuje kurzor, tzn. podtržení pod dalším znakem;
noCursor() skryje kurzor;
blikat() kurzor bliká;
noBlink() zrušit blikání;
noDisplay() vypnutí displeje při ukládání všech zobrazených informací;
Zobrazit() zapnutí displeje při ukládání všech zobrazených informací;
scrollDisplayLeft() posouvání obsahu displeje o 1 pozici doleva;
scrollDisplayRight() posouvání obsahu displeje o 1 pozici doprava;
automatické rolování() povolit automatické rolování;
noAutoscroll() vypnout automatické rolování;
zleva do prava() nastavuje směr textu zleva doprava;
zprava doleva() směr textu zprava doleva;
createChar() vytvoří vlastní symbol pro obrazovku LCD.

4 Skica pro výstup textu na LCD obrazovku přes I2C sběrnici

Otevřeme ukázku: Soubor Samples LiquidCrystal_I2C CustomChars a pojďme to trochu změnit. Zobrazme zprávu, na jejímž konci bude blikající znak. Všechny nuance náčrtu jsou komentovány v komentářích ke kódu.

#zahrnout // zahrnout knihovnu Wire #include // připojení knihovny LCD #define printByte(args) write(args); // uint8_t srdce = (0x0,0xa,0x1f,0x1f,0xe,0x4,0x0); // bitová maska ​​symbolu "srdce" LiquidCrystal_I2C lcd(0x27, 16, 2); // Nastavení adresy 0x27 pro LCD displej 16x2 void setup()( lcd.init(); // inicializace LCD lcd.backlight(); // zapnutí podsvícení displeje lcd.createChar(3, srdce); // vytvoření symbolu srdce v paměťovém místě 3 lcd.home(); // umístí kurzor do levého horního rohu na pozici (0,0) lcd.!"); // vytiskne řádek textu lcd.setCursor(0, 1); // přesune kurzor na řádek 2, znak 1 lcd.print( "i"); // vytiskne zprávu na řádek 2 lcd.printByte(3); // vytiskne znak srdce umístěný ve 3. buňce lcd.print("Arduino"); } void loop() (// bliknutí posledního znaku lcd. setCursor(13, 1); // přesunutí kurzoru na řádek 2, znak 1 lcd.print("\t"); zpoždění(500); lcd.setCursor(13, 1); // přesunutí kurzoru na řádek 2, znak 1 lcd.print(" "); zpoždění(500); }

Mimochodem, znaky napsané příkazem lcd.createChar(); zůstanou v paměti displeje i po vypnutí napájení. jsou zapsány do paměti ROM displeje 1602.

5 Vytváření vlastních symbolů pro LCD displej

Pojďme se blíže podívat na problematiku tvorby vlastních symbolů pro LCD obrazovky. Každý znak na obrazovce se skládá z 35 bodů: 5 širokých a 7 vysokých (+1 náhradní řádek pro podtržení). Na řádku 6 výše uvedeného náčrtu definujeme pole 7 čísel: (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Převedeme hexadecimální čísla na binární: {00000, 01010, 11111, 11111, 01110, 00100, 00000} . Tato čísla nejsou nic jiného než bitové masky pro každý ze 7 řádků znaku, kde „0“ označuje světlý bod a „1“ tmavý. Na obrazovce se například objeví symbol srdce daný jako bitová maska, jak je znázorněno na obrázku.

6 LCD ovládání přes I2C sběrnici

Nahrajte skicu do Arduina. Námi zadaný nápis se objeví na obrazovce s blikajícím kurzorem na konci.


7 Co je pozadu I2C sběrnice

Jako bonus zvažte časový diagram výstupu latinských znaků "A", "B" a "C" na LCD displeji. Tyto znaky jsou uloženy v paměti ROM displeje a zobrazí se na obrazovce pouhým předáním jejich adresy na displej. Schéma je převzato z výstupů RS, RW, E, D4, D5, D6 a D7 displeje, tzn. již po převodníku FC-113 "I2C paralelní sběrnice". Dá se říci, že se noříme trochu „hlouběji“ do „železa“.


Časový diagram pro zobrazení latinských znaků "A", "B" a "C" na LCD displeji 1602

Diagram ukazuje, že znaky, které jsou v paměti ROM displeje (viz strana 11 datového listu, odkaz níže), jsou přenášeny ve dvou kouscích, z nichž první určuje číslo sloupce tabulky a druhý určuje číslo řádku. V tomto případě jsou data "přichycena" podél okraje signálu na lince E(Povolit) a řádek RS(Výběr registru, výběr registru) je ve stavu logické jedničky, což znamená přenos dat. Nízký stav linky RS znamená přenos instrukcí, které vidíme před přenosem každého znaku. V tomto případě je přenášen kód instrukce návratu vozíku na pozici (0, 0) LCD displeje, což lze také zjistit prostudováním technického popisu displeje.

A ještě jeden příklad. Tento časový diagram ukazuje zobrazení symbolu srdce na LCD.


Opět první dva impulsy umožnit dodržovat pokyny Domov()(0000 0010 2) - návrat vozíku do polohy (0; 0), a druhé dva - výstup na LCD displej uložený v paměťové buňce 3 10 (0000 0011 2) symbol "Srdce" (instrukce lcd.createChar(3, srdce); skica).

Možná jedna z nejoblíbenějších obrazovek na trhu. Postaveno na populárním ovladači HD44780U. Z názvu modelu vyplývá, že obrazovka se skládá ze dvou řádků po 16 znacích. V tomto konkrétním modelu není podpora ruského jazyka.

Datová sběrnice sh2s umožňuje připojit až 127 zařízení pomocí dvou vodičů a současně. Tento I2C je implementován na čipu PCF8574T.

Elektrické schéma:

Modrá věc - proměnný odpor, umožňuje nastavit kontrast obrazovky.

Propojka vlevo je zodpovědná za podsvícení obrazovky.

Blok 4 pinů je připojen k arduinu takto:

GND-GND
VCC - 5V
SDA - A4 (pokud Arduino MEGA, tak na D20)
SCL - A5 (pokud Arduino MEGA, pak na D21)

Knihovna

Skica

Displej může mít jinou IIC adresu, místo 0x27 se může ukázat jako 0x3F. Pro přesné určení adresy můžete použít skener zařízení i2c.

#zahrnout #zahrnout //nastavení adresy LCD obrazovky 0x27, 16 znaků, 2 řádky LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() ( lcd.init(); // Inicializace obrazovky // zapnout podsvícení lcd.backlight(); //Nastaví pozici, od které se text zobrazí. lcd.setCursor(2, 0); //výstupní řádek 1 lcd.print("Ahoj, světe!"); //podobně zobrazí druhý řádek lcd.setCursor(1, 1); lcd.print("www.site"); ) neplatná smyčka () ( )

Modul LCD I2C umožňuje připojit znakový displej k desce Arduino pomocí pouhých dvou signálových vodičů.

Použité komponenty (koupit z Číny):

. kontrolní panel

. Spojovací vodiče

Hlavní technické vlastnosti:

Displej: Znak 16x02 nebo 20x04
. Osvětlení: Modré s bílými znaky
. Kontrast: nastavitelný potenciometrem
. Napájecí napětí: 5V
. Rozhraní: I2C
. I2C adresa: 0x27
. Rozměry: 82 mm x 35 mm x 18 mm

Připojení k Arduinu

Modul je vybaven čtyřpinovým 2,54mm konektorem

SCL: sériová hodinová linka (Serial CLock)

SDA: sériová datová linka (Serial DAta)

VCC: "+" síla

GND: "-" Napájení

Piny odpovědné za rozhraní I2C na deskách Arduino založených na různých řadičích se liší

Pro práci s tímto modulem je třeba nainstalovat knihovnu LiquidCrystal_I2C1602V1

Stáhněte, rozbalte a vložte do složky libraries ve složce Arduino. Pokud bylo v době přidávání knihovny otevřené IDE Arduino, restartujte prostředí.

Pojďme rovnou ke skice. V tomto příkladu zobrazíme standardní "Ahoj, světe!" a na adresu naší obce.

příklad kódu:

#zahrnout #zahrnout LiquidCrystal_I2C lcd(0x27,16,2); /* Nastaví adresu a velikost displeje. Při použití LCD I2C modulu s displejem 20x04 není třeba v kódu nic měnit, stačí nastavit správný rozměr */ prázdnota založit() (lcd.init(); // Inicializace lcd lcd.backlight(); // zapnout podsvícení // Kurzor je na začátku řádku 1 lcd.print("Ahoj světe!"); // Zobrazení textu lcd. setCursor (0, 1); // Nastavte kurzor na začátek řádku 2 lcd.print("site"); // Zobrazit text ) void smyčka () { }

Vytváření vlastních symbolů

Na textový výstup jsme přišli, písmena anglické abecedy jsou všitá do paměti ovladače uvnitř displeje a nejsou s nimi žádné problémy. Co ale dělat, když požadovaný znak není v paměti ovladače?

Nevadí, požadovaný znak lze vyrobit ručně. Tato metoda částečně, omezení na 7 znaků, pomůže vyřešit problém výstupu.

Buňka v displejích, o kterých uvažujeme, má rozlišení 5x8 pixelů. Úkolem vytvoření symbolu je napsat bitovou masku a umístit do ní jedničky na místa, kde by tečky měly hořet a nuly tam, kde ne.

V níže uvedeném příkladu nakreslíme smajlíka.

příklad kódu:

//Testováno na Arduino IDE 1.0.5 // Přidejte požadované knihovny#zahrnout #zahrnout // Bitová maska ​​symbolu úsměvu byte smile = ( B00010, B00001, B11001, B00001, B11001, B00001, B00010, ); LiquidCrystal_I2C lcd(0x27,20,4); // Nastavení adresy a velikosti displeje. prázdnota založit() (lcd.init(); // Inicializace lcd lcd.backlight(); // zapnout podsvícení // Vytvořte číslo symbolu 0 lcd.createChar(1, úsměv); lcd.setCursor(0, 0); // Nastavte kurzor na začátek řádku 1 lcd.print("\1"); // Zobrazení smajlíka (číslo znaku 1) - "\1") neplatný smyčka () { }

Program pro snadné vytváření symbolů

V komentářích člen komunity upustil odkaz na generátor postav

Dostal jsem sem z dobrého obchodu Chip Resistor další zařízení pro studium a použití v užitečných zařízeních. Ukázalo se, že toto zařízení je naostřeno pro ovládání LCD displeje pod kontrolou řadiče HD44780 ve 4bitovém režimu. Za tímto účelem je na desce instalován mikroobvod, který je převodníkem sběrnice I2C na paralelní 8bitový port.

Deska je rozvedena tak, že ji lze okamžitě křížit s LCD displejem. Vstup je napájen a I2C linkami. Deska má hned pull-up odpory na linkách SCL a SDA, potenciometr pro úpravu kontrastu a napájení samotného displeje.

Propojka vpravo zapíná/vypíná podsvícení. Poté, vyzbrojeni testerem, byla sestavena následující deska. Po prostudování modulu bylo zjištěno, že P3 ovládá podsvícení. Pokud je propojka nastavena, pak 1 zapne podsvícení a 0 jej vypne. Po odstranění propojky je podsvícení vždy vypnuto. Dále bylo rozhodnuto o doplnění knihovny axlib o funkce pro práci se sběrnicí I2C (softwarová implementace) a funkce pro ovládání čipu PCF8574. Stručně řečeno, jak modul funguje. Aby bylo možné bajty vydávat paralelně, musíte k tomu odeslat adresu mikroobvodu na sběrnici I2C (ve výchozím nastavení je to 0x4E. Adresu můžete také změnit připájením propojek na desce a změnou hodnoty tří nejmenších významné číslice adresy), pak po přijetí ACK je odeslán datový bajt. Poté, co čip odpoví ACK, bajt se objeví na paralelním portu čipu. Pro ovládání LCD jsem převzal funkce z knihovny axlib a mírně je přepracoval pro práci se sběrnicí I2C. #zahrnout #zahrnout #zahrnout #zahrnout #define ADD 0x4E // Adresa čipu /* LCD Chip RS P0 RW P1 EN P2 D4 P4 D5 P5 D6 P6 D7 P7 Podsvícení je připojeno na pin P3. 1 zapnuto, 0 vypnuto */ // Výstup dat com |= 0x04; // E ku jedné pcf8574_byte_out(com, ADD); // Výstup dat com &= 0xFB; // E na nulu pcf8574_byte_out(com, ADD); // Výstup dat) void init(void) ( _delay_ms(30); com(0x30); _delay_us(40); com(0x30); // Přepnutí do 4bitového režimu _delay_us(40); // Zpoždění provedení příkazu com(0x30); // Přepnutí do 4bitového režimu _delay_us(40); // Zpoždění provedení příkazu com(0x20); // Přepnutí do 4bitového režimu _delay_us(40); // Zpoždění provedení příkazu com(0x20); // Nastavení parametrů com(0x80); // Nastavení parametrů com(0x00); // Vypnout obrazovku com(0x80); // Vypnout obrazovku com(0x00); // Vymazání displeje com(0x10); // Vymazání displeje com(0x00); com(0x60); // Nastavení vstupního režimu com(0x00); com(0xCO); // Zapnutí displeje se zvoleným kurzorem) void char_out(data BYTE) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Předání vysokých 4 bitů data_h |= 0x04; pcf8574_byte_out(data_h, ADD); // Předá vysoké 4 bity // Předá vysoké 4 bity // Pass low 4 bits // Pass low 4 bits // Pass low 4 bits) void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) int main(void) ( init(); str_out("ЁPҐBET MҐP!" ); while(1) ( ) ) Přesně to, co se tady děje. Za prvé, zahrnujeme knihovny pro I2C a pro PCF8574. O I2C jsem již psal, takže nebudu znovu křižovat, ale řeknu vám, co v PCF8574.h. Knihovna obsahuje pouze tři funkce.
BYTE pcf8574_test(BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); i2c_stop(); return ask; ) První funkce byla napsána pro kontrolu, zda je zařízení na sběrnici. V zásadě jej lze použít k vyhledání libovolného zařízení umístěného na sběrnici. Funkce převezme adresu požadovaného zařízení a pokud odpoví, vrátí nulu. Pokud zařízení s touto adresou není na sběrnici, vrátí jednu.
BYTE pcf8574_byte_out(data BYTE, přidat BYTE) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); if(!ask) ask = i2c_send_byte(data); i2c_stop(); return ask; ) Tato funkce již byla vybroušena čistě pro tento čip. Jako argumenty je předán bajt pro přenos na sběrnici a adresa mikroobvodu. Funkce se nejprve dotáže čipu na adrese a poté odešle bajt. Pokud čip přijal bajt a odpověděl ACK, pak funkce čip ukončí a vrátí nulu jako úspěšný bajt. A mikroobvod v tomto okamžiku odešle tento bajt na svůj paralelní port. V opačném případě dostaneme NACK a vrátíme jeden, přenos se nezdařil.
BYTE pcf8574_str_out(BYTE *data, BYTE col, BYTE přidat) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); for(BYTE i=0; i Tato funkce byla vytvořena pro experimentování. Vezme ukazatel na pole jednobajtových dat, počet těchto bajtů a adresu čipu. Ve skutečnosti jde o pokus o přenos všech dat v jedné relaci a ne o jeden bajt na relaci. Funkce funguje, ale nevešla se na LCD displej. Nyní se vraťme k hlavnímu programu. Po připojení knihoven předepíšeme adresu mikroobvodu. Dále vytvoříme tři funkce analogicky s lcd.h. Rozdíl je pouze v principu přenosu dat.
void com(BYTE com) ( com |= 0x08; // P3 na jedničku, aby bylo zapnuté podsvícení pcf8574_byte_out(com, ADD); // Výstup dat com |= 0x04; // E ku jedné pcf8574_byte_out(com, ADD); // Výstup dat com &= 0xFB; // E na nulu pcf8574_byte_out(com, ADD); // Výstup dat } Tato funkce pouze odesílá příkazy na displej. První řádek se tedy objevil s logickým přidáním příkazu z 0x08. Tato byaka je potřeba kvůli tomu, že bajty nepřenášíme přímo do LCD portu, ale přes náš opakovač. To znamená, že pokud jsme odeslali bajt a pak potřebujeme na výstup pouze jeden bit, pak pokud budete chtít, přiřadí potřebný bit předchozímu bajtu a pošle jej znovu na port. To je takové mrazení. Sčítání s 0x08 je nutné pro trvalé udržení jedničky na třetí číslici. Pamatujete si podsvícení? Právě tento doplněk zapíná podsvícení. Poté zavoláme funkci přenosu bajtu na sběrnici. Psalo se o tom výše. Poté přeneseme byte přes sběrnici do mikroobvodu. Dále byste ji měli nastavit na jednotku E, což ve skutečnosti dělá logické přidání bajtu s 0x04. Po vynulování E. Jakýkoli příkaz tedy můžete odeslat na displej pouze předáním samotného příkazu jako argumentu. void init(void) ( _delay_ms(30); // Pauza po zapnutí com(0x30); // Přepnutí do 4bitového režimu _delay_us(40); // Zpoždění provedení příkazu com(0x30); // Přepnutí do 4bitového režimu _delay_us(40); // Zpoždění provedení příkazu com(0x30); // Přepnutí do 4bitového režimu _delay_us(40); // Zpoždění provedení příkazu com(0x20); // Přepnutí do 4bitového režimu _delay_us(40); // Zpoždění provedení příkazu com(0x20); // Nastavení parametrů com(0x80); // Nastavení parametrů com(0x00); // Vypnout obrazovku com(0x80); // Vypnout obrazovku com(0x00); // Vymazání displeje com(0x10); // Vymazání displeje com(0x00); // Nastavení vstupního režimu com(0x60); // Nastavení vstupního režimu com(0x00); // Zapnutí displeje se zvoleným kurzorem com(0xCO); // Zapnutí displeje se zvoleným kurzorem } Tato funkce se týká pouze inicializace displeje. Posloupnost příkazů je převzata z datového listu na LCD displeji. void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Předání vysokých 4 bitů data_h |= 0x04; pcf8574_byte_out(data_h, ADD); // Předá vysoké 4 bity data_h &= 0xF9; pcf8574_byte_out(data_h, ADD); // Předá vysoké 4 bity pcf8574_byte_out(data_l, ADD); // Pass low 4 bits data_l |= 0x04; pcf8574_byte_out(data_l, ADD); // Pass low 4 bits data_l &= 0xF9; pcf8574_byte_out(data_l, ADD); // Pass low 4 bits } Tato funkce odesílá data na LCD. Provádí se stejným způsobem jako příkazy s tím rozdílem, že přenos bajtu probíhá nejprve s vysokým nibble a poté s nízkým. A zbytek je stejný. void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) Tato funkce je čistě pro předání řetězce na displej. Vlastně to s naším tématem nemá nic společného.

Projekt pro AtmelStudio 6.2

Kompetentní 01.08.15 17:11

Chybí čárka. Správně: "AHOJ SVĚTE!" A toto zařízení je naostřeno nejen pro HD44780. Pull-up rezistory jsou umístěny ze strany masteru. Podle specifikace se data zapisují do řadiče LCD v sestupném E. Odtud je první funkce zjednodušena: void com(BYTE com) ( com |= 0x08; // podsvícení pcf8574_byte_out(com | 0x04, ADD);/ / Výstup dat pcf8574_byte_out(com , ADD); // E na nulu ) Ano a zbytek může být také výrazně méně. Například void char_out(BYTE data) budou pouze dvě volání a ještě více bez dalších proměnných. Inicializace LCD byla provedena s porušením specifikace časování.

Alexey 02.08.15 19:11

Kvůli chybějící čárce nebude trpět displej. Toto zařízení je právě navrženo speciálně pro displeje s tímto nebo podobným ovladačem. Ale je to mikroobvod, který je opravdu jednoduchým expandérem portů. Souhlasím s E. Jsou potřeba další proměnné. Pokud předáte argument funkci a provedete některé akce s logikou, může dojít k závadám. Už se s tím setkal. Inicializace se provádí bez porušení časování. Dokumentace říká, že mezi příkazy je pauza 40 µs. Vzhledem k tomu, že přenos probíhá přes i2c sběrnici, která je zase softwarová a pomalá, jsou lhůty více než splněny. Pokud nejste moc líní, tak napište vlastní verzi a pošlete mi ji. zveřejním to. Nakonec jsou tyto stránky určeny pro amatérské publikum a každý, kdo chce, může vyjádřit svůj názor a vizi pro život MK.

Alexey 06.08.15 09:14

Přidány časování při inicializaci displeje na poznámku respektovaného „kompetentního“

Dmitrij 14.6.16 21:57

Dobrý den, Alexeyi, do generátoru kódu můžete přidat knihovnu pro práci s PCF8574.

Alexey 14.6.16 22:32

Budu myslet.))

ruslan 21.12.16 19:54
Alexey 21.12.16 21:53

Ach jo. Zejména kód na asme. Arduiners to maximálně ocení)))

Py.sy.
I když se nedíváte na asm, pak je program napsán pod řadičem PIC. Jsou to "velmi" užitečné informace pro lidi z AVR? zejména pro začátečníky))) Nemám nic proti PIC, ale i PIC a AVR mají různé asm. A co se týče detailů LCD displeje, můžete se podívat))) Pravda, psal jsem to i pod CVAVR, ale všechny příkazy byly seřazeny a seřazeny. Ale v každém případě si sami rozhodněte, kde je to napsáno srozumitelněji))) Autor píše, čtenář si vybírá.

GeK 04.01.17 12:52

"Adresa čipu I2C (výchozí je 0x4E"

Horní 4 bity adresy jsou pevné,
prefix PCF8574 je 0100 a PCF8574A je 0111
Spodní 3 bity závisí na stavu vstupů mikroobvodu A2-A0. Ve výchozím nastavení jsou všechny 3 propojky otevřené, adresa mikroobvodu je 0111111.
// A2 A1 A0 PCF8574 PCF8574A
// 1 1 1 0x20 0x38
// 1 1 0 0 x 21 0 x 39
// 1 0 1 0x22 0x3A
// 1 0 0 0x23 0x3B
// 0 1 1 0x24 0x3C
// 0 1 0 0x25 0x3D
// 0 0 1 0x26 0x3E
// 0 0 0 0x27 0x3F

Alexey 4.1.17 14:27

Něco jsi popletl.
Výtah z dokumentace pro mikroobvod

0b01001110 je 0x4E
Takže tady je všechno správně. A pokud potřebujete změnit adresu, stačí ji změnit v definici.

Jurij 14.12.17 21:26

Dobrý den! A pro práci s adaptérem na PCF8574 můžete také použít funkční kód lcdgotoxy a lcdclear.

Alexandr 20.05.18 18:14

Dobrý den! jak zobrazujete ruský text.

Alexey 20.05.2018 23:04

Jedná se o domácí displej od MELT. Na památku má všitou azbuku.

Alexandr 21.05.18 04:55

Dobrý den! Píšu jako vy v projektu pro AtmelStudio 6.2 "ЁPҐBET MҐP!" vystupuje v pořádku
a když napíšeš "AHOJ SVĚTE!" vynáší všechny druhy nesmyslů. mám dva
varianta displejů v jednom je šitá v azbuce. druhý Číňan.

Alexey 21.05.2018 9:22

Nejprve bych napsal testovací program. Výčet celé paměti se zobrazením znaků a jejich adres. A pak zjistit, v čem je problém. Tabulka znaků s největší pravděpodobností neodpovídá tabulce ASCII.

Andrej 03.09.18 08:32

Dobré odpoledne!

Nemůžete nahrát schéma pro Proteus?

Andrej 03.09.18 10:22

Nebo se v Proteuse nikdo nepřihlásil?

Andrej 03.09.18 10:56

Přišel na main_init

Pavel 30.05.19 23:35

Zajímavá věc, adresa displeje je 0x4E, a pokud je stejný displej připojen k arduinu, pak je adresa 0x27

Pavel 31.05.19 11:04

Děkuji mnohokrát za vaši práci! Prohledal jsem celý internet a žádný z výše uvedených příkladů nefunguje kromě toho vašeho. Jediná věc je, že v archivu projektu nejsou zpoždění _delay_ registrována ve funkci inicializace zobrazení a nefunguje podle toho

Alexey 6. 1. 2019 9:52

No, tohle je spíš demo projekt. Pro dobro je potřeba přepsat knihovnu axlib, ale vzhledem k tomu, že se STM32 a STM8 pohybují mílovými kroky, nemá AVR vůbec smysl.

Pavel 5.6.19 12:57

STM nemá obaly DIP, je složitější vyrobit desky plošných spojů. Pro mé projekty mi schopnosti AVR s rezervou stačí, na jednu Atmegu 8 se toho vejde hodně

Alexey 05.06.19 15:20

Ano, ale kolik stojí Atmega8 a stm8s003)))

Dmitry 6. 7. 2019 00:41

Ahoj Alexey.
Můžete mi prosím říct, jak číst stav portu z pcf8574?
Chci udělat externí jednotku, 8 GPIO na sběrnici i2c - to je vše.

Dmitry 07.06.19 17:56

Odpovím si sám
Funkce vrací bajt – stav portů mikroobvodu
uint8_t pcf8574_byte_rcv(uint8_t addr)
{
uint8_t ask = ACK;
addr |= 0b01; //ČÍST
uint8_tdata=0;
i2c_start();
ask = i2c_send_byte(addr);
if(!zeptat se) data = i2c_read_byte(NACK);
i2c_stop();

vrátit data;
}

Pavel 6. 7. 2019 20:37

Kolik to stojí, 150 rublů, za cenu relé obecně), ale jak množíte desky pro STM? LUT je nespolehlivý, CNC router si není jistý, co zabere (nezkoušel)

LCD displej- častý host v projektech arduino. Ve složitých obvodech ale můžeme mít problém s nedostatkem Arduino portů kvůli nutnosti připojit shield, který má hodně pinů. Cesta ven v této situaci může být I2C/IIC adaptér, který pomocí pouhých 4 pinů připojí téměř standardní štít Arduino 1602 k deskám Uno, Nano nebo Mega. V tomto článku uvidíme, jak propojit LCD obrazovku s rozhraním I2C, jaké knihovny lze použít, napíšeme krátký příklad náčrtu a analyzujeme typické chyby.

Displej z tekutých krystalů LCD 1602 je dobrou volbou pro výstup znakových řetězců v různých projektech. Je to levné, existují různé modifikace s různými barvami podsvícení, můžete si snadno stáhnout hotové knihovny pro náčrty Arduino. Hlavní nevýhodou této obrazovky je ale fakt, že displej má 16 digitálních pinů, z nichž je potřeba minimálně 6. Proto použití této LCD obrazovky bez i2c přináší vážná omezení pro desky Arduino Uno nebo Nano. Pokud není dostatek kontaktů, budete si muset koupit desku Arduino Mega nebo uložit kontakty, včetně připojení displeje přes i2c.

Stručný popis LCD 1602 pinů

Podívejme se blíže na piny LCD1602:

Každý ze závěrů má svůj účel:

  1. Uzemnění GND;
  2. Napájení 5 V;
  3. Nastavení kontrastu monitoru;
  4. Příkaz, data;
  5. Zápis a čtení dat;
  6. umožnit;

7-14. Datové linky;

  1. Plus podsvícení;
  2. Mínusové podsvícení.

Specifikace displeje:

  • Typ symbolického zobrazení, je možné načíst symboly;
  • Led světla;
  • Ovladač HD44780;
  • Napájecí napětí 5V;
  • Formát 16x2 znaků;
  • Rozsah provozních teplot od -20C do +70C, rozsah skladovacích teplot od -30C do +80C;
  • Pozorovací úhel 180 stupňů.

Schéma zapojení pro LCD na desku Arduino bez i2C

Standardní schéma pro připojení monitoru přímo k mikrokontroléru Arduino bez I2C je následující.

Vzhledem k velkému počtu kontaktů, které je třeba připojit, nemusí být dostatek místa pro připojení potřebných prvků. Použití I2C snižuje počet vodičů na 4 a obsazené piny na 2.

Kde koupit LCD obrazovky a štíty pro arduino

LCD obrazovka 1602 (a verze 2004) je poměrně oblíbená, takže ji snadno najdete jak v tuzemských internetových obchodech, tak na zahraničních stránkách. Zde je několik odkazů na nejdostupnější možnosti:

Modul modré obrazovky LCD1602+I2C kompatibilní s Arduino Jednoduchý displej LCD1602 (zelené podsvícení) levnější než 80 rublů Velká obrazovka LCD2004 s I2C HD44780 pro arduino (modré a zelené podsvícení)
Displej 1602 s adaptérem IIC a modrým podsvícením Další verze LCD1602 s pájeným I2C modulem Port IIC/I2C/TWI/SPI modul adaptéru pro 1602 Shield kompatibilní s Arduino
RGB podsvícený displej! LCD 16×2 + klávesnice +Buzzer Shield pro Arduino Štít pro Arduino s tlačítky a obrazovkou LCD1602 LCD 1602 LCD displej pro 3D tiskárnu (Smart Controller pro RAMPS 1.4, Text LCD 20×4), modul čtečky karet SD a MicroSD

Popis protokolu I2C

Než probereme připojení displeje k arduinu přes adaptér i2c, pojďme si krátce promluvit o samotném protokolu i2C.

I2C / IIC(Inter-Integrated Circuit) je protokol původně vytvořený pro propojení integrovaných obvodů v rámci elektronického zařízení. Vývoj patří společnosti Philips. Protokol i2c je založen na použití 8bitové sběrnice, která je potřebná pro propojení bloků v řídicí elektronice, a adresovacího systému, díky kterému můžete komunikovat s více zařízeními po stejných vodičích. Jednoduše přeneseme data do jednoho nebo druhého zařízení a do datových paketů přidáme identifikátor požadovaného prvku.

Nejjednodušší obvod I2C může obsahovat jeden hlavní (nejčastěji mikrokontrolér Arduino) a několik podřízených (například LCD displej). Každé zařízení má adresu v rozsahu od 7 do 127. Ve stejném schématu by neměla být dvě zařízení se stejnou adresou.

Deska Arduino podporuje i2c v hardwaru. Pro připojení zařízení pomocí tohoto protokolu můžete použít piny A4 a A5.

Práce s I2C má několik výhod:

  • K provozu jsou potřeba pouze 2 linky - SDA (datová linka) a SCL (hodinová linka).
  • Připojení velkého množství předních zařízení.
  • Snížení doby vývoje.
  • K ovládání celé sady zařízení je zapotřebí pouze jeden mikrokontrolér.
  • Možný počet mikroobvodů připojených na jednu sběrnici je omezen pouze maximální kapacitou.
  • Vysoký stupeň bezpečnosti dat díky speciálnímu přepěťovému filtru zabudovanému v obvodech.
  • Jednoduchý postup diagnostiky vznikajících poruch, rychlé řešení problémů.
  • Sběrnice je již integrována do samotného Arduina, takže není potřeba vyvíjet další sběrnicové rozhraní.

nedostatky:

  • Na lince je kapacitní limit - 400 pF.
  • Potíže s programováním řadiče I2C, pokud je na sběrnici několik různých zařízení.
  • U velkého počtu zařízení je obtížné lokalizovat poruchu, pokud jedno z nich nesprávně nastaví stav nízké úrovně.

i2c modul pro LCD 1602 Arduino

Nejrychlejším a nejpohodlnějším způsobem, jak používat i2c displej v arduinu, je koupit si hotovou obrazovku s vestavěnou podporou protokolu. Ale tyto obrazovky nejsou moc a nejsou levné. Ale již bylo vydáno obrovské množství různých standardních obrazovek. Proto je dnes nejdostupnější a nejoblíbenější možností koupit a používat samostatný modul I2C - adaptér, který vypadá takto:

Na jedné straně modulu vidíme piny i2c - zem, napájení a 2 pro přenos dat. Na druhém adaptéru vidíme konektory externího napájení. A samozřejmě je na desce mnoho pinů, pomocí kterých je modul připájen ke standardním pinům obrazovky.


Výstupy I2c slouží k připojení k desce Arduino. V případě potřeby připojte externí napájecí zdroj pro osvětlení. Pomocí vestavěného trimru můžeme upravit nastavitelné hodnoty kontrastu J

Na trhu najdete moduly LCD 1602 s již připájenými adaptéry, jejich použití je maximálně zjednodušeno. Pokud jste si zakoupili samostatný adaptér, budete jej muset předpájet k modulu.

Připojení LCD obrazovky k Arduinu přes I2C

K připojení potřebujete samotnou desku Arduino, displej, prkénko, propojovací vodiče a potenciometr.

Pokud používáte speciální samostatný adaptér i2c, musíte jej nejprve připájet k modulu obrazovky. Tam je těžké udělat chybu, můžete se nechat vést takovým schématem.


LCD monitor s podporou i2c je k desce připojen pomocí čtyř vodičů – dva vodiče pro data, dva vodiče pro napájení.

  • Pin GND je připojen k GND na desce.
  • Pin VCC je 5V.
  • SCL je připojen na pin A5.
  • SDA je připojen na pin A.

A to je všechno! Žádné pavučiny drátů, ve kterých se lze velmi snadno splést. Celou komplexnost implementace protokolu i2C přitom můžeme jednoduše svěřit knihovnám.

Knihovny pro práci s i2c LCD displejem

Pro propojení Arduina s LCD 1602 přes I2C sběrnici budete potřebovat alespoň dvě knihovny:

  • Knihovna Wire.h pro práci s I2C je již dostupná ve standardním programu Arduino IDE.
  • Knihovna LiquidCrystal_I2C.h, která obsahuje širokou škálu příkazů pro ovládání monitoru přes I2C sběrnici a umožňuje usnadnit a zkrátit skicu. Musíte dodatečně nainstalovat knihovnu Po připojení displeje je potřeba dodatečně nainstalovat knihovnu LiquidCrystal_I2C.h

Po připojení všech potřebných knihoven ke skice vytvoříme objekt a můžeme využívat všechny jeho funkce. Pro testování si načtěte následující standardní skicu z příkladu.

#zahrnout #zahrnout // Připojení knihovny //#include // Připojení alternativní knihovny LiquidCrystal_I2C lcd(0x27,16,2); // Zadejte adresu I2C (nejběžnější hodnotu) a také parametry obrazovky (v případě LCD 1602 - 2 řádky po 16 znacích //LiquidCrystal_PCF8574 lcd(0x27); // Varianta pro nastavení knihovny PCF8574 void () ( lcd.init (); // Inicializace displeje lcd.backlight(); // Připojení podsvícení lcd.setCursor(0,0); // Nastavte kurzor na začátek prvního řádku lcd.print( "Ahoj"); // Napište text na první řádek lcd.setCursor(0,1); // Nastavte kurzor na začátek druhého řádku lcd.print("ArduinoMaster"); // Napište text na druhý řádek line ) void loop() ( )

Popis funkcí a metod knihovny LiquidCrystal_I2C:

  • home() a clear() - první funkce umožňuje vrátit kurzor na začátek obrazovky, druhá také, ale zároveň smaže vše, co bylo na monitoru předtím.
  • write(ch) - umožňuje vytisknout na obrazovku jeden znak ch.
  • kurzor() a noCursor() - zobrazí/skryje kurzor na obrazovce.
  • blink() a noBlink() - kurzor bliká/nebliká (pokud bylo jeho zobrazení dříve povoleno).
  • display() a noDisplay() - umožňuje povolit/zakázat zobrazení.
  • scrollDisplayLeft() a scrollDisplayRight() – posouvá obrazovku o jeden znak doleva/doprava.
  • autoscroll() a noAutoscroll() - umožňuje povolit/zakázat režim automatického posouvání. V tomto režimu je každý nový znak zapsán na stejné místo a nahradí to, co bylo dříve napsáno na obrazovce.
  • leftToRight() a rightToLeft() – Nastaví směr zobrazeného textu – zleva doprava nebo zprava doleva.
  • createChar(ch, bitmap) - Vytvoří znak s kódem ch (0 - 7) pomocí pole bitmapových bitmap k vytvoření černých a bílých bodů.

Alternativní knihovna pro práci s i2c displejem

V některých případech může při použití uvedené knihovny se zařízeními vybavenými řadiči PCF8574 dojít k chybám. V tomto případě lze jako alternativu nabídnout knihovnu LiquidCrystal_PCF8574.h. Rozšiřuje LiquidCrystal_I2C, takže by s jeho používáním neměly být žádné problémy.

Problémy s připojením LCD displeje i2c

Pokud po nahrání náčrtu na displeji nic nevidíte, vyzkoušejte následující kroky.

Nejprve můžete zvýšit nebo snížit kontrast monitoru. Často postavy prostě nejsou vidět kvůli kontrastu a režimu podsvícení.

Pokud to nepomůže, zkontrolujte správné připojení kontaktů, zda je podsvícení napájeno. Pokud jste použili samostatný adaptér i2c, zkontrolujte znovu kvalitu pájení kontaktů.

Dalším častým důvodem nedostatku textu na obrazovce může být nesprávná adresa i2c. Zkuste nejprve změnit adresu zařízení ve skice z 0x27 0x20 nebo na 0x3F. Různí výrobci mohou mít různé výchozí adresy. Pokud to nepomůže, můžete spustit skicu skeneru i2c, která naskenuje všechna připojená zařízení a hrubou silou určí jejich adresu. Příklad náčrtu skeneru i2c.

Pokud obrazovka stále nefunguje, zkuste odpájet adaptér a připojit LCD obvyklým způsobem.

Závěr

V tomto článku jsme se zabývali hlavními problémy používání LCD obrazovky ve složitých projektech Arduino, když potřebujeme uložit volné piny na desce. Jednoduchý a levný adaptér i2c vám umožní připojit 1602 LCD obrazovku, která zabírá pouze 2 analogové piny. V mnoha situacích to může být velmi důležité. Cenou za pohodlí je nutnost použití přídavného modulu – převodníku a knihovny. Podle našeho názoru se nejedná o vysokou cenu za pohodlí a použití této funkce v projektech vřele doporučujeme.