13. Arduino LCD-näytön käyttäminen ja valikon tekeminen

Alunperin julkaistu: 16.7.2020

Viimeksi muokattu: torstai 4.2.2021

Sulautettujen laitteiden ominaisuuksin kuuluu usein näyttää käyttäjälleen tietoa tavalla tai toisella. Joskus pelkät ledit riittävät, mutta toisaalta voi olla tarve esittää tietoa numeerisesti tai ihan selkokielellä. Onneksi tämä on tehty suhteellisen helpoksi Arduinolla, LiquidCrystalDisplay -kirjaston avulla.

Näyttölaitteena käytetään HD44780 -ajuripiiriin pohjautuvaa nestekidenäyttöä. Ohjeet näytön kytkemiseen löytyy Arduino.cc sivuilta, mutta lisätään ohjeet suomeksi tällekin sivustolle.

Koska internetissä on jo olemassa paljon ohjeita, kuinka LCD-näyttöä käytetään ja ohjataan, keskitytään tässä osassa enemmänkin siihen kuinka saadaan luotua valikkorakenne, jota voidaan helposti muokata ja joka ottaa vastaan käyttäjän syötteitä esimerkiksi nappeja lukemalla. Tarkemmin LCD-näytöstä voi lukea myös hutasun sivustolta kohdasta: https://www.hutasu.net/elektroniikka/sulautettu-elektroniikka/nestekidenaytto-eli-lcd/ ja https://www.hutasu.net/mikrokontrollerit/msp430-launchpad/26-hd44780-lcd-naytto/.

Toteutetaan siis yksinkertainen valikko, mistä voidaan valita säädettäviä asioita (muuttujia) käyttöliittymän avulla.

LCD-näytön kytkentä

Jotta päästään varsinaisen valikon tekemiseen, pitää ensin kytkeä ja testata LCD-näyttö, jota projektissa käytetään. Näytön kytkentään tarvitaan Arduinolta 6 IO-pinniä, mutta tarvittaessa jos IO-pinneistä on uupelo riittää 5 pinniä. 5-pinnin kytkennässä Enable-signaali LCD-näytöltä kytketään maahan. Lisäksi kytketään 10 kilo-ohmin potentiometri säätämään näytön kontrastia.

