Operácie

Ovládanie aplikácie cez gesture senzor Si1143: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentDVPS (diskusia | príspevky)
Vytvorená stránka „{| |Autori: || '''Matúš Rus, Matej Cehula''' |- |Študijný odbor: || Aplikovaná mechatronika a elektromobilita || 1. Ing. ('''2016''') |} == Zadanie == ...“
 
StudentDVPS (diskusia | príspevky)
 
(49 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 2: Riadok 2:
|Autori:      || '''Matúš Rus, Matej Cehula'''  
|Autori:      || '''Matúš Rus, Matej Cehula'''  
|-
|-
|Študijný odbor:  || Aplikovaná mechatronika a elektromobilita || 1. Ing.  ('''2016''')
|Študijný odbor:  || '''Aplikovaná mechatronika a elektromobilita'''
|-
|Ročník:  || '''1. Ing.  (2015/2016)'''
|}
|}


__TOC__




Riadok 20: Riadok 24:


[[Obrázok:Parallax_Si1143.jpg|300px|center]]
[[Obrázok:Parallax_Si1143.jpg|300px|center]]
<center>'''Obr. 1.''' Senzor Si1143 (Parallax) </center>


* [http://www.parallaxinc.com/product/28046 Product page]
* [http://www.parallaxinc.com/product/28046 Product page]
Riadok 26: Riadok 32:




'''Literatúra:'''
* [https://www.parallax.com/sites/default/files/downloads/28046-Si1143-Gesture-Sensor-v1.2.pdf  Základne informácie]
* [http://www.silabs.com/Support%20Documents/TechnicalDocs/Si114x.pdf Datasheet]
== Analýza ==
V našom projekte sme si vybrali proximitny snímač Parallax Si1143. Na tom snímači chceme demonštrovať použitie proximitného snímača na detekciu prstu pred konkrétnou LEDkou( resp. snímačom senzoru). Tento snímač nie je vhodný na presnú detekciu  pozície ruky alebo prsta v priestore, skôr na detekciu hrán. Snímač vie dobre zachytiť kedy a z ktorej strany objekt vstúpil do jeho zorného poľa a takisto kedy jeho zorné pole opustil. Najlepšia detekčná zóna je v rozsahu 50-2 cm pred snímačom. V naśom projekte sa budeme snažiť zistiť pred ktorým konkrétnym snímačom sa objekt(v naśom prípade prst) bude nachádzať a vyhodnotiť úspešnosť a čas za aký sa nám podarilo dosiahnuť vybratú LEDku.
==Popis snímača==
==='''Vlastnosti snímača:'''===
*Napájacie napätie:        '''<3-5.5>'''
*Maximalny prúd:                '''4mA'''
*Komunikačná zbernica:      '''I2C'''
*Rozmer: '''5.08 x 5.79 x 0.48 cm'''
*Operačná teplota: '''-40 do 85 °C'''
* Vzorkovacia perióda: '''100 snímkov/sekundu'''
==='''Popis práce snímaća:'''===
*Snímač je vybavený foto diódami na zachytávanie viditeľného a odrazeného svetla. Snímač obsahuje 3 takéto diódy ktoré sa zapínajú postupne nie naraz, čo umožnuje zistiť pre každú diódu koľko svetla zachytila. Hlavné výhody tohto snímača sú:
*1- nízka spotreba (snímač dokáže zostať v spánkovom režime väčšinu času zbytok času je v "pulzovacom režime" kedy sa LEDky  zapnú len na veľmi krátku dobu)
*2- dobrá filtrácia šumu vstupného signálu (Snímače pracujú v 2 krokoch, v prvom sa snímač zapne bez spustenia prisvetlovacej LED diódy a zmeria hodnotu svetla v okolí uloží hodnotu a následne zmeria hodnotu odrazeného svetla so zapnutou prisvetlovacou LED diódou. Celé toho meranie trvá krátko približne 25.6 μs )
==='''Popis vývodov snímača''':===
[[Súbor:Si1143vyvody.png]]
{|
|'''C'''
|'''Pin'''
|'''Typ'''
|'''Funkcia'''
|----
|1
|GND
|Napájanie
|Zem
|----
|2
|VIN
|Napájanie
|Napájacie napätie
|----
|3
|INT
|Výstup
|Prerušenie(nepripojené)
|----
|4
|SCL
|Vstup
|I2C hodinová linka
|----
|5
|SDA
|Vstup/Výstup
|I2C dátová linka
|----
|}
==='''Popis doležitých registrov snímača''':===
{|
|'''Nazov'''
|'''Funkcia'''
|----
|COMMAND REGISTER
|Register na zadávanie požadovanej funkcie senzora
|----
|RESPONSE REGISTER
|Register obsahujúci chybove upozornenia
|----
|PARAM_RD
|Register slúžiaci na čitanie dát zo senzora
|----
|PARAM_WR
|Register slúžiaci na na zápis do RAM
|----
|}


=== '''Zapojenie snimaca''': ===
[[Súbor:ZapojenieSi.png|center]]
<center>'''Obr. 2.''' Schéma zapojenia snímača </center>


[http://www.example.com link title]
=== '''I2C komunikacia''': ===


[[Súbor:MojObrazok2.jpg|center|300px]]


[[Médiá:MojZdrojak.c]]
Senzor moze byt nastaveny do '''Autonomneho rezimu''', alebo do '''Prikazoveho rezimu''' tzv. ''Forced measuremet''.  


*'''Prikazovy rezim''':


'''Literatúra:'''  
Ked je senzor v prikazovom rezime, senzor nevykonava ziadne merania bez ziadosti od strany programatora pomocou specialneho prikazu inicializacie. ''CHLIST'' parameter sa musi zapisat do senzora aby senzor vedel ze ma vykonat meranie. Ked je senzor nastaveny do prikazoveho rezimu, do parametru ''MEAS_RATE'' sa vlozi 0 cim sa senzoru zabrani vykonat akekolvek meranie bez prikazu zo strany programatora.
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
 
*'''Autonomny rezim''':
 
Senzor je nastaveny do autonomneho rezimu ked hodnota v ''MEAS_RATE'' je nenulova, potom tato hodnota reprezentuje cas interval v ktorom sa senzor zobudza na meranie. Akonahle sa senzor zobudi na meranie, vykonaju sa 3 proximitne merania pre kazdy senzor (PS1, PS2, PS3) v poradi ''ALS_VIS'', ''ALS_IR'' and ''AUX'' co znamena ze senzor najprv zmeria  hodnotu okoliteho svetla, potom hodnotu odrazeneho svetla a nakoniec urobi rozdiel z tychto hodnot. Na zabranenie toho aby sa vykonali vsetky tri sucastne, su k dispozici dva casovace PS_RATE a ALS_RATE, ktore urcuju ktora LED sa kedy spusti, po vyprsani PS_RATE sa spusti meranie LEDky ktora je nastavena v CHLIST(channel list). Po skonceni vsetkych merani sa mikrocontroler vrati do spacieho rezimu az kym sa nezobudi na dalsie meranie podla MEAS_RATE.
 
*'''Programovacia sekvencia'''
Aby sme mohli zadat prikaz musime vykonat nasledujucu sekvenciu krokov:
*1- Do registra COMMAND zapiseme hodnotu 0x00 aby sme vycistili RESPONSE register
*2- Overit ze RESPONSE register obsahuje 0x00
*3- Zapisat konkretny prikaz do COMMAND registru*
*4- Overit ze RESPONSE register je nenulovy ak je v nom stale nulova hodnota tak opakujeme predchadzajuci krok.


__TOC__
'''*'''kompletny zoznam prikazov najdete na stranach 23-25 na tomto  [http://www.silabs.com/Support%20Documents/TechnicalDocs/Si1141-42-43-M01.pdf odkaze] v tabulke 5.


== Analýza ==
[[Súbor:BitTimingI2C.png|center]]
<center>'''Datovy diagram I2C komunikacie'''</center>


V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje,
[[Súbor:Priebeh_meraneho_svetla.png|center]]
ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:
<center>'''Priebeh meraneho svetla: cervena- odrazene IR svetlo, zelena-okolite viditelne svetlo ''' </center>


* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
* [https://www.parallax.com/sites/default/files/downloads/28046-Si1143-Gesture-Sensor-v1.2.pdf Katalógový list]
* obrázok zapojenia vývodov použitej súčiastky
*[https://www.parallax.com/sites/default/files/downloads/28046-Si1143-Gesture-Sensor-v1.2.pdf Katalógový list2 vseobecny pre senzory Si1141/42/43]
* odkaz na katalógový list
* priebehy dôležitých signálov
* este jedna polozka


== Popis riešenia ==
== Popis riešenia ==
=== Teoreticky popis programu ===


Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
Najprv sme si naštudovali základne funkcie senzora Si1143. Ako senzor funguje, ako ho treba zapojiť a pod. Začali sme písať zdrojový kód. Po napísaní základného kódu sme si overili či sme senzor dobre zapojili a či funguje správne. Zistili sme senzor nie je taký presný ako sme čakali. Prvý nápad bol aby senzor kopíroval náš prst a podľa jeho pohybu vykresľoval čiaru. Senzor zvláda len základne gestá napr. prejdenie rukov hore, dole, doprava a pod. Po zvážení sme si vymysleli novú hru VYBER LED. V programe sme si odfiltrovali údaje a tak zistili kde sa prst nachádza. Program je taktiež náchylný na vzdialenosť a musíme si dávať pozor aby sme inými časťami tela nezakrývali LEDky.
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.  


'''Schéma zapojenia snímača'''
[[Súbor:Zapojenie.png]]


[[Súbor:Example.jpg]]
[[Súbor:hra_screen_final1.png|center]]
<center>'''Obr. 3.''' Náhľad do hry </center>


Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
=== Vyvojovy diagram programu ===
nahrať už aspoň 10 študentov.


[[Súbor:MojObrazok.jpg|center|250px]]
Náš software sme navrhli vo vývojovom prostredí Arduino, kde sme využili znalosti z programovaného jazyka C/C++. V našom algoritme sme využili dva stupne filtrácie vstupného signálu, na presnejšie určenie vybratej LED. Vizuálnu časť nášho zadania sme takisto riešili v tomto vývojovom prostredí a síce iba jednoduchým výpisom do programovacieho okna, nakoľko naša zručnosť s vizualizácia je nízka.


=== Algoritmus a program ===
[[Súbor:VyvojovyDiagramProgramu.png|center]]
<center>'''Obr. 4.''' Vývojový diagram programu </center>


Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.
=== Algoritmus programu ===
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.


Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
'''Časť 1.''' Zadefinovanie premenných
<source lang="c">
/* Si1143 Example */
 
 
#define sleep  100
#include <Wire.h>
#include "Si1143.h";
 
int bias1,bias2,bias3;
unsigned int PS1,PS2,PS3;
int blinktime,counter,counter1,counter2,Ledposition;
unsigned int Light_Reading;
byte LowB,HighB;
bool selected;
unsigned long time;
 
</source>
 
'''Časť 2.'''Funkcia setup


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */


int main(void) {
void setup()
{
  Serial.begin(9600);
  delay(25);
  Wire.begin(); // join i2c bus (address optional for master)
  delay(25);
  write_reg(HW_KEY, 0x17); // Setting up LED Power to full
  write_reg(PS_LED21,0xFF);
  write_reg(PS_LED3, 0x0F);
  param_set(CHLIST,0b00010111);
  char parameter = read_reg(PARAM_RD,1);
  delay(1000);
  bias();
  counter = 0;
  counter1 = 0;
  counter2 = 0;
  selected = 0;
  StartGame();
}
  </source>
 
 
'''Časť 3.''' Funkcia vykonávajúca filtráciu signálu a vyhodnocovanie hry
 
<source lang="c">
 
void do_magic(){
 
 
  diff1 = PS1-PS1_old;
  diff2 = PS2-PS2_old;
  diff3 = PS3-PS3_old;
  diff1=abs(diff1);
  diff2=abs(diff2);
  diff3=abs(diff3);
 
  PS1_old=PS1;
  PS2_old=PS2;
  PS3_old=PS3;
 
 
  if(diff1>diff2 && diff1 >diff3){
    if(sum2>0 || sum3 >0){
      sum2=0; sum3=0;
    }
    sum1=sum1+1; 
      
      
     printf("Hello, World!\n");   
  }else if(diff2> diff1 && diff2 >diff3){
     return(0);
    if(sum1>0 || sum2 >0){
      sum1=0; sum3=0;
     }
    sum2=sum2+1;
   
  }else if(diff3>diff1 && diff3>diff2){   
    if(sum1>0 || sum2 >0){
      sum1=0; sum2=0;
    }
    sum3=sum3+1;
  }
if(sum1>0 || sum2>0 || sum3 > 0){
  if(sum1>4 && rand1==1){
    Serial.println("vybrata je LED1");
    sum1=0;
    succes=true;
    Serial.println("Vyhra");
  }
  if(sum2>4 && rand1==2){
    Serial.println("vybrata je LED2");
    sum2=0;
    succes=true;
    Serial.println("Vyhra");
  }
  if(sum3>4 && rand1==3){
      Serial.println("vybrata je LED3");
      sum3=0;
      succes=true;
      Serial.println("Vyhra");
  }
  if(succes){
  rand1=random(1,4);
 
  if(rand1>=1 && rand1<2){
    rand1=1;
  }else if(rand1>=2 && rand1<3){
    rand1 =2;
  }else{
    rand1=3;
  }
 
  time = millis();
  aktual=time-timing;
  timing=time;
  switch(rand1){
  case 1:
    Serial.println("Priloz prst k LED cislo 1");
  break;
  case 2:
    Serial.println("Priloz prst k LED cislo 2");
  break;   
  case 3:
     Serial.println("Priloz prst k LED cislo 3");
  break;
 
  }
  Serial.print("Time: ");
  Serial.println(aktual);
  succes=false;
  }
}
delay(10);
}
}
</source>
</source>


Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
'''Časť 5.''' Vypis úvodneho zobrazenia programu
 
<source lang="c">


Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]


[[Médiá:MojProgram.c|program.c]]
void StartGame(){
Serial.println("                            HRA: VYBER LED                ");
Serial.println("CIEL: Priloz prst co najrychlejsie k spravnej LEDke senzora podla  zobrazenia na monitore");
Serial.println("INSTRUKCIE: Rozlozenie LEDiek na snimaci:");
Serial.println("        LED2");
Serial.println("        - ");
Serial.println("        - ");
Serial.println("        - ");
Serial.println("        - ");
Serial.println("        - ");
Serial.println("        - ");
Serial.println("        - ");
Serial.println("        - ");
Serial.println("        - ");
Serial.println("        LED1 -------------------- LED3 ");
Serial.println(" ");
Serial.println("Hra zacne prilozenim prstu k  LED3 na senzore ");


}
</source>




Zdrojový kód: [[Si1143.h]], [[Si1143.c]], [[main.c]]


=== Overenie ===
== Záver ==


Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,
Naša hra sa volá jednoducho a výstižne "VYBER LED". Ciel tejto hry je priložiť prst k správnej LEDke senzora podľa zobrazenia na monitore. Led sa nachádza na každom rohu našého senzora v tvare L vid obrázok vyššie. Hra začne keď priložíte prst k LED3. Takto program počká aby ste si naštudovali návod a pochopili hru. Ak ste pripravený priložíte prst a čas vám beží. Program náhodne generuje LED1, LED2 alebo LED3. Po priložení Vám vypíše čas v milisekundách za aký ste to stihli.
ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje).
Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji,
odfotografujte ho.  


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.




[[Category:MEMS]] [[Category:I2C]]
[[Category:MEMS]] [[Category:I2C]]

Aktuálna revízia z 10:22, 24. máj 2016

Autori: Matúš Rus, Matej Cehula
Študijný odbor: Aplikovaná mechatronika a elektromobilita
Ročník: 1. Ing. (2015/2016)



Zadanie

Navrhnite ovládanie vybranej aplikácie cez gesture sensor Si1143 (Parallax).

Treba popísať ako senzor funguje, čo všetko sa ním dá merať, pripojiť ho k procesoru a vymyslieť ukážkovú aplikáciu.

  • Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke
  • Napíšte základný demonštračný program využívajúci vaše funkcie
  • Vymyslite a demonštrujte vhodnú aplikáciu
  • Dokumentáciu odovzdajte prostredníctvom tejto wiki stránky.
Obr. 1. Senzor Si1143 (Parallax)



Literatúra:

Analýza

V našom projekte sme si vybrali proximitny snímač Parallax Si1143. Na tom snímači chceme demonštrovať použitie proximitného snímača na detekciu prstu pred konkrétnou LEDkou( resp. snímačom senzoru). Tento snímač nie je vhodný na presnú detekciu pozície ruky alebo prsta v priestore, skôr na detekciu hrán. Snímač vie dobre zachytiť kedy a z ktorej strany objekt vstúpil do jeho zorného poľa a takisto kedy jeho zorné pole opustil. Najlepšia detekčná zóna je v rozsahu 50-2 cm pred snímačom. V naśom projekte sa budeme snažiť zistiť pred ktorým konkrétnym snímačom sa objekt(v naśom prípade prst) bude nachádzať a vyhodnotiť úspešnosť a čas za aký sa nám podarilo dosiahnuť vybratú LEDku.

Popis snímača

Vlastnosti snímača:

  • Napájacie napätie: <3-5.5>
  • Maximalny prúd: 4mA
  • Komunikačná zbernica: I2C
  • Rozmer: 5.08 x 5.79 x 0.48 cm
  • Operačná teplota: -40 do 85 °C
  • Vzorkovacia perióda: 100 snímkov/sekundu

Popis práce snímaća:

  • Snímač je vybavený foto diódami na zachytávanie viditeľného a odrazeného svetla. Snímač obsahuje 3 takéto diódy ktoré sa zapínajú postupne nie naraz, čo umožnuje zistiť pre každú diódu koľko svetla zachytila. Hlavné výhody tohto snímača sú:
  • 1- nízka spotreba (snímač dokáže zostať v spánkovom režime väčšinu času zbytok času je v "pulzovacom režime" kedy sa LEDky zapnú len na veľmi krátku dobu)
  • 2- dobrá filtrácia šumu vstupného signálu (Snímače pracujú v 2 krokoch, v prvom sa snímač zapne bez spustenia prisvetlovacej LED diódy a zmeria hodnotu svetla v okolí uloží hodnotu a následne zmeria hodnotu odrazeného svetla so zapnutou prisvetlovacou LED diódou. Celé toho meranie trvá krátko približne 25.6 μs )


Popis vývodov snímača:

C Pin Typ Funkcia
1 GND Napájanie Zem
2 VIN Napájanie Napájacie napätie
3 INT Výstup Prerušenie(nepripojené)
4 SCL Vstup I2C hodinová linka
5 SDA Vstup/Výstup I2C dátová linka

Popis doležitých registrov snímača:

Nazov Funkcia
COMMAND REGISTER Register na zadávanie požadovanej funkcie senzora
RESPONSE REGISTER Register obsahujúci chybove upozornenia
PARAM_RD Register slúžiaci na čitanie dát zo senzora
PARAM_WR Register slúžiaci na na zápis do RAM

Zapojenie snimaca:

Obr. 2. Schéma zapojenia snímača

I2C komunikacia:

Senzor moze byt nastaveny do Autonomneho rezimu, alebo do Prikazoveho rezimu tzv. Forced measuremet.

  • Prikazovy rezim:

Ked je senzor v prikazovom rezime, senzor nevykonava ziadne merania bez ziadosti od strany programatora pomocou specialneho prikazu inicializacie. CHLIST parameter sa musi zapisat do senzora aby senzor vedel ze ma vykonat meranie. Ked je senzor nastaveny do prikazoveho rezimu, do parametru MEAS_RATE sa vlozi 0 cim sa senzoru zabrani vykonat akekolvek meranie bez prikazu zo strany programatora.

  • Autonomny rezim:

Senzor je nastaveny do autonomneho rezimu ked hodnota v MEAS_RATE je nenulova, potom tato hodnota reprezentuje cas interval v ktorom sa senzor zobudza na meranie. Akonahle sa senzor zobudi na meranie, vykonaju sa 3 proximitne merania pre kazdy senzor (PS1, PS2, PS3) v poradi ALS_VIS, ALS_IR and AUX co znamena ze senzor najprv zmeria hodnotu okoliteho svetla, potom hodnotu odrazeneho svetla a nakoniec urobi rozdiel z tychto hodnot. Na zabranenie toho aby sa vykonali vsetky tri sucastne, su k dispozici dva casovace PS_RATE a ALS_RATE, ktore urcuju ktora LED sa kedy spusti, po vyprsani PS_RATE sa spusti meranie LEDky ktora je nastavena v CHLIST(channel list). Po skonceni vsetkych merani sa mikrocontroler vrati do spacieho rezimu az kym sa nezobudi na dalsie meranie podla MEAS_RATE.

  • Programovacia sekvencia

Aby sme mohli zadat prikaz musime vykonat nasledujucu sekvenciu krokov:

  • 1- Do registra COMMAND zapiseme hodnotu 0x00 aby sme vycistili RESPONSE register
  • 2- Overit ze RESPONSE register obsahuje 0x00
  • 3- Zapisat konkretny prikaz do COMMAND registru*
  • 4- Overit ze RESPONSE register je nenulovy ak je v nom stale nulova hodnota tak opakujeme predchadzajuci krok.

*kompletny zoznam prikazov najdete na stranach 23-25 na tomto odkaze v tabulke 5.

Datovy diagram I2C komunikacie
Priebeh meraneho svetla: cervena- odrazene IR svetlo, zelena-okolite viditelne svetlo

Popis riešenia

Teoreticky popis programu

Najprv sme si naštudovali základne funkcie senzora Si1143. Ako senzor funguje, ako ho treba zapojiť a pod. Začali sme písať zdrojový kód. Po napísaní základného kódu sme si overili či sme senzor dobre zapojili a či funguje správne. Zistili sme senzor nie je taký presný ako sme čakali. Prvý nápad bol aby senzor kopíroval náš prst a podľa jeho pohybu vykresľoval čiaru. Senzor zvláda len základne gestá napr. prejdenie rukov hore, dole, doprava a pod. Po zvážení sme si vymysleli novú hru VYBER LED. V programe sme si odfiltrovali údaje a tak zistili kde sa prst nachádza. Program je taktiež náchylný na vzdialenosť a musíme si dávať pozor aby sme inými časťami tela nezakrývali LEDky.


Obr. 3. Náhľad do hry

Vyvojovy diagram programu

Náš software sme navrhli vo vývojovom prostredí Arduino, kde sme využili znalosti z programovaného jazyka C/C++. V našom algoritme sme využili dva stupne filtrácie vstupného signálu, na presnejšie určenie vybratej LED. Vizuálnu časť nášho zadania sme takisto riešili v tomto vývojovom prostredí a síce iba jednoduchým výpisom do programovacieho okna, nakoľko naša zručnosť s vizualizácia je nízka.


Obr. 4. Vývojový diagram programu

Algoritmus programu

Časť 1. Zadefinovanie premenných

/* Si1143 Example */


#define sleep  100
#include <Wire.h>
#include "Si1143.h";

int bias1,bias2,bias3;
unsigned int PS1,PS2,PS3;
int blinktime,counter,counter1,counter2,Ledposition;
unsigned int Light_Reading;
byte LowB,HighB;
bool selected;
unsigned long time;

Časť 2.Funkcia setup

void setup()
{
  Serial.begin(9600);
  delay(25);
  Wire.begin(); // join i2c bus (address optional for master)
  delay(25);
 
  write_reg(HW_KEY, 0x17); // Setting up LED Power to full
  write_reg(PS_LED21,0xFF);
  write_reg(PS_LED3, 0x0F);
  param_set(CHLIST,0b00010111);
 
  char parameter = read_reg(PARAM_RD,1);
  delay(1000);
 
  bias();
 
  counter = 0;
  counter1 = 0;
  counter2 = 0;
  selected = 0;
  StartGame();
}


Časť 3. Funkcia vykonávajúca filtráciu signálu a vyhodnocovanie hry

void do_magic(){
  
  
 
  diff1 = PS1-PS1_old;
  diff2 = PS2-PS2_old;
  diff3 = PS3-PS3_old;
  diff1=abs(diff1);
  diff2=abs(diff2);
  diff3=abs(diff3);
  
  PS1_old=PS1;
  PS2_old=PS2;
  PS3_old=PS3;
 
  
  
  if(diff1>diff2 && diff1 >diff3){
     if(sum2>0 || sum3 >0){
      sum2=0; sum3=0;
    }
    sum1=sum1+1;   
    
  }else if(diff2> diff1 && diff2 >diff3){
     if(sum1>0 || sum2 >0){
      sum1=0; sum3=0;
    }
    sum2=sum2+1;
    
  }else if(diff3>diff1 && diff3>diff2){    
    if(sum1>0 || sum2 >0){
      sum1=0; sum2=0;
    }
    sum3=sum3+1;
  }
if(sum1>0 || sum2>0 || sum3 > 0){
  if(sum1>4 && rand1==1){
    Serial.println("vybrata je LED1");
    sum1=0;
    succes=true;
    Serial.println("Vyhra");
  }
   if(sum2>4 && rand1==2){
    Serial.println("vybrata je LED2");
    sum2=0;
    succes=true;
    Serial.println("Vyhra");
  }
   if(sum3>4 && rand1==3){
      Serial.println("vybrata je LED3");
      sum3=0;
      succes=true;
      Serial.println("Vyhra");
  }
   if(succes){
  rand1=random(1,4);
  
  if(rand1>=1 && rand1<2){
    rand1=1;
  }else if(rand1>=2 && rand1<3){
    rand1 =2;
  }else{
    rand1=3;
  }
  
  time = millis();
  aktual=time-timing;
  timing=time;
  switch(rand1){
  case 1:
    Serial.println("Priloz prst k LED cislo 1");
   break;
   case 2:
    Serial.println("Priloz prst k LED cislo 2");
  break;  
   case 3:
    Serial.println("Priloz prst k LED cislo 3");
  break;
  
  }
   Serial.print("Time: ");
   Serial.println(aktual);
   succes=false;
  }
}
delay(10);
}

Časť 5. Vypis úvodneho zobrazenia programu

void StartGame(){
Serial.println("                            HRA: VYBER LED                ");
Serial.println("CIEL: Priloz prst co najrychlejsie k spravnej LEDke senzora podla  zobrazenia na monitore");
Serial.println("INSTRUKCIE: Rozlozenie LEDiek na snimaci:");
Serial.println("        LED2");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("         - ");
Serial.println("        LED1 -------------------- LED3 ");
Serial.println(" ");
Serial.println("Hra zacne prilozenim prstu k  LED3 na senzore ");

}


Zdrojový kód: Si1143.h, Si1143.c, main.c

Záver

Naša hra sa volá jednoducho a výstižne "VYBER LED". Ciel tejto hry je priložiť prst k správnej LEDke senzora podľa zobrazenia na monitore. Led sa nachádza na každom rohu našého senzora v tvare L vid obrázok vyššie. Hra začne keď priložíte prst k LED3. Takto program počká aby ste si naštudovali návod a pochopili hru. Ak ste pripravený priložíte prst a čas vám beží. Program náhodne generuje LED1, LED2 alebo LED3. Po priložení Vám vypíše čas v milisekundách za aký ste to stihli.