Snímanie analógových veličín a zobrazovanie na displeji

Veľa aplikácií pre Arduino potrebuje priebežne, alebo v prípade potreby zobrazovať informácie a možnosť zobrazovania sa hodí aj pri ladení aplikácie, napríklad na vypísanie informácií o aktuálnom stave, hodnotách premenných a podobne. Tento diel bude zameraný aj na snímanie hodnôt z analógových vstupov a tam sa možnosť výpisu aktuálnych hodnôt obzvlášť hodí.

Praktické ukážky k téme článku sú na videu:

https://youtu.be/mcQZW5UcVm8

Pri ladení aplikácie môže doska Arduino generovať textový výstup cez sériové rozhranie, konkrétne cez USB, po tom istom kábli pomocou ktorého Arduino programujete. Ukážeme príklad najjednoduchšej sériovej komunikácie. Najskôr vypíšeme statický text.

void setup()
{
  // Inicializácia sériovej komunikácie
  Serial.begin(9600);
}

void loop()
{
  Serial.println("Ahoj ja som Arduino");
  Serial.println("a komunikujem cez sériový port");
  while(1);
}

Komunikáciu môžete monitorovať na vývojárskom počítači. V menu nástroje aktivujte položku Monitor sériového portu a môžete sledovať komunikáciu, prípadne aj posielať znaky. Takto môžete nechať vypísať aktuálne hodnoty z analógových vstupov.

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int nPotenciometer = analogRead(A0);
  Serial.println(nPotenciometer);
}

Táto metóda je použiteľná len vo fáze vývoja. Často je však potrebné pomocou textového výpisu niečo oznámiť používateľovi. Na tento účel môžete použiť nejaký typ displeja.

Rôzne typy displejov vhodné pre Arduino (vľavo). Na jednoduché konštrukcie a ladenie je najvhodnejší dvojriadkový alfanumerický displej v cene okolo 7 eur (vpravo)

V úvodnej časti sme demonštrovali najjednoduchší spôsob dvojstavovej signalizácie rozsvietením a zhasnutím LED diódy a tiež možnosť komunikácie cez sériové rozhranie RS323. S dvojstavovou signalizáciou vystačíte málokedy, monitorovanie sériovej komunikácie je nepraktické, takže ideálny spôsob ako aplikácia niečo oznámi okoliu je zobraziť to na displeji. Pre začiatok je najlepším riešením viacriadkový LDC displej s možnosťou podsvietenia, takže displej je dobre čitateľný cez deň aj v tme. Sedem segmentové LED displeje sú viac efektné, než praktické.

LCD displeje

Rozdeľujú sa na grafické a znakové. Grafický displej umožňuje na kontinuálnej matici bodov zobraziť grafické obrazce a samozrejme aj text rôznym fontom. Znakové displeje sú v podstate tiež maticové, akurát matice pre každý znak sú oddelené. Znakové displeje umožňujú zobraziť rôzne dlhý text v jednom, alebo viacerých riadkoch.  Displeje sú k dispozícii v konfigurácii 8×1, čiže 8 znakov v jednom riadku až po 40 x 4, čiže 4 riadky, pričom každý z nich môže mať 40 znakov. Programové ovládanie týchto displejov je pomerne jednoduché. Nastavíte kurzor na miesto kde chcete mať znak, alebo začiatok textu a pošlete znak, alebo text.

Alfanumerické displeje využívajú ako radič obvod Hitachi HD44780 a vývojové prostredie pre Arduino umožňuje prilinkovať knižnicu, ktorá podporuje všetky LCD displeje s týmto radičom. Radič má riadiaci a dátový register. V pamäti ROM má napevno uložené definície 208 znakov v matici 5 × 8 bodov a 32 znakov v matici 5 × 10 bodov. Zlou správou pre našinca je, že tam nie sú znaky so slovenskou diakritikou. Tie môžete v matici 5 × 8 bodov definovať do pamäte typu CGRAM. Obrazová pamäť RAM obsahuje aktuálne zobrazený text.