Alla olevissa kuvissa (ovat samoja kuin osoitteessa https://www.arduino.cc/en/Tutorial/LiquidCrystalDisplay) nähdään kuinka LCD-näyttö voidaan kytkeä. Mikään pinneistä ei ole pakollinen, joten jos tarvetta on niin IO-pinnien paikkaa voi muuttaa Arduinolla. Täytyy vain muistaa koodissa muokata ne vastaamaan todellisuutta.

Arduinon LCD-näytön kytkentä koekytkentäalustalle
Arduinon LCD-näytön kytkentä koekytkentäalustalle
Arduino LCD-näytön kytkentäkaavio
Arduino LCD-näytön kytkentäkaavio

Käyttöliittymän nappien kytkentä

Valikon käyttämiseksi tarvitaan nappeja, joten kytketään Arduinolle neljä kytkintä, jotka ovat 0-aktiivisia (alustetaan ylösvedoilla, joten ei tarvita erillisiä vastuksia piirilevylle/koekytkentälevylle). Nappien IO:t voidaan vapaasti valita, mutta tässä esimerkissä on tehty seuraavasti:

Pinninumero ArduinollaMerkitys käyttöliittymässä
6Alas
7Ylös
8Oikea / OK tai vahvista / Lisää
9Vasen / Peruutus / Vähennä
Arduino LCD-valikon nappien kytkentä ja merkitys
Arduino LCD-valikko - nappien kytkentä
Arduino LCD-valikko - nappien kytkentä

Käytännössä kytkennät näyttävät esimerkiksi tältä:

Arduino LCD näyttö ja napit
Arduino LCD näytön ja nappien kytkentä

Yllä olevassa kuvassa olen kytkenyt napit erilliselle koekytkentäalustalle selvyyden vuoksi. Jos otat mallia valokuvasta, huomioi että teksti tulee näytölle ylösalaisin.

Kytkentöjen tekemisen jälkeen voidaan aloittaa valikon määrittely ja esimerkkikoodin tekeminen.

Pyrin käymään vaihe vaiheelta läpi valikon rakenteen ja kuinka valikko oikeastaan toimii, mutta oletan että lukija ymmärtää jo tässä vaiheessa hieman ylipäänsä koodien toiminnasta Arduinolla, tai missä tahansa muussa ohjelmointiympäristössä.

Valikkorakenteen suunnittelu

Aluksi pitää miettiä, mitä valikosta halutaan säätää. Yksinkertaisuuden vuoksi pyritään pitämään säädettävät asiat aika yksinkertaisena ja tämän vuoksi käytetään Arduino Uno levyltä valmiiksi löytyvää lediä joka on kytketty aina pinniin 13.

Valikko pidetään sillä tavalla yksinkertaisena, että valikossa ei ole kuin yksi alataso, joita kutsun tässä koodissa parametreiksi. Keksitään hatusta valikoita vaikkapa kolme kappaletta nimeltään Led, Speed ja Blink. Annetaan näille asetukset taikka parametreiksi On/Off (Led), Low/Medium/High (Speed) ja On/Off (Blink).

Graafisesti valikkorakenne näyttäisi esimerkiksi tältä:

Valikon tulisi toimia niin, että kun valikosta valitaan haluttu parametri niin jokin toiminto suoritetaan.

Valikkorakenteen koodaaminen

Hakukoneilla voidaan etsiä valmiiksi jo paljon erilaisia valikko-koodeja, joista otan muutaman esimerkin alle, mutta joita ei kuitenkaan tässä esimerkissä käytetä. On kuitenkin mielestäni hyvä tietää, että asioita voidaan tehdä monella eri tavalla.

Vaihtoehto 1

Arduinon project hub -sivuilta löytyy esimerkiksi alla olevalla videolla esitelty valikko:

Linkki: https://create.arduino.cc/projecthub/ianabcumming/a-simple-arduino-menu-with-an-lcd-254080

Kyseisessä koodissa valikko rakennetaan String-taulukkoon pohjautuvalla rakenteella ja liikkuminen valikossa tapahtuu pitämällä kirjaa kursorin sijainnista suhteessa valikkoon. Tämä lähestymistapa on sinänsä yleinen, koska se on varmaan helpoin ymmärtää.

Vaihtoehto 2

Toinen valikko mihin olen törmännyt onkin hieman monimutkaisempi ja sisältää paljon enemmän ominaisuuksia kuin yllä oleva. Kyseessä on ArduinoMenu -niminen, oikeastaan kirjasto, joka pitää sisällään kaikenlaisia ominaisuuksia. Tämä valikko on ehkä hieman edistyneemmille käyttäjille, mutta mainitsemisen arvoinen asia.

Linkki: https://github.com/neu-rah/ArduinoMenu.

Vaihtoehto 3

Kolmas valikkokoodi on hieman samankaltainen kuin ensimmäinen mainittu, mutta melkeinpä vielä enemmän selkeytetty. Tässä valikkorakenne pohjautuu ruutuihin ja jokainen ruutu pitää sisällään omat arvonsa. Sinänsä yksinkertainen rakenne ja nopeahko toteuttaa.

Linkki: https://diyi0t.com/building-a-menu-with-buttons-for-your-microcontroller/.

Arduino StringMenu

Kutsun tekemääni valikkokoodia nimeltä StringMenu. Kyseessä on yhdestä rivistä, olipa kuinka pitkä hyvänsä, dynaamisesti muodostettava valikkorakenne mikä voidaan vaikkapa lennosta vaihtaa (en tosin ole vielä kokeillut mutta teoriassa näin).

Valikkorakenteen koodaus on tällä kertaa tapahtunut useiden viikkojen saatossa, sillä olen halunnut keksiä jotain uutta ja omaperäistä. Tässä valikkorakenteen muodostus on täysin itse keksitty ja koitan sitä selvittää parhaani mukaan.

Valikon muodostus

Valikko muodostetaan niin, että kirjoitetaan string-tyyppiseen muuttujaan (char-taulukko käytännössä) haluttu valikon rakenne. Ohjelma muodostaa valikkorakenteen kirjoitetusta rivistä automaattisesti ja muodostaa tallennuspaikat parametreille. Valikon nimet ja parametrit näytetään LCD-näytöllä siinä muodossa kuin ne on kirjoitettu.

Syntaksi

Syntaksi on valikon muodostamiseksi seuraava:

  • Aloitetaan valikko puolipisteellä --> ;
  • Kirjoitetaan ensimmäisen valikon nimi esim. "Led" ilman lainausmerkkejä.
  • Lopetetaan valikon nimi pisteeseen --> .
  • Kirjoitetaan ensimmäisen parametrin nimi ja päätetään parametri prosenttimerkkiin --> % jos parametrejä on useampi. Jos ei ole niin päätetään puolipisteeseen --> ;

Esimerkiksi näin:

;Valikko1.Valinta 1%Valinta 2%Valinta 3;

Seuraava valikko kirjoitettaisiin puolipisteen perään, eli näin:

;Valikko1.Valinta 1%Valinta 2%Valinta 3;Valikko 2.Valinta 2-1%Valinta 2-2%Valinta 2-3;

Valikkokoodi käytännössä

Alla olevassa videossa on esitelty esimerkkikoodin valikon toiminta ja lähdekoodit sekä muut selitykset löytyvät videon alta. Myös videolla on hieman selitetty sitä, miten valikon muodostus toimii.

Koodin selitys

Aivan aluksi pitää tarkistaa tai muuttaa kytkentä vastaamaan koodia tai toisinpäin. Jos sinulla on esimerkiksi kytkimet eri pinneihin kytkettynä, niin muutat kytkinten numerointia vastaamaan oikeaa. Koodissa kytkimet ovat UP,DOWN,LEFT,RIGHT -defineitä, joiden perässä on Arduinon pinninumero.

Seuraavaksi muodostetaan valikkorakenne yllä selitetyn syntaksin mukaisesti *menuItems -muuttujaan. Tässä on tehty kuten yllä olevassa kuvassa on näytetty.

const char *menuItems = 
  ";Led.On%Off%parametri;"
  "Speed.Low%Medium%Fast;"
  "Blink.On%Off;";

Seuraavaksi luodaan halutut funktiot toimintojen tekemiseksi. Eli kun valikosta valitaan jokin vaihtoehto, tämä funktio suoritetaan. Nimeäminen voi olla mitä vain ja järjestyksellä ei tässä tapauksessa ole väliä, mutta kannattaa pitää selvyyden vuoksi järjestys samana kuin mitä se on menuItems -rimpsussa.

int menuLedFunction(int led);
int menuSpeedFunction(int speed);
int menuBlinkFunction(int toggle);

Seuraavaksi funktiopointterit päivitetään vastaamaan juuri tehtyjen funktioiden nimiä (videolla myös ohje):

int (*function[])(int) = {
  menuLedFunction,
  menuSpeedFunction,
  menuBlinkFunction
  };

Seuraavaksi kirjoitetaan juuri tehdyt funktiokutsut toiminnallisiksi funktioiksi menufunctions-välilehdellä (videolla näytetty).

Näppäinten toiminta

Valikon käyttämiseen tarvitaan neljä nappia, jotka ovat ylös,alas, vasen ja oikea. Vasen on samalla myös peruutusnappi ja oikea on vahvistusnappi. Valikossa liikutaan ylös ja alas napeilla ja parametrit valitaan samoin.

Valikkokoodin suoritus

Valikkokoodi suoritetaan loop-silmukassa kutsumalla runMenu() funktiota. Lyhykäisyydessään valikkokoodi on pääluupissa siis:

void loop() 
{
  runMenu();
}

Tietenkin runMenu() pitää sisällään paljon koodia, mutta niitä on ehkä turha lähteä tässä selittelemään, ellei erillisiä kyselyitä aiheesta tule. Voit tarkastaa toimintaa lähdekoodista joka on linkitetty alle. Olen pyrkinyt kommentoimaan ja ohjeistamaan koodiin, kuinka muutokset tehdään.

Lähdekoodin latauslinkki on tässä!

Seuraava osa: 14. Arduino lämpötilan ja ilman kosteuden mittaus.

Lähteitä ja linkkejä:
https://www.arduino.cc/en/Tutorial/LiquidCrystalDisplay (kuvat ja kytkentä)
https://create.arduino.cc/projecthub/ianabcumming/a-simple-arduino-menu-with-an-lcd-254080
https://diyi0t.com/building-a-menu-with-buttons-for-your-microcontroller/
https://github.com/neu-rah/ArduinoMenu.