Lekce 7 - modul displeje z NOKIE 5110
15.02.2013 15:59Zdravím všechny při naší další lekci, ve které si k Arduinu připojíme modul dipleje z dnes již legendárního mobilního telefonu NOKIE 5110. Jeho velikost je 1,6" s rozlišením 84 na 48 bodů. Jedná se samozřejmně o monochromatický displej. K sehnání je již jako osazený modul (viz fotografie) se zabudovaným podsvětlením. Jeho cena se bude pohybovat okolo 100 Kč.
Zapojení vývodů na modulu:
- 1. RST
- 2. CE
- 3. IN
- 4. CLK
- 5. +3,3V
- 6. Podsvětlení - na mém modulu připojeno k zemi
- 7. GND
Zapojení vývodů modulu se může na modulech od různých výrobcu lišit, přočtetě se dokumentaci od výrobce. Napájení displeje je realizováno z Arduina pomocí pinu s vyvedeným napětím 3,3V hned vedle 5V pinu (pozn.: Zkoušel jsem napájet displej i napětím 5V a nic se nestalo a zlepšil se dokonce kontrast. Vzhledem k omezeným informacím od výrobce, lze mít za to že napájení 5V je též možné). V mém případě je to:
LCD (pin) | Arduino (pin) |
1 | 7 |
2 | 6 |
3 | 5 |
4 | 4 |
5 | 3 |
6 | +3,3V (5V ??) |
7 | GND |
8 | GND |
K ovládání jsem vytvořil knihovnu pro modul displeje. Z části jsem vytvořil již napsaný kód a upravil jsem ho a nějaké nové funkce jsem přidal. Vám bude stačit stáhnout knihovnu zde (alternativní odkaz v rar) a zkopírovat jí jako v předchozí lekci do adresaře libraries.
Schéma zapojení zde nedávám. Přesto si můžete stáhnou obrázky zapojení zde a taky zde Důležité je jen zapojit správně datové vývody a napájení modulu. K Arduino je možné zase zapojit i více těchto displejů, záleží pouze na počtu volných pinů.
Program
Ted něco málo (více) k programu (ke stažení zde). Dle komentářů je snad vše jasné. Důležité je vytvořit objekt displeje pomocí funkce LCDnokia5110 lcd(7,6,5,4,3)a správně napsat čísla pinů do kterých je displej v Arduinu zapojen. Poté stačí displej inicalizovat funkcí lcd.LcdInitialise();Dále již můžeme s diplejem pracovat. Po spuštení by se na dipleji měl objevit nápis Arduino a poté obrázek žárovky s textem Lekce 7 a šipkou. a následně ukázkový text s různými šiřkami mezer, abecedou a nějakými znaky. Všechny znaky jsou uloženy v knihovně jak se sami můžete podívat. Je tam uloženo prvních 127 znaků ASCII code. Česká diakritika chybí ale knihovnu si o daší znaky můžete rozšířit. Jak je vidno, každé písmeno se skláda z pěti 8 bitových vertikálních proužků. Poslední nejvišší bit je vždy 0. Pro názornou ukázku na obrázku, jak vytvořit data pro vykřičník:
Data pro tento znak tedy budou:
{0x00, 0x00, 0x00, 0x00, 0x00} // 20 ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 ! ,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 " ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 # ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $ ,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 % ...
TIP
Já jsem si ještě v knihovně modifikoval znak ' (apostrof) na ° (stupně) a to z důvodu potřeby zobrazovatudaje o teplotě pro moje jiné projekty. V knihovně , kterou jsem vám dak k dispozici ke stažení jsem tuto modifikaci ponechal, protože si myslím, že stupně využijete častěji než apostof. Podkud tedy bude chtít zobrazit znak °, odešlěte na displej znak ' (apostrof - ALT+39). Pro příklad 39,6'C -- > 39,6°C.
Zde funkce z knihovny NOKIA5110:
lcd.ShowLogo(int miliseconds) - zobrazí na určený počet milisekund obrázek z nápisem Arduino (tuto funkci jsem přidal do knihovny NOKIA5110 jako ukázku. Data k obrázku jsou uložena již v samotné knihovně.
lcd.Clear() - smaže diplej
lcd.GotoXY(int index_bodu_zleva, int radek) - přesune kurzor na určené místo na displeji (příklad lcd.GotoXY(3,2); - přesune kurzor na 4. bod 3. řádku)
lcd.LcdString(char[]) - zobrazí na dipleje určený text (příklad lcd.LcdString("Ahoj"); - zobrazí na pozici kurzoru text Ahoj)
int lcd.CharSpace - nastaví paramer mezer mezi jednotlivými znaky. Defaultně ja nastaveno ja 1. (nastavitelná hodnota je od 0 do 2). Rozdíl je vidět na ukázkovém programu. (příklad lcd.CharSpace = 2; - nastaveví mezeru mezi znaky na 2 body)
lcd.ShowImage(const unsigned char[], int delka_zobrazeni) - zobrazí obrázek na displeji pro požadovanou dobu v milisekundách. Jak v našem ukázovém programu můžete vidět, tak data obrázku jsou uložena např. v proměné logo_lekce. Tyto data vygeneruje dobrý malý prográmek s názvem LcdAssistant (ke stažení zde). Do tohoto programu nahrajete obrázek ve formátu bmp s rozměry přesně 84 x 48 v jednobitovém rozlišení (černá - bílá). Toto by měla zvládnout většina editorů obrázků. Prográmek vygeneruje již hotová data v souboru, ze kterého jej zkopírujete do vašeho programu. Dodržujete zadané rozměry a nastavení jako na obrázku níže.
Tak doufám, že vám prográmek funguje a že vše bylo pro vás pochopitelné. Kdyby byly nějaké problémy, nebo kdyby jste našli v textu chybu, nebojte se napsat buď na mail nebo do komentářů pod článek. Na závěr přidávám video jak by měl výsledek vypadat.
———
ZpětLekce 7 - modul displeje z NOKIE 5110
Datum | 16.04.2017 |
---|---|
Vložil | Tymi |
Titulek | Re: Re: Re: float hodnota |
String cas = String(millis()/1000, DEC);
// vytvoření pomocné proměnné tisk pro
// uložení v tisknutelném tvaru,
// číslo 10 udává počet znaků zprávy
char tisk[10];
// převod proměnné cas do proměnné tisk
cas.toCharArray(tisk, 10);
// vytištění informace na displej
lcd.LcdString("Cas ");
lcd.LcdString(tisk);
———
Datum | 04.04.2015 |
---|---|
Vložil | Petr |
Titulek | delka |
Dobrý den mohl bych se zeptat jak mám udělat aby mi to tam vypsalo text a po určité době zobrazilo další?
Dík za odpověď
———
Datum | 31.01.2015 |
---|---|
Vložil | Lukáš |
Titulek | České znaky |
Jak propašovat české znaky na LCD? Například
0x30, 0x49, 0x4A, 0x49, 0x20, // ASCII-159 0x9F c s hackem
———
Datum | 02.02.2015 |
---|---|
Vložil | Jardo |
Titulek | Re: České znaky |
Aký koľvek znak sa da nakodiť , len otvor subor nokia5110.c a poprepisuj hodnoty v void LCDnokia5110::LcdCharacter(char character)
uplne easy Lukaši :D
———
Datum | 04.02.2015 |
---|---|
Vložil | Lukáš |
Titulek | Re: Re: České znaky |
Díky Jaro, to je taky řešení, ale jak přímo posílat z arduina znaky bez konverze z nepoužívaných znaků?
Myslím tím: LcdString ("Čau světe");
THX
———
Datum | 19.05.2015 |
---|---|
Vložil | Adam |
Titulek | Re: Re: Re: České znaky |
To by mě taky zajímalo jak na to, zorvna to tu řeším, ale nedaří se.
———
Datum | 11.10.2014 |
---|---|
Vložil | astromik |
Titulek | Pauza před resetovacím impulzem |
Díky za návod.
Chtěl bych se podělit o jednu zkušenost.
Když jsem připojil displej k Arduinu "NANO", tak všechno fungovalo, jak má.
Když jsem ale ten samý displej připojil k Arduinu "MINI", tak se po zapnutí napájení jen rozsvítil podsvět, ale nic se nezobrazilo. Musel jsem ručně stisknout resetovací tlačítko na "MINI" a pak to teprve začalo fungovat.
Zjistil jsem, že je to způsobeno tím, že se displej v tom "MINI" nestačil zresetovat po zapnutí napájení.
"MINI" totiž nemá bootloader a program se začne vykonávat okamžitě po zapnutí napájení.
Podle katalogového listu je potřeba před RESETovacím impulzem displeje počkat alespoň 30ms od náběhu napájení.
Jednou z možností by bylo nastavení některého FUSE bajtu, který se stará o časovou prodlevu startu programu po zapnutí napájení.
Vzhledem k tomu, že jsem si první Arduino totálně zablokoval právě kvůli operacím s FUSEmi, tak jsem se do toho raději nehrabal.
Druhá možnost byla přidání 30ms pauzy před ten resetovací impulz v podprogramu:
"void LCDnokia5110::LcdInitialise(void)"
v souboru "Nokia5110.cpp"
.....
delay(30);
digitalWrite(PIN_RESET, LOW);
delay(1);
digitalWrite(PIN_RESET, HIGH);
.....
S touhle úpravou už to nabíhá bez problému.
———
Datum | 28.07.2014 |
---|---|
Vložil | Pavel |
Titulek | Více obrázků za sebou? |
Zkoušel někdo 4 různé obrázky za sebou?
Jde o to, že když funkce obsahuje 4 a více různých obrázků, začne to vypisovat nesmysly. Nikde nevidím žádnou spojitost čím by to mohlo být.
———
Datum | 31.07.2014 |
---|---|
Vložil | Pavel |
Titulek | Re: Více obrázků za sebou? |
Tak asi nikdo :-D zjistil jsem, že se do RAMky nevejdou víc jak 3 obrázky, takže přetékala. Vyřešil jsem to tím, že tahám obrázky z externí paměti, konkrétně z SD karty
———
Datum | 10.07.2014 |
---|---|
Vložil | Radek |
Titulek | kontrast |
Dobrý den,
je možné zvýšit kontrast displaye? Zkusil jsem ho napájet 5 V místo 3 a je to lepší, ale furt nic moc. Když se na display dívám z úhlu cca 45°, tak je to lepší.
Děkuji