V príklade využijeme populárny maticový displej LCD 1602. Dešifrovať označenie je jednoduché – displej má dva riadky po 16 znakov. Cena sa pohybuje okolo 5 eur.Displeje s HD44780 majú 16 pinov, číslované sú zľava doprava:

1          VSS      GND –0V

2          VDD     +5 V

3          VL        regulácia kontrastu, sem sa pripája potenciometer 10k

4          RS        Prepínanie údaje/príkazy

5          R/W     Read/Write, HIGH pre čítanie, LOW pro zápis.

6          E          Enable – pri zmene z HIGH na LOW sa vykoná príkaz

7-14     D0-D7   Datové piny

15        BLA      Podsvietenie, pripojte na 5V, ale funguje aj na 3,3V

Schéma zapojenia displeja LCD1602 pomocou ôsmych dátových bitov

Medzi vývody Vss, Vdd a Vo (piny 1, 2 a 3 displeja) sa odporúča zapojiť trimer, alebo potencioimeter na nastavenie kontrastu. Na vývody LED+ a LED- (piny 14 a 15) je potrebné pripojiť napájacie napätie a GND, aby fungovalo podsvietenie displeja.

Displej môžete k Arduinu pripojiť v 8-bitovom, alebo 4-bitovom móde. Pri 8-bitovom móde sú zapojené všetky dátové piny D0-D8 a prenáša sa naraz všetkých 8 bitov. Nevýhodou je obsadenie viacerých portov na mikrokontrolérovej doske. Štvorbitový mód využíva iba štyri dátové vodiče D4 až D7 a osembitové dáta sa prenášajú na dva krát. Najskôr sa pošlú 4 horné bity a potom 4 dolné bity. Je to nepatrne pomalšie. No vzhľadom na malý objem prenášaných informácií to vo väčšine prípadov nevadí.

Porovnanie zložitosti pripojenia displeja LCD 1602 pomocou ôsmych dátových bitov a pomocou 4 vodičov cez zbernicu I2C

Dátové a riadiace piny displeja môžete pripojiť na ľubovoľný digitálny dátový vývod Arduina, samozrejme to musíte deklarovať pri inicializácii softvérovej knižnice. Najčastejšie sa displej pripája výstupy na D2 až D12. Populárna knižnica LiquidCrystal je súčasťou vývojového prostredia. Stačí ju k vášmu kódu prilinkovať príkazom #include <LiquidCrystal.h>.

Kód na zobrazenie dvojriadkového textu je veľmi jednoduchý:

#include <LiquidCrystal.h>
// Inicializácia knižnice podľa zapojenia pinov
LiquidCrystal lcd(12,11,10,9,8,7,6,5,4,3,2);

void setup()
{
  lcd.begin(16,2); // Počet znakov a riadkov
  lcd.setCursor(0,0); // Kurzor na riadok 1
  lcd.print("PC REVUE"); // Text do prvého riadku.
  lcd.setCursor(0,2); // Kurzor na riadok 2
  lcd.print("Arduino pokusy"); // Text do druhého riadku
}

void loop()
{}

Zapojenie pinov pri inicializácii sa pre 8-bitové zapojenie definuje v poradí RS, EN, D0, D1, D2, D3, D4, D5, D6, D7. Pri 4-bitovom zapojení sa piny definujú v poradí: RS, EN, D4, D5, D6, D7.

Metóda lcd.begin(16, 2); objektu lcd inicializuje displej. Parametre udávajú počet znakov na riadok a počet riadkov. V našom jednoduchom príklade, ktorý zobrazuje statický text, je celý kód v metóde Setup. V reálnej aplikácie sa v slučke loop() príkazom lcd.SetCursor(); nastavuje pozícia kurzora na displeji. Pozícia 0,0 je v ľavom hornom rohu displeja. Príkaz lcd.print("text"); vypíše textový reťazec na pozíciu kurzora.

