| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| et:arduino:sensorss:project1 [2017/05/11 06:22] – raivo.sell | et:arduino:sensorss:project1 [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
|---|
| ===== Näide #3.1 LCD ekraanile kirjutamine ===== | ===== Näide #3.1 LCD ekraanile kirjutamine ===== |
| Ekraanile kirjutamiseks vajalikud tähemärgid on LCD draiveri mälus juba olemas ja nende kuvamiseks on vaja saata ASCII tabelile vastav number. Lihtsuse mõttes teeb teek "LiquidCrystal" selle töö juba kasutaja eest ära ja ekraanile kirjutamine ei ole keerulisem kui jadaporti teksti kirjutamine. Lisaks LCD-le kirjutamisele tuleb aeg-ajalt muuta ka kursori asukohta, mida saab teha //setCursor(veerg, rida)// käsuga.\\ | Ekraanile kirjutamiseks vajalikud tähemärgid on LCD draiveri mälus juba olemas ja nende kuvamiseks on vaja saata ASCII tabelile vastav number. Lihtsuse mõttes teeb teek "LiquidCrystal" selle töö juba kasutaja eest ära ja ekraanile kirjutamine ei ole keerulisem kui jadaporti teksti kirjutamine. Lisaks LCD-le kirjutamisele tuleb aeg-ajalt muuta ka kursori asukohta, mida saab teha //setCursor(veerg, rida)// käsuga.\\ |
| Näiteprogramm alustab ekraani seadistamisega. Määrame ära ühendusviigud ja ekraani suurus, mis on tarvilik ekraani korrektseks funktsioneerimiseks. Järgnevalt trükime ekraanile tervitusteksti, mis jääb püsivalt ülemisele reale alles. Teisele reale liigume käsuga //setCursor// ning kirjutame sinna programmi töötamise aja sekundites. Kuna pärast tähemärkidele kirjutamist liigub kursor automaatselt edasi, siis tuleb pärast igat tsükli läbimist ka kursori positsioon uuesti algusesse liigutada. Kui käesolevale tähemärgile ekraanil on juba midagi trükitud, siis uue tähemärgi samale kohale trükkimisel kustutatakse eelnev tähemärk automaatselt ära.\\ | Näiteprogramm alustab ekraani seadistamisega. Määrame ära ühendusviigud ja ekraani suuruse, mis on tarvilik ekraani korrektseks funktsioneerimiseks. Järgnevalt trükime ekraanile tervitusteksti, mis jääb püsivalt ülemisele reale alles. Teisele reale liigume käsuga //setCursor// ning kirjutame sinna programmi töötamise aja sekundites. Kuna pärast tähemärkidele kirjutamist liigub kursor automaatselt edasi, siis tuleb pärast igat tsükli läbimist ka kursori positsioon uuesti algusesse liigutada. Kui käesolevale tähemärgile ekraanil on juba midagi trükitud, siis uue tähemärgi samale kohale trükkimisel kustutatakse eelnev tähemärk automaatselt ära.\\ |
| Täpsemalt teegi "LiquidCrystal" toetatud käskudest leiab siit: https://www.arduino.cc/en/Reference/LiquidCrystal | Täpsemalt teegi "LiquidCrystal" toetatud käskudest leiab siit: https://www.arduino.cc/en/Reference/LiquidCrystal |
| ~~PB~~ | <pagebreak> |
| <code c> | <code c> |
| /* | /* |
| |
| ===== Näide #3.2 Erikujuliste tähemärkide kuvamine LCD ekraanil ===== | ===== Näide #3.2 Erikujuliste tähemärkide kuvamine LCD ekraanil ===== |
| Käesoleva LCD draiver võimaldab lisaks ASCII tabeli tähemärkidele lisada ka erikujulisi tähemärke. Tähemärgi lisamiseks on vaja tekitada ühe tähemärgi pikslite arvule vastav massiiv. Selle massiiviga määratakse ära tähemärgi aktiivsed pikslid. Pärast tähemärgi ekraani draiveri mällu laadimist käsuga //createChar(id_nr, massiiv)//, on see püsivalt ekraani mälus, kuni see kirjutatakse kasutaja poolt üle uue tähemärgiga. Tähemärk säilub mälus ka pärast toite lahti ühendamist. Tähemärgi kuvamine toimub käsuga //write(tähemärgi_nr)//. Näiteprogrammis sulgudes olev //uint8_t// on vajalik muutuja tüübi konverteerimiseks ekraanile sobilikuks. Kuna draiveri mälu on piiratud, siis maksimaalselt saab tekitada 8 erikujulist tähemärki. | Käesoleva LCD draiver võimaldab lisaks ASCII tabeli tähemärkidele lisada ka erikujulisi tähemärke. Tähemärgi lisamiseks on vaja tekitada ühe tähemärgi pikslite arvule vastav massiiv. Selle massiiviga määratakse ära tähemärgi aktiivsed pikslid. Pärast tähemärgi ekraani draiveri mällu laadimist käsuga //createChar(id_nr, massiiv)//, on see püsivalt ekraani mälus, kuni see kirjutatakse kasutaja poolt üle uue tähemärgiga. Tähemärk säilib mälus ka pärast toite lahti ühendamist. Tähemärgi kuvamine toimub käsuga //write(tähemärgi_nr)//. Näiteprogrammis sulgudes olev //uint8_t// on vajalik muutuja tüübi konverteerimiseks ekraanile sobilikuks. Kuna draiveri mälu on piiratud, siis maksimaalselt saab tekitada 8 erikujulist tähemärki. |
| |
| |
| | |
| /* Massiiv erikujulise tähemärgi tekitamiseks, | /* Massiiv erikujulise tähemärgi tekitamiseks, |
| "0b" numbrite ees ütleb kompilaatorile, et tegemist on kahendsüsteemis arvuga, | "0b" numbrite ees ütleb kompilaatorile, et tegemist on kahendsüsteemis arvuga. |
| kahendsüsteemi arvude kasutamisel tekib parem arusaam | Kahendsüsteemi arvude kasutamisel tekib parem arusaam |
| kuvatavate pikslite asukohtadest */ | kuvatavate pikslite asukohtadest. */ |
| byte customChar[8] = | byte customChar[8] = |
| { | { |
| lcd.begin(16, 2); | lcd.begin(16, 2); |
| | |
| // Erikujuliste tähemärkide kuvamine ekraanil kohal 0 | // Draiveri mälus kohal 0 oleva erikujulise tähemärgi kuvamine ekraanile |
| lcd.write((uint8_t)0); | lcd.write((uint8_t)0); |
| } | } |
| { | { |
| /* Tsüklis ei tehta midagi kogu tegevus | /* Tsüklis ei tehta midagi kogu tegevus |
| on sooritatud juba setup funktsioonis */ | on sooritatud juba //setup// funktsioonis */ |
| } | } |
| </code> | </code> |
| |
| ===== Näide #3.3 LCD laiendusplaadi nuppude lugemine ===== | ===== Näide #3.3 LCD laiendusplaadi nuppude lugemine ===== |
| Järgnevas näites võtame kasutusele LCD laindusplaadil olevad nupud. Programmi tööpõhimõtte mõistmiseks on soovitav tutvuda nuppude ühendusskeemiga 6. peatüki alguses. Nimelt kasutame nuppude lugemiseks eelnevast peatükist tuttavat //analogRead// käsku. Iga nupu vajutamisel saame erineva analoogväärtuse, mida kasutame ära, et tuvastada vajutatud nupp. Mitme nupu samaaegsel vajutamisel programm eelistab väiksema väärtusega nuppu.\\ | Järgnevas näites võtame kasutusele LCD laiendusplaadil olevad nupud. Programmi tööpõhimõtte mõistmiseks on soovitav tutvuda nuppude ühendusskeemiga 6. peatüki alguses. Nimelt kasutame nuppude lugemiseks eelnevast peatükist tuttavat //analogRead// käsku. Iga nupu vajutamisel saame erineva analoogväärtuse, mida kasutame ära, et tuvastada vajutatud nupp. Mitme nupu samaaegsel vajutamisel programm eelistab väiksema väärtusega nuppu.\\ |
| Programm alustab sarnaselt eelnevatele näidetele LCD seadistustega. Loetavuse parendamiseks tekitatame konstandid iga nupu jaoks. Peatsükli (loop) koodi ridade arvu vähendamiseks loome uue funktsiooni nimega //kontrolliNuppe//. Kutsume seda välja võimalikult tihedalt, et ükski nupu vajutus ei jääks mikrokontrolleril märkamata. Kui ühtegi nuppu pole vajutatud, siis tagastab funktsioon alati konstandi "nuppNone". See tuleneb, sellest, et tavaolekus on analoogsisendi peal //pull-up// takisti ja seetõttu on analoogsisendi väärtus suurem kui 790. Tuvastanud nupu vajutuse kuvab programm saadud analoogsisendi väärtuse ekraanile. Lisaks on programmi lisatud käsk //clear//, mis on vajalik, et uue väärtuse kuvamisel ei jääks ükski number vanast väärtusest ekraanile näha. Vastasel juhul näiteks väärtuse 783 üle kirjutamisel väärtusega 50 jääks eelmisest väärtusest kolmanda positsiooni number 3 ikka veel ekraanile ja tekitab seetõttu arusaama nagu oleks tegelik väärtus 503. | Programm alustab sarnaselt eelnevatele näidetele LCD seadistustega. Loetavuse parendamiseks tekitame konstandid iga nupu jaoks. Peatsükli (loop) koodi ridade arvu vähendamiseks loome uue funktsiooni nimega //kontrolliNuppe//. Kutsume seda välja võimalikult tihedalt, et ükski nupu vajutus ei jääks mikrokontrolleril märkamata. Kui ühtegi nuppu pole vajutatud, siis tagastab funktsioon alati konstandi "nuppNone". See tuleneb, sellest, et tavaolekus on analoogsisendi peal //pull-up// takisti ja seetõttu on analoogsisendi väärtus suurem kui 790. Tuvastanud nupu vajutuse, kuvab programm saadud analoogsisendi väärtuse ekraanile. Lisaks on programmi lisatud käsk //clear//, mis on vajalik, et uue väärtuse kuvamisel ei jääks ükski number vanast väärtusest ekraanile näha. Vastasel juhul näiteks väärtuse 783 üle kirjutamisel väärtusega 50 jääks eelmisest väärtusest kolmanda positsiooni number 3 ikka veel ekraanile ja tekitab seetõttu arusaama nagu oleks tegelik väärtus 503. |
| |
| ~~PB~~ | <pagebreak> |
| <code c> | <code c> |
| /* | /* |
| // Vajutatud nupu muutuja konstandi salvestamine | // Vajutatud nupu muutuja konstandi salvestamine |
| int vajutatudNupp; | int vajutatudNupp; |
| // Aanaloog sisendi muutuja väärtuse salvestamine | // Aanaloogsisendi muutuja väärtuse salvestamine |
| int nupuSisend; | int nupuSisend; |
| | |
| lcd.print("ADC: "); | lcd.print("ADC: "); |
| | |
| // Ekraani analoog sisendi A0 väärtuse kuvamine | // Ekraani analoogsisendi A0 väärtuse kuvamine |
| lcd.print(analogRead(A0)); | lcd.print(analogRead(A0)); |
| } | } |
| void loop() | void loop() |
| { | { |
| /* Kutsub välja funktsiooni "kontrolliNuppue()" | /* Kutsub välja funktsiooni kontrolliNuppe |
| ja salvestab tagastatud väärtuse muutujasse */ | ja salvestab tagastatud väärtuse muutujasse */ |
| vajutatudNupp = kontrolliNuppe(); | vajutatudNupp = kontrolliNuppe(); |
| } | } |
| } | } |
| | </code> |
| // Funktsioon võtab analoog sisendi väärtuse ja võrdleb olemasolevate väärtustega. | <pagebreak> |
| | <code c> |
| | // Funktsioon võtab analoogsisendi väärtuse ja võrdleb olemasolevate väärtustega. |
| // Tagastab arvu vahemikus 0 kuni 5 vastavalt defineeritud konstandile | // Tagastab arvu vahemikus 0 kuni 5 vastavalt defineeritud konstandile |
| int kontrolliNuppe() | int kontrolliNuppe() |
| { | { |
| // Salvestab muutujasse analoog väärtuse viigult A0 | // Salvestab muutujasse analoogväärtuse viigult A0 |
| nupuSisend = analogRead(A0); | nupuSisend = analogRead(A0); |
| if (nupuSisend < 50) return nuppRIGHT; | if (nupuSisend < 50) return nuppRIGHT; |
| if (nupuSisend < 195) return nuppUP; | if (nupuSisend < 195) return nuppUP; |
| if (nupuSisend < 380) return nuppDOWN; | if (nupuSisend < 380) return nuppDOWN; |
| if (nupuSisend < 555) return nuppLEFT; | if (nupuSisend < 555) return nuppLEFT; |
| if (nupuSisend < 790) return nuppSELECT; | if (nupuSisend < 790) return nuppSELECT; |
| | // Kui ühtegi nuppu pole vajutatud, siis tagastatakse "nuppNONE" |
| return nuppNONE; // Kui ühtegi nuppu pole vajutatud, siis tagastatakse nuppNONE | return nuppNONE; |
| } | } |
| </code> | </code> |