Projekt: Infračervené ovládanie: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
(54 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených) | |||
Riadok 1: | Riadok 1: | ||
[[Category:AVR]] [[Category:DVPS]] | [[Category:AVR]] [[Category:DVPS]] | ||
*Vypracovali: | *Vypracovali: | ||
:::::'''Bc. Martin Lacko''' | :::::'''Bc. Martin Lacko''' | ||
Riadok 12: | Riadok 8: | ||
==='''E. Infračervené komunikačné rozhranie'''=== | |||
:Naprogramujte prijímač infračerveného (IR) diaľkového (DO) ovládania. Vypracujte dokumentáciu (schéma zapojenia, zapojenie konektorov, popis funkcie obvodov, pripojenie k procesoru,...). Demonštrujte pochopenie funkcie jednoduchým programom: Po stlačení klávesy na DO zobrazíte jej hodnotu na displeji. Na niektoré tlačidlá pripojte aj inú funkciu - ovládanie LED, bzučiak, príp. ovládanie mobilného robota. | |||
Naprogramujte prijímač infračerveného (IR) diaľkového (DO) ovládania. Vypracujte dokumentáciu (schéma zapojenia, zapojenie konektorov, popis funkcie obvodov, pripojenie k procesoru,...). | |||
Demonštrujte pochopenie funkcie jednoduchým programom: Po stlačení klávesy na DO zobrazíte jej hodnotu na displeji. Na niektoré tlačidlá pripojte aj inú funkciu - ovládanie LED, bzučiak, príp. ovládanie mobilného robota. | |||
<!-- | |||
Doprogramujte možnosť odvysielať aspoň jednoduchý signál v pásme 38Hz. | |||
--> | |||
[[Obrázok:ParallaxIR_receiver.jpg|center]] | |||
'''Literatúra:''' | |||
* [http://www.parallax.com/Store/Sensors/ColorLight/tabid/175/CategoryID/50/List/0/SortField/0/Level/a/ProductID/177/Default.aspx IR Receiver Product page] (parallax.com) | |||
* [http://www.parallax.com/Portals/0/Downloads/docs/prod/audiovis/PNA4601M.pdf Datasheet] (.pdf) | |||
== Zadanie: == | |||
*Naprogramujte prijímač infračerveného (IR) diaľkového (DO) ovládania. | |||
*Vypracujte dokumentáciu (schéma zapojenia, zapojenie konektorov, popis funkcie obvodov, pripojenie k procesoru,...). | |||
*Demonštrujte pochopenie funkcie jednoduchým programom: Po stlačení klávesy na DO zobrazíte jej hodnotu na displeji. Na niektoré tlačidlá pripojte aj inú funkciu - ovládanie LED, bzučiak, príp. ovládanie mobilného robota. | |||
[[Súbor:ParallaxIR_receiver.jpg]] | [[Súbor:ParallaxIR_receiver.jpg]] | ||
''Použitý IR príjimač PNA4601M'' | |||
== Zapojenie == | |||
Zapojenie je jednoduché keďže k doske pripájame len IR prijimač. Jeho pin č. 2 pripojíme na zem GND, pin č.3 na napájacie napätie 5V. Prvý pin slúži ako výstupný, pripojíme ho na pin procesora, ktorý nastavíme ako vstupný. Zapojenie je možné vidiet aj na obrázku nižšie. | |||
[[Súbor:1.jpg]] | |||
Keďže sme nemali originálny ovladač použili sme ovladač "ORANGE" od Set-top Boxu. | |||
'''Schema zapojenia použitého primača PNA4601M.''' | |||
[[Súbor:primac.png]] | |||
Naľavo je popis pinov primača a na pravo je zapojenie vrámci nášho projektu. | |||
Signál vysielaný diaľkovým ovládaním je blok impulzov (tento blok predstavuje kód stlačeného tlačidla) modulovaných na určitú frekvenciu (podobne ako pri PWM signale) v rozsahu 30kHz až 60kHz, V našom prípade 36,7 kHz - práve na túto frekvenciu je naladený filter v nami použitom prijimači. Táto modulácia je potrebná aby sa zabránilo rušeniu z okolia (existuje veľké množstvo zdrojov IR žiarenia napr. slnko, žiarovky, niektoré zdroje tepla). Prijimač potom odfiltruje všetky signály ktoré niesu na tejto frekvencií a tak spracuje len potrebný signál. | |||
[[Súbor:prenos.gif]] | |||
Na ľavej strane vidíme modulovaný signál ktorý je vysielaný IR LED a na pravej strane je uz detekovaný signál na strane prijimača. | |||
== Program == | == Program == | ||
Ako programovacie prostredie sme si zvolili Arduino software pre jeho jednoduchú prácu vďaka vloženým knižniciam obsluhujúcich display a IR snímač. | |||
Takisto bolo možné s programom rôzne experimentovať a hladať nové funkcie zvolených prvkov. Programovanie v tomto prostredí bolo pre nás príjemnou | |||
skúsenosťou nakoľko nám ukázalo rôzne možnosti riešenia nášho zadania. | |||
Jednotlivé príkazy sú v programe okomentované, preto sa budem venovať funkčným blokom kódu. | |||
Na začiatku programu sú vložené potrebne knižnice pre infračervený prijímač a LCD displej a inicializácia použitých pinov displeja pre 4-bitovú komunikáciu. | |||
<source lang="c"> | <source lang="c"> | ||
#include <IRremote.h> // | #include <IRremote.h> // knižnica pre IR ovládače | ||
#include <LiquidCrystal.h> | #include <LiquidCrystal.h> // knižnica pre display | ||
// initialize the library with the numbers of the interface pins | // initialize the library with the numbers of the interface pins | ||
// LiquidCrystal(RS, RW, EN, D4, D5, D6, D7) // konkretne piny displaya | // LiquidCrystal(RS, RW, EN, D4, D5, D6, D7) // konkretne piny displaya | ||
LiquidCrystal lcd( 3, 2, 1, 4, 5, 6, 7); // piny na | LiquidCrystal lcd( 3, 2, 1, 4, 5, 6, 7); | ||
// piny na ktoré sa pripája display | |||
</source> | |||
'''Knižnica IRremote.h''' Táto knižnica pozostáva z dvoch častí. IRsend, ktorá vysiela IR ovládacie pakety a IRrecv, ktorá príjma a dekóduje IR správu. Pre nás bola zaujémava druhá nakoľko našou úlohou bolo vyčítať reťazec odoslaný diaľkovým ovládaním. | |||
'''IRrecv''' sa ďaľej skladá z dvoch častí. Podprogram prerušenia sa volá každých 50us, meria dľžku znamienok, medzier a uloží ich trvania do vyrovnávaciej pamäte. Následne je uživateľom vyvolaný podprogram pre dekódovanie obsahu buffera ktorý bol odoslaný diaľkovým ovládaním (typicky o dĺžke 11 až 32 bitov, v našom prípade sa jednalo o dĺžku 31 bitov). | |||
Dekódovanie knižnica zastaví v okamihu kedy je dekódovanie úspešné pričom je použitých niekoľko dekódovacích protokolov v rade. | |||
Následuje "definovanie" kódov jednotlivých tlačidiel obladača. Kedže sme pri odlaďovaní programu nemali originálny ovládač použili sme ovladač "ORANGE" od Set-Top Boxu, ktorý je na obrázku v kapitole Zapojenie. Použili sme premennú typu long pretože kódy tlačidiel boli príliš dlhé pre použitie int. | |||
<source lang="c"> | |||
long int Button_1 = 1634762879; // | long int Button_1 = 1634762879; // kódy konkrétnych tlačítok v desiatkovej sústave ovládača ORANGE | ||
long int Button_2 = 1634746559; // | long int Button_2 = 1634746559; // musí to byť typ long pretože typ int bol krátky | ||
long int Button_3 = 1634779199; | long int Button_3 = 1634779199; | ||
long int Button_4 = 1634738399; | long int Button_4 = 1634738399; | ||
Riadok 43: | Riadok 101: | ||
long int Button_OFF = 1634748599; | long int Button_OFF = 1634748599; | ||
</source> | |||
int LED = 13; | Definovanie použitých pinov a pomocných premenných. | ||
int RECV_PIN = 8; // pin na ktorom je | |||
IRrecv irrecv(RECV_PIN); // toto je trieda v kotrej je aj funkcia na | <source lang="c"> | ||
decode_results results; // meno premenej do ktorej sa bude | int count = 0; // premenná počítadla, kontrola či už je display zapnutý = 0 a keď vypnutý je 1 | ||
long int incomming; // | |||
int LED = 13; // pin na ktorom je žltá ledka | |||
int RECV_PIN = 8; // pin na ktorom je zapojený infra príjimač | |||
IRrecv irrecv(RECV_PIN); // toto je trieda v kotrej je aj funkcia na príjmanie signálu, nastaví príjmanie na ten pin teda na 8 | |||
decode_results results; // meno premenej do ktorej sa bude ukladať výsledok dekódovania | |||
long int incomming; // premnná do ktorej sa ukladá hodnota signálu z ďiaľkového v desiatkovej sústave | |||
</source> | </source> | ||
Sériova komunikácia - teraz uz sa nepouživa slúžila len na odlaďovanie programu keď nefungoval displej. | |||
Inicializácia príjmania z IR prijímača, inicializácia LCD + výpis úvodnej obrazovky. | |||
<source lang="c"> | <source lang="c"> | ||
void setup() // tu | void setup() // tu začína funkcia ktorá zbehne iba raz keď sa zapne arduino | ||
{ | { | ||
//Serial.begin(9600); // | //Serial.begin(9600); // musí byť zakomentované aby fungoval display, ak je odkomentovaný tak NEFUNGUJE | ||
irrecv.enableIRIn(); // | irrecv.enableIRIn(); // štart príjímača | ||
Serial.println("ZADAJ VOLBU :"); // | Serial.println("ZADAJ VOLBU :"); // výpis na sériovu linku - ked nieje použitý displej | ||
pinMode(LED,OUTPUT); // | pinMode(LED,OUTPUT); // | ||
lcd.begin(8, 2); // inicializuje komunikáciu s LCD na 8 stĺpcov a 2 riadky | |||
lcd.begin(8, 2); // inicializuje | lcd.clear(); // vymaže display | ||
lcd.clear(); | delay(500); // po vymazaní počká 0.5s | ||
delay(500); // po | |||
lcd.print("Cakam..."); // potom inicializ. vypíše "Cakam ..." | |||
lcd.print("Cakam..."); // potom inicializ. | |||
} | } | ||
</source> | </source> | ||
Hlavná slučka programu - načitavanie prijatej hodnoty a jej porovnanie so zadefinovanými kódmi tlačidiel a následné vypísanie kódu tlačidla s popisom na LCD displej. Pri tlačidle OK je pridaná funkcia rozsvecujúca LED. Ledku následne zhasneme tlačídlom EXIT. Na tlačídlo Power na ovládači je nastavené zapínanie a vypínanie LCD displeja. | |||
<source lang="c"> | <source lang="c"> | ||
void loop() // | void loop() // hlavný program | ||
{ | { | ||
if (irrecv.decode(&results)) | if (irrecv.decode(&results)) //prikaz irrecv.decode(&results) sa pokusa ziska s primača IR kod, v pripade ze ho prijme vrati hodnotu 1 | ||
//(splnena pomienka pre IF) a prijaty kod ulozi do premennej "results" v pripade ze nic neprime vrati hodnotu 0 | |||
//takze IF sa nevykona... | |||
{ | { | ||
Serial.println(results.value); | Serial.println(results.value); | ||
Riadok 87: | Riadok 151: | ||
delay(500); | delay(500); | ||
irrecv.resume(); | irrecv.resume(); | ||
} | } | ||
switch (incomming) { // | switch (incomming) { // porovnávanie hodnoty z incommingu na základe ktorej sa určuje, ktorá akcia sa má vykonať | ||
case 1634762879: // | |||
Serial.println("Stlacil si 1"); // | case 1634762879: // kód signálu v decimálnej hodnote pre button 1 (teda ak bol stlačený) | ||
lcd.clear(); // vymazanie | Serial.println("Stlacil si 1"); // kontrolný výpis na sériovu linku keď ešte nefungoval display | ||
lcd.setCursor(0, 0); //nastavenie kurzora na | lcd.clear(); // vymazanie | ||
lcd.print("Button 1"); // | lcd.setCursor(0, 0); // nastavenie kurzora na pozíciu 0, 0 | ||
lcd.setCursor(0, 1); | lcd.print("Button 1"); // výpis na display Button 1 | ||
lcd.print(Button_1,HEX); // | lcd.setCursor(0, 1); // nastavenie kurzora na pozíciu 0, 1 | ||
lcd.print(Button_1,HEX); // výpis hodnoty kódu signálu ktorý posiela ovládač ale v HEX-a tvare pretože display ma málo miesta na to aby | |||
zobrazil požadoavne číslo v decimalnom či dokonca v binarnom tvare | |||
break; | break; | ||
case 1634746559: | |||
case 1634746559: // ostatné sa už opakuje len sa dejú iné funkcie | |||
Serial.println("Stlacil si 2"); | Serial.println("Stlacil si 2"); | ||
lcd.clear(); | lcd.clear(); | ||
Riadok 107: | Riadok 174: | ||
lcd.print(Button_2,HEX); | lcd.print(Button_2,HEX); | ||
break; | break; | ||
case 1634779199: | case 1634779199: | ||
Serial.println("Stlacil si 3"); | Serial.println("Stlacil si 3"); | ||
Riadok 115: | Riadok 183: | ||
lcd.print(Button_3,HEX); | lcd.print(Button_3,HEX); | ||
break; | break; | ||
case 1634738399: | case 1634738399: | ||
Serial.println("Stlacil si 4"); | Serial.println("Stlacil si 4"); | ||
Riadok 123: | Riadok 192: | ||
lcd.print(Button_4,HEX); | lcd.print(Button_4,HEX); | ||
break; | break; | ||
case 1634771039: | case 1634771039: | ||
Serial.println("Stlacil si 5"); | Serial.println("Stlacil si 5"); | ||
Riadok 131: | Riadok 201: | ||
lcd.print(Button_5,HEX); | lcd.print(Button_5,HEX); | ||
break; | break; | ||
case 1634754719: | case 1634754719: | ||
Serial.println("Stlacil si 6"); | Serial.println("Stlacil si 6"); | ||
Riadok 139: | Riadok 210: | ||
lcd.print(Button_6,HEX); | lcd.print(Button_6,HEX); | ||
break; | break; | ||
case 1634787359: | case 1634787359: | ||
Serial.println("Stlacil si 7"); | Serial.println("Stlacil si 7"); | ||
Riadok 147: | Riadok 219: | ||
lcd.print(Button_7,HEX); | lcd.print(Button_7,HEX); | ||
break; | break; | ||
case 1634734319: | case 1634734319: | ||
Serial.println("Stlacil si 8"); | Serial.println("Stlacil si 8"); | ||
Riadok 155: | Riadok 228: | ||
lcd.print(Button_8,HEX); | lcd.print(Button_8,HEX); | ||
break; | break; | ||
case 1634766959: | case 1634766959: | ||
Serial.println("Stlacil si 9"); | Serial.println("Stlacil si 9"); | ||
Riadok 163: | Riadok 237: | ||
lcd.print(Button_9,HEX); | lcd.print(Button_9,HEX); | ||
break; | break; | ||
case 1634730239: | case 1634730239: | ||
Serial.println("Stlacil si 0"); | Serial.println("Stlacil si 0"); | ||
Riadok 171: | Riadok 246: | ||
lcd.print(Button_0,HEX); | lcd.print(Button_0,HEX); | ||
break; | break; | ||
case 1634773079: | case 1634773079: | ||
Serial.println("Stlacil si OK"); | Serial.println("Stlacil si OK"); | ||
Riadok 176: | Riadok 252: | ||
lcd.clear(); | lcd.clear(); | ||
lcd.setCursor(0, 0); | lcd.setCursor(0, 0); | ||
lcd.print("LED ON"); // | lcd.print("LED ON"); // LED on | ||
lcd.setCursor(0, 1); | lcd.setCursor(0, 1); | ||
lcd.print(Button_OK,HEX); | lcd.print(Button_OK,HEX); | ||
break; | break; | ||
case 1634764919: | case 1634764919: | ||
Serial.println("Stlacil si EXIT"); | Serial.println("Stlacil si EXIT"); | ||
Riadok 185: | Riadok 262: | ||
lcd.clear(); | lcd.clear(); | ||
lcd.setCursor(0, 0); | lcd.setCursor(0, 0); | ||
lcd.print("LED OFF"); // | lcd.print("LED OFF"); // LED off | ||
lcd.setCursor(0, 1); | lcd.setCursor(0, 1); | ||
lcd.print(Button_EXIT,HEX); | lcd.print(Button_EXIT,HEX); | ||
break; | break; | ||
case 1634748599: | |||
case 1634748599: //(POWER tlacitko) | |||
switch(count){ // funkcia zapína alebo vypína displej - mení sa hodnota count buď na 0 alebo na 1 | |||
case 0: | case 0: | ||
lcd.noDisplay(); | lcd.noDisplay(); | ||
count++; | count++; | ||
break; | break; | ||
case 1: | case 1: | ||
lcd.display(); | lcd.display(); | ||
count--; | count--; | ||
break; | break; | ||
} | } | ||
Riadok 204: | Riadok 282: | ||
case 0: | case 0: | ||
break; // ak je | break; // ak je stlačené iné tlačídlo ktoré nieje v zozname, display vypise UNKNOWN a vypise aj hodnotu kódu v HEX-a | ||
default: | |||
default: | |||
lcd.clear(); | lcd.clear(); | ||
lcd.setCursor(0, 0); | lcd.setCursor(0, 0); | ||
Riadok 215: | Riadok 294: | ||
break; | break; | ||
} | } | ||
incomming = 0; // | incomming = 0; // stará hodnota signálu ovládača sa vynuluje | ||
} | } | ||
Riadok 221: | Riadok 300: | ||
== Popis funkcie + fotodokumentacia == | == Popis funkcie + fotodokumentacia == | ||
Na obrazku je náhľad displeja: vľavo je to úvodna obrazovka pred stlačenim niektorého tlačídla, uprostred je chybové hlásenie pri stlačeni tlačídla ktoré nieje medzi zadefinovanými tlačídlami, v druhom riadku je zobrazený HEX-a kód tlačídla (pre malý počet znakov displeja ho nebolo možne zobraziť v desiatkovej sustave). V pravo je displej pri stlačeni tlačidla "0" a jeho HEX-a kód. | |||
[[Súbor:1.jpeg|700px]] | |||
Zobrazenie na displeji pre stlačené tlačidlá 1 - 9. | |||
[[Súbor:b1.jpg|700px]] | |||
[[Súbor:b2.jpg|700px]] | |||
[[Súbor:b3.jpg|700px]] | |||
Rozsvietenie Led tlacidlom "OK". | |||
[[Súbor:Led_on.jpg|500px]] | |||
Led zhasneme tlacidlom "EXIT". | |||
[[Súbor: | [[Súbor:Led_off.jpg|500px]] |
Aktuálna revízia z 13:54, 18. november 2013
- Vypracovali:
- Bc. Martin Lacko
- Bc. Andrej Pecho
- Študijný odbor: Aplikovaná mechatronika
- Ročník: 2. Ing.
E. Infračervené komunikačné rozhranie
Naprogramujte prijímač infračerveného (IR) diaľkového (DO) ovládania. Vypracujte dokumentáciu (schéma zapojenia, zapojenie konektorov, popis funkcie obvodov, pripojenie k procesoru,...). Demonštrujte pochopenie funkcie jednoduchým programom: Po stlačení klávesy na DO zobrazíte jej hodnotu na displeji. Na niektoré tlačidlá pripojte aj inú funkciu - ovládanie LED, bzučiak, príp. ovládanie mobilného robota.
Literatúra:
- IR Receiver Product page (parallax.com)
- Datasheet (.pdf)
Zadanie:
- Naprogramujte prijímač infračerveného (IR) diaľkového (DO) ovládania.
- Vypracujte dokumentáciu (schéma zapojenia, zapojenie konektorov, popis funkcie obvodov, pripojenie k procesoru,...).
- Demonštrujte pochopenie funkcie jednoduchým programom: Po stlačení klávesy na DO zobrazíte jej hodnotu na displeji. Na niektoré tlačidlá pripojte aj inú funkciu - ovládanie LED, bzučiak, príp. ovládanie mobilného robota.
Použitý IR príjimač PNA4601M
Zapojenie
Zapojenie je jednoduché keďže k doske pripájame len IR prijimač. Jeho pin č. 2 pripojíme na zem GND, pin č.3 na napájacie napätie 5V. Prvý pin slúži ako výstupný, pripojíme ho na pin procesora, ktorý nastavíme ako vstupný. Zapojenie je možné vidiet aj na obrázku nižšie.
Keďže sme nemali originálny ovladač použili sme ovladač "ORANGE" od Set-top Boxu.
Schema zapojenia použitého primača PNA4601M.
Naľavo je popis pinov primača a na pravo je zapojenie vrámci nášho projektu.
Signál vysielaný diaľkovým ovládaním je blok impulzov (tento blok predstavuje kód stlačeného tlačidla) modulovaných na určitú frekvenciu (podobne ako pri PWM signale) v rozsahu 30kHz až 60kHz, V našom prípade 36,7 kHz - práve na túto frekvenciu je naladený filter v nami použitom prijimači. Táto modulácia je potrebná aby sa zabránilo rušeniu z okolia (existuje veľké množstvo zdrojov IR žiarenia napr. slnko, žiarovky, niektoré zdroje tepla). Prijimač potom odfiltruje všetky signály ktoré niesu na tejto frekvencií a tak spracuje len potrebný signál.
Na ľavej strane vidíme modulovaný signál ktorý je vysielaný IR LED a na pravej strane je uz detekovaný signál na strane prijimača.
Program
Ako programovacie prostredie sme si zvolili Arduino software pre jeho jednoduchú prácu vďaka vloženým knižniciam obsluhujúcich display a IR snímač. Takisto bolo možné s programom rôzne experimentovať a hladať nové funkcie zvolených prvkov. Programovanie v tomto prostredí bolo pre nás príjemnou skúsenosťou nakoľko nám ukázalo rôzne možnosti riešenia nášho zadania.
Jednotlivé príkazy sú v programe okomentované, preto sa budem venovať funkčným blokom kódu.
Na začiatku programu sú vložené potrebne knižnice pre infračervený prijímač a LCD displej a inicializácia použitých pinov displeja pre 4-bitovú komunikáciu.
#include <IRremote.h> // knižnica pre IR ovládače
#include <LiquidCrystal.h> // knižnica pre display
// initialize the library with the numbers of the interface pins
// LiquidCrystal(RS, RW, EN, D4, D5, D6, D7) // konkretne piny displaya
LiquidCrystal lcd( 3, 2, 1, 4, 5, 6, 7);
// piny na ktoré sa pripája display
Knižnica IRremote.h Táto knižnica pozostáva z dvoch častí. IRsend, ktorá vysiela IR ovládacie pakety a IRrecv, ktorá príjma a dekóduje IR správu. Pre nás bola zaujémava druhá nakoľko našou úlohou bolo vyčítať reťazec odoslaný diaľkovým ovládaním.
IRrecv sa ďaľej skladá z dvoch častí. Podprogram prerušenia sa volá každých 50us, meria dľžku znamienok, medzier a uloží ich trvania do vyrovnávaciej pamäte. Následne je uživateľom vyvolaný podprogram pre dekódovanie obsahu buffera ktorý bol odoslaný diaľkovým ovládaním (typicky o dĺžke 11 až 32 bitov, v našom prípade sa jednalo o dĺžku 31 bitov). Dekódovanie knižnica zastaví v okamihu kedy je dekódovanie úspešné pričom je použitých niekoľko dekódovacích protokolov v rade.
Následuje "definovanie" kódov jednotlivých tlačidiel obladača. Kedže sme pri odlaďovaní programu nemali originálny ovládač použili sme ovladač "ORANGE" od Set-Top Boxu, ktorý je na obrázku v kapitole Zapojenie. Použili sme premennú typu long pretože kódy tlačidiel boli príliš dlhé pre použitie int.
long int Button_1 = 1634762879; // kódy konkrétnych tlačítok v desiatkovej sústave ovládača ORANGE
long int Button_2 = 1634746559; // musí to byť typ long pretože typ int bol krátky
long int Button_3 = 1634779199;
long int Button_4 = 1634738399;
long int Button_5 = 1634771039;
long int Button_6 = 1634754719;
long int Button_7 = 1634787359;
long int Button_8 = 1634734319;
long int Button_9 = 1634766959;
long int Button_0 = 1634730239;
long int Button_OK = 1634773079;
long int Button_EXIT = 1634764919;
long int Button_OFF = 1634748599;
Definovanie použitých pinov a pomocných premenných.
int count = 0; // premenná počítadla, kontrola či už je display zapnutý = 0 a keď vypnutý je 1
int LED = 13; // pin na ktorom je žltá ledka
int RECV_PIN = 8; // pin na ktorom je zapojený infra príjimač
IRrecv irrecv(RECV_PIN); // toto je trieda v kotrej je aj funkcia na príjmanie signálu, nastaví príjmanie na ten pin teda na 8
decode_results results; // meno premenej do ktorej sa bude ukladať výsledok dekódovania
long int incomming; // premnná do ktorej sa ukladá hodnota signálu z ďiaľkového v desiatkovej sústave
Sériova komunikácia - teraz uz sa nepouživa slúžila len na odlaďovanie programu keď nefungoval displej.
Inicializácia príjmania z IR prijímača, inicializácia LCD + výpis úvodnej obrazovky.
void setup() // tu začína funkcia ktorá zbehne iba raz keď sa zapne arduino
{
//Serial.begin(9600); // musí byť zakomentované aby fungoval display, ak je odkomentovaný tak NEFUNGUJE
irrecv.enableIRIn(); // štart príjímača
Serial.println("ZADAJ VOLBU :"); // výpis na sériovu linku - ked nieje použitý displej
pinMode(LED,OUTPUT); //
lcd.begin(8, 2); // inicializuje komunikáciu s LCD na 8 stĺpcov a 2 riadky
lcd.clear(); // vymaže display
delay(500); // po vymazaní počká 0.5s
lcd.print("Cakam..."); // potom inicializ. vypíše "Cakam ..."
}
Hlavná slučka programu - načitavanie prijatej hodnoty a jej porovnanie so zadefinovanými kódmi tlačidiel a následné vypísanie kódu tlačidla s popisom na LCD displej. Pri tlačidle OK je pridaná funkcia rozsvecujúca LED. Ledku následne zhasneme tlačídlom EXIT. Na tlačídlo Power na ovládači je nastavené zapínanie a vypínanie LCD displeja.
void loop() // hlavný program
{
if (irrecv.decode(&results)) //prikaz irrecv.decode(&results) sa pokusa ziska s primača IR kod, v pripade ze ho prijme vrati hodnotu 1
//(splnena pomienka pre IF) a prijaty kod ulozi do premennej "results" v pripade ze nic neprime vrati hodnotu 0
//takze IF sa nevykona...
{
Serial.println(results.value);
incomming = (results.value);
delay(500);
irrecv.resume();
}
switch (incomming) { // porovnávanie hodnoty z incommingu na základe ktorej sa určuje, ktorá akcia sa má vykonať
case 1634762879: // kód signálu v decimálnej hodnote pre button 1 (teda ak bol stlačený)
Serial.println("Stlacil si 1"); // kontrolný výpis na sériovu linku keď ešte nefungoval display
lcd.clear(); // vymazanie
lcd.setCursor(0, 0); // nastavenie kurzora na pozíciu 0, 0
lcd.print("Button 1"); // výpis na display Button 1
lcd.setCursor(0, 1); // nastavenie kurzora na pozíciu 0, 1
lcd.print(Button_1,HEX); // výpis hodnoty kódu signálu ktorý posiela ovládač ale v HEX-a tvare pretože display ma málo miesta na to aby
zobrazil požadoavne číslo v decimalnom či dokonca v binarnom tvare
break;
case 1634746559: // ostatné sa už opakuje len sa dejú iné funkcie
Serial.println("Stlacil si 2");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Button 2");
lcd.setCursor(0, 1);
lcd.print(Button_2,HEX);
break;
case 1634779199:
Serial.println("Stlacil si 3");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Button 3");
lcd.setCursor(0, 1);
lcd.print(Button_3,HEX);
break;
case 1634738399:
Serial.println("Stlacil si 4");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Button 4");
lcd.setCursor(0, 1);
lcd.print(Button_4,HEX);
break;
case 1634771039:
Serial.println("Stlacil si 5");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Button 5");
lcd.setCursor(0, 1);
lcd.print(Button_5,HEX);
break;
case 1634754719:
Serial.println("Stlacil si 6");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Button 6");
lcd.setCursor(0, 1);
lcd.print(Button_6,HEX);
break;
case 1634787359:
Serial.println("Stlacil si 7");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Button 7");
lcd.setCursor(0, 1);
lcd.print(Button_7,HEX);
break;
case 1634734319:
Serial.println("Stlacil si 8");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Button 8");
lcd.setCursor(0, 1);
lcd.print(Button_8,HEX);
break;
case 1634766959:
Serial.println("Stlacil si 9");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Button 9");
lcd.setCursor(0, 1);
lcd.print(Button_9,HEX);
break;
case 1634730239:
Serial.println("Stlacil si 0");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Button 0");
lcd.setCursor(0, 1);
lcd.print(Button_0,HEX);
break;
case 1634773079:
Serial.println("Stlacil si OK");
digitalWrite(LED,HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("LED ON"); // LED on
lcd.setCursor(0, 1);
lcd.print(Button_OK,HEX);
break;
case 1634764919:
Serial.println("Stlacil si EXIT");
digitalWrite(LED,LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("LED OFF"); // LED off
lcd.setCursor(0, 1);
lcd.print(Button_EXIT,HEX);
break;
case 1634748599: //(POWER tlacitko)
switch(count){ // funkcia zapína alebo vypína displej - mení sa hodnota count buď na 0 alebo na 1
case 0:
lcd.noDisplay();
count++;
break;
case 1:
lcd.display();
count--;
break;
}
break;
case 0:
break; // ak je stlačené iné tlačídlo ktoré nieje v zozname, display vypise UNKNOWN a vypise aj hodnotu kódu v HEX-a
default:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("UNKNOWN");
lcd.setCursor(0, 1);
lcd.print(incomming,HEX);
Serial.println("Stlacil si EXIT");
break;
}
incomming = 0; // stará hodnota signálu ovládača sa vynuluje
}
Popis funkcie + fotodokumentacia
Na obrazku je náhľad displeja: vľavo je to úvodna obrazovka pred stlačenim niektorého tlačídla, uprostred je chybové hlásenie pri stlačeni tlačídla ktoré nieje medzi zadefinovanými tlačídlami, v druhom riadku je zobrazený HEX-a kód tlačídla (pre malý počet znakov displeja ho nebolo možne zobraziť v desiatkovej sustave). V pravo je displej pri stlačeni tlačidla "0" a jeho HEX-a kód.
Zobrazenie na displeji pre stlačené tlačidlá 1 - 9.
Rozsvietenie Led tlacidlom "OK".
Led zhasneme tlacidlom "EXIT".