Zapojenie fotočlenu na analógový vstup A0. Vpravo je príklad obvodu na testovanie spínača osvetlenia

Príklad kódu na výpis hodnoty načítanej z analógového vstupu A0

#include <LiquidCrystal.h>
// Inicializácia knižnice podľa zapojenia pinov
LiquidCrystal lcd(12,11,10,9,8,7,6,5,4,3,2);

void setup()
{
  lcd.begin(16,2); // počet znakov a riadkov
  lcd.setCursor(0,0); // Kurzor na riadok 1
  lcd.print("Analog vstup"); // Text do prvého riadku.
}

void loop()
{
  int nPotenciometer = analogRead(A0);
  lcd.setCursor(0,2); // Kurzor na riadok 2
  lcd.print("      "); // Vyčisti riadok
  lcd.setCursor(0,2); // Kurzor na riadok 2
  lcd.print(nPotenciometer); // Text do druhého riadku
  delay(50);
}

Ak je pre konkrétnu konštrukciu veľa aj 6 pinov pri 4-bitovom zapojení, môžete displej pripojiť cez sériovú zbernicu I2C. Nepotrebujete špeciálny displej, k dispozícii sú dosky, ktoré sa nasadia na 16 pinový konektor displeja a pripojiť pomocou dvoch dátových pinov (SDA a SCL) + dvoch pinov na napájanie. Cena takéhoto modulu je 2 eurá.

Modul k displeju LCD 1602 na pripojenie cez I2C. Niektoré typy displejov majú tento model priamo integrovaný.

Z webu si stiahnete knižnicu LiquidCrystal_I2C a uložíte ju do adresára libraries. Kód na zobrazovanie je aj v tomto zapojení veľmi jednoduchý. Na vstupe A0 je v tomto prípade pripojený fotoodpor.

#include <LiquidCrystal_I2C.h>
// Vytvorí objekt LCD
LiquidCrystal_I2C lcd(0x3F,16,2);

void setup()
{
  pinMode(12, OUTPUT); // Nastav pin 13 ako výstupný

  lcd.init(); // Inicializuje displej
  lcd.backlight(); // Zapne podsvietenie
  lcd.setCursor(0,0); // Kurzor na riadok 1
  lcd.print("Intenzita svetla"); // Text do prvého riadku.
}

void loop()
{
  int nSvetlo = analogRead(A0);
  lcd.setCursor(0,1); // Kurzor na riadok 2
  lcd.print("     "); // Vyčisti riadok
  lcd.setCursor(0,1); // Kurzor na riadok 2
  lcd.print(nSvetlo); // Text do druhého riadku
  delay(1000);
}

Je pravdepodobné, že vám tento kód nebude fungovať, pretože každé zariadenie pripojené cez I2C má špecifickú adresu. Tú zadávate do konfiguračného príkazu v treťom riadku LiquidCrystal_I2C lcd(0x3F,16,2);  Zistíte ju pomocou kódu, ktorý si môžete skopírovať.  Uvádzame kompletný výpis. V našom prípade mal displej adresu 3F hexadecimálne.

#include <Wire.h>

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  while (!Serial); // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}

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

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address<127; address++ ) 
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println(" !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("Done\n");

  delay(5000); // Wait 5 seconds for next scan
}

Doplnenie displeja je pre väčšinu amatérskych konštrukcií veľkou pridanou hodnotou. Samozrejme pri napájaní z batérie treba zvážiť energetické hľadisko a vybrať LCD displej, na ktorom sú údaje viditeľné aj bez podsvietenia.


Převzato z webu Nextech se souhlasem autora.

Poznámka redakce:

K jednoduchému propojování Arduina s periferními zařízeními dobře poslouží konektorový shield, který byl popsán v samostatném článku.