Lekce 7 - modul displeje z NOKIE 5110 II. díl

23.02.2013 15:33

     Zdraví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ět

Lekce 7 - modul displeje z NOKIE 5110 II. díl

Datum
Vložil
Titulek

Re: Re: Pomoc

Díky moc už to běží.

Datum
Vložil
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
Vložil
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");

<< 1 | 2

Vyhledávání

arduino8.cz © 2015 Všechna práva vyhrazena.