Lekce 7 - modul displeje z NOKIE 5110 II. díl
23.02.2013 15:33Zdravím opět všechny po krátké době. Dnes si v pokračování 7. lekce ukážeme zapojení senzoru intenzity osvětlení. Jená se o levná modul s několika součástkami, který světlo převádí do analogové hodnoty 0-5V což se náramně hodí pro naše Arduino. Obsahuje též digitální výstup, ketrý se spíná, když intezita osvětlení dosáhne požadované hodnoty nastavené odporovým trimrem na modulu. Toto však nevyužijeme a budeme si všímat pouze analogového výstupu.
Na obrázku níže vidíte, že modul má celkem 4 piny. Popis zapojení s Arduinem je jednoduchý:
- Vcc - 5V
- GND - GND
- DO - A0
- DI - nezapojeno
Zapojení bude stejné jako v předchozím případě. Pouze změna je v tom, že displej napájím napětím 5V z Arduina a podsvětlení je zapojeno na zem přes odpor 1,2kOhm, aby mi to moc nezářilo do očí.
Vzhledem k tomu, že jsem chtěl vyjadřovat analogovou hodnotu ze senzoru jinak než číselnou formou, upravil jsem trošku naší knihovnu a přidal 3 nové funkce, které vykreslují hodnotu ve sloupci. Ukázky mužete vidět na videu níže.
Nejprve uvedu zdrojový kód pro tento program:
#include <Nokia5110.h> // LCDnokia5110::LCDnokia5110(int rst, int ce, int dc, int in, int clk) // vytvoří objekt LCDnokia5110 s názvem lcd na pinech 7,6,5,4,3 LCDnokia5110 lcd(7,6,5,4,3); // vytvoří proměnou sensorValue; int sensorValue = 0; // datový buffer pro textovou podobu hodnoty char data[5] = " "; void setup(void) { // inicializuje diplej lcd.LcdInitialise(); // vymaže displej lcd.LcdClear(); //nastaví mezery mezi pismeny na 0 bodů lcd.CharSpace = 0; //text lcd.GotoXY(4,0); lcd.LcdString("Lighting sensor"); lcd.GotoXY(2,1); lcd.LcdString("----------------"); // popisky HorizontalBaru lcd.GotoXY(0,3); lcd.LcdString("0"); lcd.GotoXY(37,3); lcd.LcdString("50"); lcd.GotoXY(69,3); lcd.LcdString("100"); void loop(void) { // přečte analogovou hodnotu z A0 sensorValue = analogRead(0); // převede hodnotu do procent a uloží jí promené "data" // slouží k zobrazení na displeji - zde nepoužito (můžete zakomentovat) // nebo použít jak budete chtít sprintf(data, "%d" , (1023 - sensorValue)/(1023/100)); //*************************************** // HorizontalBar(int Hodnota, int radek) //*************************************** // zobrazí hodnotu z proměné sensorValue // převednou na procenta na 5. řádku // pozn.: // Hodnota: 0-100 // radek: 0-5 // --- Tuto funkci obsahuje pouze knihovna Nokia5110 // --- od veze 1.2 lcd.HorizontalBar((1023 - sensorValue)/(1023/100),4); // čeká 20 ms delay(20); }
V programu vidíte funkci HorizontalBar(int Hodnota, int radek);. Tak nám vykreslí takový "progres bar" v horizontální poloze. Hodnotu pro vykreslení zadávejte v rozmezí 0 až 100. Proto je ve funkci převod analogové hodnoty do procentuelního vyjádření a vzhledem k tomu, že analogový výstup senzoru dává tím větší napětí čím je víc tma, tak si hodnotu obrátíme. Viz přepočet ve funkci (1023 - sensorValue)/(1023/100), kdyby senzor dával hodnoty opačně, tzn. čím více světla tím větší napětí přepočet by byl sensorValue/(1023/100). Pozn. výpočet jednoho procenta hodnoty není 1024/100, ale 1023/100. Vysvětlení - maximální hodnota dosažená u funkce analogRead(pin) je 1023. Rozlišení je 1024 hodnot avšak musí být započítána i nula, protože je to také hodnota. Tudíž 1% = 1023/100. Dálší paramer funkce je int radek. Můžeme tedy zapsat číslo od 0 (pro první řádek) až 5 (pro 6. řádek), je to tedy index řádku. Funkce nezobrazuje samotné popisky nebo hodnoty - v našem případě se nápis grafu (čísla 0,50 a 100) dopsal do programu zvlášť a je napsrosto volitelný. Míasto toho mužeme použít teyt Světlo a Tma atd.
Popis nových funkcí:
|
HorizontalBar(int Hodnota, int radek); Hodnota: 0 - 100 radek: 0 - 5 příklad: HorizontalBar(47,2); - zobrazí graf s hodnotou 47 na 3. řádku.
|
|
HorizontalBar2(int Hodnota, int radek); Hodnota: 0 - 100 radek: 0 - 5 příklad: HorizontalBar2(75,5); - zobrazí graf s hodnotou 75 na 4. řádku. |
|
VerticalBar(int Hodnota, int left); Hodnota: 0 - 100 left: 0 - 83 příklad: VerticalBar(80,41); - zobrazí graf s hodnotou 80 na 42. bodu zleva |
Novou knihovnu Nokia5110 v1.2, zdrojový kód a obrázky z lekce si můžete stáhnout zde.
———
ZpětLekce 7 - modul displeje z NOKIE 5110 II. díl
Datum | 03.07.2013 |
---|---|
Vložil | Aleš |
Titulek | Re: Re: Pomoc |
Díky moc už to běží.
———
Datum | 29.01.2015 |
---|---|
Vložil | Tomáš |
Titulek | Re: Re: Pomoc |
Ahoj, chtěl bych poradit jak na displeji zobrazit hodnotu se dvěma desetinnými místy (např. napětí 4.55V).
Nevím jaký příkaz pro to použít?
Stále se mi ukazuje jenom celé číslo bez desetinných míst.
Moc děkuji za radu.
———
Datum | 06.04.2015 |
---|---|
Vložil | Lada |
Titulek | Re: Re: Re: Pomoc |
Asi takto:
lcd.CharSpace = 1;
lcd.GotoXY(16,0);
lcd.LcdString("Voltmetr");
lcd.GotoXY(0,2);
lcd.LcdString("U=");
char szNumber[10]; // Musí mít dostatečnou velikost !!!
dtostrf(voltage,0,2,szNumber); //převod float na string - 0=pozice z leva, 2=počet des. míst
lcd.LcdString(szNumber);
lcd.LcdString("V");