Arduino – Displeje – NodeMCU #5

Vítejte u dalšího dílu ze seríe o NodeMCU. Dnes se podíváme na dva druhy displejů, které můžeme připojit k Arduinu. Občas se vám může hodit zobrazovat aktuální data. Pokud potřebujete zobrazovat jednoduché data, může vám stačit znakový displej. Ukážeme si tedy jak nejjednušeji pracovat s 16 znakovým, dvouřádkovým LCD displej. Na tom lze zobrazi například popisek a na druhý řádek aktuální data. Takto můžete postupně cyklicky zobrazovat data. Avšak nehodí se to pro větší objem informací. Proto je tu druhý typ LCD displej. Na ten lze zobrazit více informací najednou.

Znakový displej

Jak už jsem říkal, já použím běžný dvouřádkový, 16 znakový displej s modrým podsvícením. Dnes si ukážeme tu nejjednoduší variantu a to s I2C převodníkem. Díky převodníku nemusíme řešit množství kabelů a potenciometr pro regulaci podsvícení. Stačí nám VCC, GND a kabely pro připojení SCL a SDA. Jednoduché. Navíc již můžeme použít hotovou knihovnu pro ovládání. Převodník nás vyjde na +- 150 korun.

Knihovna by měla být již ve Vašem Arduino IDE, případně ji najdete na adrese https://github.com/arduino/Arduino/tree/master/libraries/LiquidCrystal.

Připojení k Arduino je jednoduché, připojte SDA a SCL na displeji i na Arduinu, zapojte napájení. U NodeMCU je SDA GPIO 04 a SCL GPIO 05. Nezapomeňte displej připojit na 5 V! Na 3,3 V nemusí občas fungovat korektně.

Nejdříve je potřeba zjistit na jaké sběrnici displej pracuje, pokud to nemáte nikde uvedeno, můžete použít tento program:

 

#include <Wire.h>

void setup()
{
Wire.begin();
Serial.begin(115200);
}

void loop()
{
byte error, address;
int nDevices;

Serial.println("Skenuji...");

nDevices = 0;
for(address = 1; address < 127; address++ )
{

Wire.beginTransmission(address);
error = Wire.endTransmission();

if (error == 0)
{
Serial.print("I2C zarizeni nalezeno na adrese 0x");
if (address < 16)
Serial.print("0");
Serial.print(address, HEX);
Serial.println(" !");

nDevices++;
}
else if (error==4)
{
Serial.print("Neznama chyba na adrese 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}

if (nDevices == 0)
Serial.println("Zadne zarizeni nenalezeno\n");
else
Serial.println("Hotovo. (Dalsi sken za 5 sec...)\n");

delay(5000);

}

Nyní k samotnému programu pro displej:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

Nahrajeme potřebné knihovny.

LiquidCrystal_I2C lcd(0x3F,16,2);

Definujeme nastavení displeje – sběrnici, počet znaků a počet řádků.

void setup()
{
lcd.init();
lcd.backlight();
}

Inicializujeme displej, na druhém řádku zapneme podsvícení.

void loop()
{
lcd.clear();
lcd.print("Zdravim divaky");
delay(4000);

lcd.clear();
lcd.print("U tohoto dilu");
delay(4000);
}

Před vypsáním znaků musíme současné znaky vymazat, jinak se budou zobrazovat s předchozíma. Doporučuji používat zpomalení, schválně si do loopu dejte pouze clear() a poté print(), znaky na displeji budou blikat – displej se moc rychle přepisuje.

Další funkce naleznete zde.

DWIN (DMT48270T043_01WT)

A nyní přejdeme ke grafickému displeji. Já používám displej od značky DWIN, rozlišení je 480×272, velikost 4,3 palců a resistivní dotyková vrstva. Příkazy se odesílají přes sériovou linku (RS232). Displej uvádí možnost komunikace přes TTL, to se mi ale nepodařilo zprovoznit. Proto příkazy z Arduina musím vést do převodníku, který příkazy komunikaci převede na RS232. V převodníku využívám čip MAX232 a několik kondenzátorů.

K displeji je dodáván software pro plné nastavení displeje. Zatím nemám vyzkoušenou možnost nahrávání obrázků do displeje přímo přes Arduino, například s využitím SD kartového shieldu. Displej má vlastní paměť pro ukládání dat, tedy vám stačí pouze nahrát data přes PC a poté jen přenášet textové informace. Displej bohužel nepodporuje UTF-8 kódování, zapomeňte tedy na diakritiku.

V programu nám stačí pouze práce s funkcí Serial. Nastavíme si rychlost linky a poté již stačí odesílat jednotlivé příkazy v hexadecimální soustavě. Příkazy pro tento displej naleznete zde.

Nyní ukázka jednoduchého příkazu, který vymaže displej.

void setup() {
  Serial.begin(115200);

}

void loop() {
  delay(5000);

  lcdClear();

  delay(50000);
}

void lcdHeader() {
  Serial.write(0xAA);
}

void lcdFooter() {
  Serial.write(0xCC);
  Serial.write(0x33);
  Serial.write(0xC3);
  Serial.write(0x3C);
}

void lcdClear() {

  lcdHeader();

  Serial.write(0x52);

  lcdFooter();
}

Funkce lcdHeader() nám určuje začátek příkazu. Funkce lcdFooter() jeho konec. V samotné funkci lcdClear() je již pouze příkaz na vymazání.

Nyní rada jak odesílat text. ASCII znaky nemusíte převádět do hexadecimální soustavy, stačí použít místo funkce Serial.Write() funkci Serial.Print(). Nepřemýšlejte nad tím jak jednotlivé znaky převádět do hexadecimální soustavy.

Čtení dat z displeje si dnes ukazovat nebudeme. V tomto ohledu ještě nemám dostatečné zkušenosti.

Doufám, že jsem Vás tímto návodem motivoval k nákupu nějakého grafického displeje. V dalším díle této série se koukneme na teplotní čidla.

Odkazy na stažení souborů:

Program pro skenování I2C sběrnice – https://mega.nz/#!ZkMgGJLR!ewaSzRUmYIb9rvXHtsgG_aGEe7QOb2fj10uf0kimA7s

Program pro displej – https://mega.nz/#!w1MHGbDB!3VZ-E6lR76bDvFUGqgs-7x0zf6j_K4WZ-pPOvHeAYp8

Program pro DWIN – https://mega.nz/#!w0cnHYoK!_IlO8ik8n9t0Tl0QAaJ0qMq1oWAmBVaoPyYZirX-cTc

Příkazy pro DWIN – https://mega.nz/#!Bk8mGC6B!-pWFoKvohTjlMMp9zZIHfhxxBJLQJ5dRCHRxlsIyNwA

Ovládací program pro DWIN – https://mega.nz/#!wgUxhBza!0SpW0U_xGpEeylkpKjQoKJZOTYjRybrP3HsKiHQ1CVI

Video k článku:

Pokud jste nalezli nějakou chybu, prosím, upozorněte nás označením textu a zmáčknutím zkratky Ctrl+Enter.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *