<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Juraj</id>
	<title>Kiwiki - Príspevky používateľa [sk]</title>
	<link rel="self" type="application/atom+xml" href="http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Juraj"/>
	<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php/%C5%A0peci%C3%A1lne:Pr%C3%ADspevky/Juraj"/>
	<updated>2026-05-06T05:33:00Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Hlavn%C3%A1_str%C3%A1nka&amp;diff=13284</id>
		<title>Hlavná stránka</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Hlavn%C3%A1_str%C3%A1nka&amp;diff=13284"/>
		<updated>2024-10-03T19:29:11Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;mainpage_topbox&amp;quot; style=&amp;quot;margin:0px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mainpage_pagetitle&amp;quot; style=&amp;quot;text-align:center&amp;quot;&amp;gt;Kiwiki - informácie nakope&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mainpage_sitelinks&amp;quot;&amp;gt;&lt;br /&gt;
[[File:studentskePrace.jpg|link=Študentské práce]] [[File:PodkladyKvyucbe.jpg|link=Podklady k prednáškam a cvičeniam]] [[File:Projekty.jpg|link=Projekty]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot; style=&amp;quot;background-color:#FE9A2E&amp;quot;&amp;gt;'''Pomôžte rozšíriť kiwiki'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot; style=&amp;quot;padding:0px 20px; border:1px solid gray&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;border:1px; margin:0px;vertical-align:top&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;quot;Predstavte si svet, v ktorom môže každý človek slobodone zdieľať všetky vedomosti&amp;quot; (slogan Wikimedia foundation). Predstav si tú množinu vedomostí, do ktorých môžeš prispieť aj Ty!&lt;br /&gt;
&lt;br /&gt;
'''Mysli slobodne - buď open source.'''&lt;br /&gt;
&lt;br /&gt;
Zverejni svoju záverečnú prácu na portáli kiwiki.info. Prečo?&lt;br /&gt;
* Aby si ju mohli prečítať tí, ktorí sa o danú problematiku zaujímajú.&lt;br /&gt;
* Pretože Tvoja záverečná práca je dobrá na to, aby bola zamknutá v univerzitnom archíve.&lt;br /&gt;
* Ak boli ľubovolné informácie z webu kiwiki.info užitočné pri štúdiu, tak rozšír množinu týchto informácií.&lt;br /&gt;
Viac informácií o podmienkach zverejnenia na stránke [[Študentské práce]].&lt;br /&gt;
&lt;br /&gt;
Kontaktujte ma: [[Redaktor:Juraj]]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| style=&amp;quot;border:1px; margin:0px;vertical-align:top&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
|class=&amp;quot;mainpage_hubbox&amp;quot; valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot;&amp;gt;'''Čo je kiwiki'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:5px&amp;quot; itemscope itemtype=&amp;quot;http://schema.org/CreativeWork&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span itemprop=&amp;quot;name&amp;quot;&amp;gt;Kiwiki&amp;lt;/span&amp;gt; je &amp;lt;span itemprop=&amp;quot;alternativeHeadline&amp;quot;&amp;gt;otvorená a slobodná wiki&amp;lt;/span&amp;gt; obsahujúca &amp;lt;span itemprop=&amp;quot;about&amp;quot; itemscope itemtype=&amp;quot;http://schema.org/Thing&amp;quot;&amp;gt;&amp;lt;span itemprop=&amp;quot;name&amp;quot;&amp;gt;študentské práce&amp;lt;/span&amp;gt; a &amp;lt;span itemprop=&amp;quot;name&amp;quot;&amp;gt;výučbové materiály&amp;lt;/span&amp;gt; a rôzne  &amp;lt;span itemprop=&amp;quot;name&amp;quot;&amp;gt;projekty&amp;lt;/span&amp;gt;. Na kiwiki zú zverejnené:&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span itemprop=&amp;quot;description&amp;quot;&amp;gt;záverečné práce&amp;lt;/span&amp;gt; (bakalárske, ročníkové, diplomové). &lt;br /&gt;
* &amp;lt;span itemprop=&amp;quot;description&amp;quot;&amp;gt;študijné materiály&amp;lt;/span&amp;gt; pre predmety vyučované na technických fakultách.&lt;br /&gt;
* zaujímavé &amp;lt;span itemprop=&amp;quot;description&amp;quot;&amp;gt;projekty&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|class=&amp;quot;mainpage_hubbox&amp;quot; valign=&amp;quot;top&amp;quot; style=&amp;quot;width:30%&amp;quot;|&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot; &amp;gt;'''Ako sme veľkí'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&lt;br /&gt;
Táto wiki má už &lt;br /&gt;
*{{NUMBEROFPAGES}} stránok, z toho je&lt;br /&gt;
**{{NUMBEROFARTICLES}} článkov&lt;br /&gt;
**{{NUMBEROFFILES}} nahratých súborov&lt;br /&gt;
*{{NUMBEROFUSERS}} redaktorov.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|class=&amp;quot;mainpage_hubbox&amp;quot; valign=&amp;quot;top&amp;quot; style=&amp;quot;width:35%&amp;quot;|&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot; &amp;gt;'''Repozitár zdrojových kódov'''&amp;lt;/div&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
| [[File:gitlab.png|150px|link=https://gitlab.nsoric.com/mtf]] &lt;br /&gt;
| &lt;br /&gt;
* Zdrojové kódy z riešení bakalárskych a diplomových prác&lt;br /&gt;
* https://nsoric.mtf.stuba.sk&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=I2C_-_z%C3%A1kladn%C3%A9_pou%C5%BEitie_pre_STM32&amp;diff=13279</id>
		<title>I2C - základné použitie pre STM32</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=I2C_-_z%C3%A1kladn%C3%A9_pou%C5%BEitie_pre_STM32&amp;diff=13279"/>
		<updated>2023-03-25T20:45:00Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah_vpravo}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Rozhranie I2C obsahuje každý mikrokontrolér rodiny STM32. Zvyčajne sú k dispozícii minimálne 2 nezávislá rozhrania. &lt;br /&gt;
&lt;br /&gt;
==Základná konfigurácia rozhrania I2C==&lt;br /&gt;
Po vytvorení projektu v STM32CubeMX alebo STM32IDE je potrebné si aktivovať rozranie: v časti &amp;quot;Pinout &amp;amp; Configuration&amp;quot; si v vyberieme rozhranie I2C. V konfiguračnej časti sa zobrazí voľba pre výber typu zbernice; vyberieme &amp;quot;I2C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Súbor:I2c stm32 config.png|600px|Aktivácia rozhrania I2C]]&lt;br /&gt;
&lt;br /&gt;
Aktivácia rozhrania I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V pravej časti sa zobrazia piny MCU, ktoré majú priradenú funkciu liniek SDA a SCL.&lt;br /&gt;
&lt;br /&gt;
===Konfigurácia I2C rozhrania===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:I2c stm32 parameters.png|600px|Parametre rozhrania I2C]]&lt;br /&gt;
&lt;br /&gt;
====Nastavenie parametrov I2C rozhrania====&lt;br /&gt;
Význam jednotlivých nastavení:&lt;br /&gt;
; Custom timing : Dovoľuje nastaviť si vlastné parametre generovania časového signálu. Odporúča sa ponechať prednastavenú hodnotu ''Disabled''. {{default|Disabled}}&lt;br /&gt;
; I2C Speed Mode: Voľba režimu časovania. V zozname sú len tie režimy, ktoré vybratý MCU podporuje. &lt;br /&gt;
* Standard Mode&lt;br /&gt;
* Fast Mode&lt;br /&gt;
* Fast Mode Plus&lt;br /&gt;
; I2C Speed Frequency: hodnota taktovacej frekvencie pre vybraný režim. Táto hodnota sa automaticky nastaví na maximálnu povolenú hodnotu pre vybraný režim.&lt;br /&gt;
; Rise Time / Fall Time: manuálna modifikácia parametrov pre CLK. Detaily o výpočte týchto časov sú [https://fastbitlab.com/i2c-rise-time-calculation tu].&lt;br /&gt;
; Analog Filter : Ak sú na zbernici I2C nežiaduce rušenia signálu (pochádzajúce zo zlého návrhu dosky plošného spoje, aplikácie na riadenie motora, ...), môžete použiť digitálne a analógové filtre šumu, ktoré sú k dispozícii medzi logikou GPIO a registrami I2C. Analógový filter je implementovaný v súlade so špecifikáciou I2C, ktorá vyžaduje potlačenie špičiek so šírkou impulzu do 50 ns. Digitálny filter umožňuje potlačiť špičky s programovateľnou dĺžkou 1 až 15 periód I2CCLK. Podrobnosti o nízkoúrovňovom nastavení časovania je v dokumete AN4235&amp;lt;ref&amp;gt;Application Note 4235 - https://www.st.com/resource/en/application_note/an4235-i2c-timing-configuration-tool-for-stm32f3xxxx-and-stm32f0xxxx-microcontrollers-stmicroelectronics.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vlastnosti v režime slave zbernice I2C:&lt;br /&gt;
; Clock No Stretch Mode: vypne možnosť pozdržania hodinového signálu. {{default|Disabled}}&lt;br /&gt;
* Po rozpoznaní zodpovedajúcej adresy I2C s požiadavkou na čítanie MCU okamžite odošle obsah registra I2C_TXDR (dátový register I2C).&lt;br /&gt;
* Softvér na MCU musí zabezpečiť, aby vysielací register (I2C_TXDR) vždy obsahoval platné údaje.&lt;br /&gt;
* Subsystém I2C bude automaticky potvrdzovať všetky udalosti čítania a zápisu z nadradenej jednotky&amp;lt;ref&amp;gt;https://drolliblog.wordpress.com/2017/11/04/stm32l031x6-slave-transmitter-and-receiver/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
; General Call Address Detection: V režime Slave je rozhranie schopné rozpoznať svoje vlastné adresy (7 alebo 10-bitové) a všeobecnú adresu volania. Rozpoznávanie adresy všeobecného volania je možné zapnúť alebo vypnúť touto voľbou.&lt;br /&gt;
; Primary Address Length Selection: Dĺžka adresy usla slave. {{default|7bit}}&lt;br /&gt;
; Dual Address Acknowledgement: Režim, kedy má uzol slave 2 adresy. {{default|Disabled}}&lt;br /&gt;
; Primary Slave Address: Adresa uzla slave (režim slave)&lt;br /&gt;
&lt;br /&gt;
====Nastavenie NVIC====&lt;br /&gt;
* I2Cx event interrupt&lt;br /&gt;
* I2Cx error interrupt&lt;br /&gt;
&lt;br /&gt;
====Nastavenie DMA====&lt;br /&gt;
Dovoľuje pridať 2 požiadavky na DMA prenos:&lt;br /&gt;
* I2Cx_RX - z periférie do pamäte&lt;br /&gt;
* I2Cx_TX - z pamäte do periférie&lt;br /&gt;
&lt;br /&gt;
==Práca s rozhraním I2C v programovom kóde==&lt;br /&gt;
Základná kostra vygenerovaného programu v prostredí STM32CubeMX/STM32IDE:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;quot;main.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* Private variables ---------------------------------------------------------*/&lt;br /&gt;
I2C_HandleTypeDef hi2c1;&lt;br /&gt;
&lt;br /&gt;
/* Private function prototypes -----------------------------------------------*/&lt;br /&gt;
void SystemClock_Config(void);&lt;br /&gt;
static void MX_GPIO_Init(void);&lt;br /&gt;
static void MX_I2C1_Init(void);&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  HAL_Init();&lt;br /&gt;
  SystemClock_Config();&lt;br /&gt;
&lt;br /&gt;
  MX_GPIO_Init();&lt;br /&gt;
  MX_I2C1_Init();&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void MX_I2C1_Init(void)&lt;br /&gt;
{&lt;br /&gt;
  hi2c1.Instance = I2C1;&lt;br /&gt;
  hi2c1.Init.Timing = 0x00000E14;&lt;br /&gt;
  hi2c1.Init.OwnAddress1 = 0;&lt;br /&gt;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;&lt;br /&gt;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;&lt;br /&gt;
  hi2c1.Init.OwnAddress2 = 0;&lt;br /&gt;
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;&lt;br /&gt;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;&lt;br /&gt;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;&lt;br /&gt;
  if (HAL_I2C_Init(&amp;amp;hi2c1) != HAL_OK)&lt;br /&gt;
  {&lt;br /&gt;
    Error_Handler();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Configure Analogue filter */&lt;br /&gt;
  if (HAL_I2CEx_ConfigAnalogFilter(&amp;amp;hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)&lt;br /&gt;
  {&lt;br /&gt;
    Error_Handler();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Configure Digital filter */&lt;br /&gt;
  if (HAL_I2CEx_ConfigDigitalFilter(&amp;amp;hi2c1, 0) != HAL_OK)&lt;br /&gt;
  {&lt;br /&gt;
    Error_Handler();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vygenerovaná funkcia `MX_I2C1_Init()` sa stará o správne nastavenie parametrov podľa grafického konfigurátora v predchádzajúcom kroku. Po zbernici I2C môžeme komunikovať až po úspešnom ukončení funkcie `MX_I2C1_Init()`.&lt;br /&gt;
&lt;br /&gt;
===Funkcie pre I2C komunikáciu===&lt;br /&gt;
&lt;br /&gt;
Existujú dva spôsoby prenosu:&lt;br /&gt;
; Režim blokovania : Komunikácia prebieha v režime dotazovania. Stav spracovania všetkých údajov sa vracia tou istou funkciou po ukončení prenosu.&lt;br /&gt;
; Režim bez blokovania : Komunikácia sa vykonáva pomocou prerušenia alebo DMA. Tieto funkcie vracajú stav spustenia prenosu. Ukončenie spracovania údajov bude indikované prostredníctvom vyhradeného IRQ I2C pri použití režimu prerušenia alebo IRQ DMA pri použití režimu DMA.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Funkcie v blokujúcom režime&lt;br /&gt;
! Funkcie v neblokujúcom režime s prerušením&lt;br /&gt;
! Funkcie v neblokujúcom režime s DMA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* HAL_I2C_Master_Transmit()&lt;br /&gt;
* HAL_I2C_Master_Receive()&lt;br /&gt;
* HAL_I2C_Slave_Transmit()&lt;br /&gt;
* HAL_I2C_Slave_Receive()&lt;br /&gt;
* HAL_I2C_Mem_Write()&lt;br /&gt;
* HAL_I2C_Mem_Read()&lt;br /&gt;
* HAL_I2C_IsDeviceReady()&lt;br /&gt;
|&lt;br /&gt;
* HAL_I2C_Master_Transmit_IT()&lt;br /&gt;
* HAL_I2C_Master_Receive_IT()&lt;br /&gt;
* HAL_I2C_Slave_Transmit_IT()&lt;br /&gt;
* HAL_I2C_Slave_Receive_IT()&lt;br /&gt;
* HAL_I2C_Mem_Write_IT()&lt;br /&gt;
* HAL_I2C_Mem_Read_IT()&lt;br /&gt;
* HAL_I2C_Master_Seq_Transmit_IT()&lt;br /&gt;
* HAL_I2C_Master_Seq_Receive_IT()&lt;br /&gt;
* HAL_I2C_Slave_Seq_Transmit_IT()&lt;br /&gt;
* HAL_I2C_Slave_Seq_Receive_IT()&lt;br /&gt;
* HAL_I2C_EnableListen_IT()&lt;br /&gt;
* HAL_I2C_DisableListen_IT()&lt;br /&gt;
* HAL_I2C_Master_Abort_IT()&lt;br /&gt;
|&lt;br /&gt;
* HAL_I2C_Master_Transmit_DMA()&lt;br /&gt;
* HAL_I2C_Master_Receive_DMA()&lt;br /&gt;
* HAL_I2C_Slave_Transmit_DMA()&lt;br /&gt;
* HAL_I2C_Slave_Receive_DMA()&lt;br /&gt;
* HAL_I2C_Mem_Write_DMA()&lt;br /&gt;
* HAL_I2C_Mem_Read_DMA()&lt;br /&gt;
* HAL_I2C_Master_Seq_Transmit_DMA()&lt;br /&gt;
* HAL_I2C_Master_Seq_Receive_DMA()&lt;br /&gt;
* HAL_I2C_Slave_Seq_Transmit_DMA()&lt;br /&gt;
* HAL_I2C_Slave_Seq_Receive_DMA()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zoznam funkcií spätného volania pre neblokujúce režimy:&lt;br /&gt;
* HAL_I2C_MasterTxCpltCallback()&lt;br /&gt;
* HAL_I2C_MasterRxCpltCallback()&lt;br /&gt;
* HAL_I2C_SlaveTxCpltCallback()&lt;br /&gt;
* HAL_I2C_SlaveRxCpltCallback()&lt;br /&gt;
* HAL_I2C_MemTxCpltCallback()&lt;br /&gt;
* HAL_I2C_MemRxCpltCallback()&lt;br /&gt;
* HAL_I2C_AddrCallback()&lt;br /&gt;
* HAL_I2C_ListenCpltCallback()&lt;br /&gt;
* HAL_I2C_ErrorCallback()&lt;br /&gt;
* HAL_I2C_AbortCpltCallback()&lt;br /&gt;
&lt;br /&gt;
====HAL_I2C_Master_Transmit====&lt;br /&gt;
V režime Master odošle údaje ''pData'' v blokujúcom režime&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* hi2c - Pointer na štruktúru I2C_HandleTypeDef - nakonfigurované rozhranie I2C&lt;br /&gt;
* DevAddress - adresa cieľového zariadenia slave. 7 bitová adresa slave zariadenia uvedená v datasheete musí byť posunutá o 1 bit vľavo.&lt;br /&gt;
* pData - Pointer na odosielané dáta&lt;br /&gt;
* Size - počet bajtov, ktoré sa budú odosielať. &lt;br /&gt;
* Timeout - časový limit pre odoslanie. Uvádza sa v milisekundách. Po uplynutí tohto času sa odosielanie ukončí a funkcia vráti chybový kód.&lt;br /&gt;
&lt;br /&gt;
====HAL_I2C_Master_Receive====&lt;br /&gt;
V režime Master prijme požadovaný počet bajtov  v blokujúcom režime&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* hi2c - Pointer na štruktúru I2C_HandleTypeDef - nakonfigurované rozhranie I2C&lt;br /&gt;
* DevAddress - adresa cieľového zariadenia slave. 7 bitová adresa slave zariadenia uvedená v datasheete musí byť posunutá o 1 bit vľavo.&lt;br /&gt;
* pData - Pointer na buffer, kde budú prijaté dáta uložené&lt;br /&gt;
* Size - počet bajtov, ktoré sa budú prijímať. &lt;br /&gt;
* Timeout - časový limit pre príjem. Uvádza sa v milisekundách. Po uplynutí tohto času sa príjem ukončí a funkcia vráti chybový kód.&lt;br /&gt;
&lt;br /&gt;
====HAL_I2C_Master_Transmit_IT / HAL_I2C_Master_Transmit_DMA====&lt;br /&gt;
V režime Master odošle údaje ''pData'' v neblokujúcom režime s prerušením / s DMA&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);&lt;br /&gt;
HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Význam parametrov je rovnaký ako v prípade HAL_I2C_Master_Transmit. Chýba parameter ''Timeout''. Po ukončení odosielania sa spustí ISR ''I2C1_EV_IRQHandler'' (definovaný v súbore stm32NNxxx_it). Ten zabezpečí zavolanie funkcie spätného volania:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)&lt;br /&gt;
{&lt;br /&gt;
  // tento kod sa vykona po ukonceni odoslania cez I2C&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Túto funkciu je potrebné si implemetovať v kóde aplikácie. Jej definícia sa nachádza v súbore stm32NNXXxx_hal_i2c.c&lt;br /&gt;
&lt;br /&gt;
====HAL_I2C_Master_Receive_IT / HAL_I2C_Master_Receive_DMA====&lt;br /&gt;
V režime Master prijme údaje v neblokujúcom režime s prerušením / s DMA&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)&lt;br /&gt;
HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Význam parametrov je rovnaký ako v prípade HAL_I2C_Master_Receive. Chýba parameter ''Timeout''. Po ukončení odosielania sa spustí ISR ''I2C1_EV_IRQHandler'' (definovaný v súbore stm32NNxxx_it). Ten zabezpečí zavolanie funkcie spätného volania:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)&lt;br /&gt;
{&lt;br /&gt;
  // tento kod sa vykona po ukonceni odoslania cez I2C&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Túto funkciu je potrebné si implemetovať v kóde aplikácie. Jej definícia sa nachádza v súbore stm32NNXXxx_hal_i2c.c&lt;br /&gt;
&lt;br /&gt;
====HAL_I2C_Mem_Write / HAL_I2C_Mem_Write====&lt;br /&gt;
V režime Master zapíše údaje ''pData'' na požadovanú adresu v uzle slave. Komunikácia je v blokujúcom režime.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);&lt;br /&gt;
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* hi2c - Pointer na štruktúru I2C_HandleTypeDef - nakonfigurované rozhranie I2C&lt;br /&gt;
* DevAddress - adresa cieľového zariadenia slave. 7 bitová adresa slave zariadenia uvedená v datasheete musí byť posunutá o 1 bit vľavo.&lt;br /&gt;
* MemAddress - adresa v pamäti komunikujúcej stranu - uzla slave&lt;br /&gt;
* MemAddSize - počet bajtov, ktoré sa majú zapísať/prečítať.&lt;br /&gt;
* pData - Pointer na odosielané/prijímané dáta&lt;br /&gt;
* Size - počet bajtov, ktoré sa budú odosielať/prijímať. &lt;br /&gt;
* Timeout - časový limit pre odoslanie. Uvádza sa v milisekundách. Po uplynutí tohto času sa odosielanie ukončí a funkcia vráti chybový kód.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zdroje a odkazy==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=GNU/GPL/KI&amp;diff=13278</id>
		<title>GNU/GPL/KI</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=GNU/GPL/KI&amp;diff=13278"/>
		<updated>2023-03-25T19:40:11Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Licencia GNU/GPL pre študijné materiály KI=&lt;br /&gt;
*Tento dokument slúži ako študijný materiál.&lt;br /&gt;
*Tento dokument je možné volne šírit pod licenciou ’GNU General Public Licence’ za podmienok uvedených v tejto licencii a s uvedením zdroja pôvodu:&lt;br /&gt;
**kiwiki - otvorená wiki s výukovými materiálmi a študentskými prácami&lt;br /&gt;
**http://www.kiwiki.info&lt;br /&gt;
*Pri citovaní častí z tohoto dokumentu je nevyhnutné rešpektovat články 4 a 5 licencie GPL.&lt;br /&gt;
*Použitie dokumentu je na vlastné riziko. Tvorcovia dokumentu venovali maximálnu pozornosť tomu, aby bol tento dokument bez vecných a formálnych chýb, absolútnu bezchybnosť nemôžu ale zaručiť. Prípadné následky omylov a chýb v dokumente Vás neoprávňujú k náhrade škody, najmä nie sú dôvodom k zmene Vášho hodnotenia študijných výsledkov.&lt;br /&gt;
*Slovesnké znenie licencie GNU/GPL je dostupné na adrese http://www.gpl.sk/v1&lt;br /&gt;
[[Kategória:kiwiki]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:Default&amp;diff=13277</id>
		<title>Šablóna:Default</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:Default&amp;diff=13277"/>
		<updated>2023-03-25T19:32:07Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Vytvorená stránka „&amp;lt;span style=&amp;quot;background-color:rgb(230,220,215)&amp;quot;&amp;gt;Default: {{{1}}}&amp;lt;/span&amp;gt;“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;background-color:rgb(230,220,215)&amp;quot;&amp;gt;Default: {{{1}}}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=I2C_-_z%C3%A1kladn%C3%A9_pou%C5%BEitie_pre_STM32&amp;diff=13276</id>
		<title>I2C - základné použitie pre STM32</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=I2C_-_z%C3%A1kladn%C3%A9_pou%C5%BEitie_pre_STM32&amp;diff=13276"/>
		<updated>2023-03-25T14:46:25Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Vytvorená stránka „{{MCU_ARM_Obsah_vpravo}} __TOC__  Rozhranie I2C obsahuje každý mikrokontrolér rodiny STM32. Zvyčajne sú k dispozícii minimálne 2 nezávislá rozhrania.   ==Zákla…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah_vpravo}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Rozhranie I2C obsahuje každý mikrokontrolér rodiny STM32. Zvyčajne sú k dispozícii minimálne 2 nezávislá rozhrania. &lt;br /&gt;
&lt;br /&gt;
==Základná konfigurácia rozhrania I2C==&lt;br /&gt;
Po vytvorení projektu v STM32CubeMX alebo STM32IDE je potrebné si aktivovať rozranie: v časti &amp;quot;Pinout &amp;amp; Configuration&amp;quot; si v vyberieme rozhranie I2C. V konfiguračnej časti sa zobrazí voľba pre výber typu zbernice; vyberieme &amp;quot;I2C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Súbor:I2c stm32 config.png|600px|Aktivácia rozhrania I2C]]&lt;br /&gt;
&lt;br /&gt;
Aktivácia rozhrania I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V pravej časti sa zobrazia piny MCU, ktoré majú priradenú funkciu liniek SDA a SCL.&lt;br /&gt;
&lt;br /&gt;
===Nastavenie parametrov I2C rozhrania===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:I2c stm32 parameters.png|600px|Parametre rozhrania I2C]]&lt;br /&gt;
&lt;br /&gt;
Parametre rozhrania I2C&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:I2c_stm32_config.png&amp;diff=13275</id>
		<title>Súbor:I2c stm32 config.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:I2c_stm32_config.png&amp;diff=13275"/>
		<updated>2023-03-25T14:45:32Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:I2c_stm32_parameters.png&amp;diff=13274</id>
		<title>Súbor:I2c stm32 parameters.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:I2c_stm32_parameters.png&amp;diff=13274"/>
		<updated>2023-03-25T14:44:27Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Mikrokontrol%C3%A9ry_ARM&amp;diff=13273</id>
		<title>Mikrokontroléry ARM</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Mikrokontrol%C3%A9ry_ARM&amp;diff=13273"/>
		<updated>2023-03-25T14:20:12Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obsah ==&lt;br /&gt;
{{MCU ARM Obsah}}&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13272</id>
		<title>Komunikačné rozhranie I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13272"/>
		<updated>2023-03-25T14:19:34Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah_vpravo}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Inter-Integrated Circuit alebo I²C je dvojvodičová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná predovšetkým na prepojenie periférnych zariadení s mikrokontrolérom. Na zbernicu sú pripojené zariadenia rozdelené na riadiace (Master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (Slave - zariadenie adresované Masterom) &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;Gabriel Gašpar a Juraj Ďuďák. Využitie mikrokontrolérov v automatizovanom riadení. Spektrum, 2023. ISBN: 978-80-227-5283-1.&amp;lt;/ref&amp;gt; na Obr. 1 &amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;Matúš Nečas: Multi-displej systém pre embedded aplikácie, Bakalárska práca, MTF STUBA, 2023&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Súbor:Mcu_i2c_1_pripojenie.png|600px|Obr. 1a. Pripojenie zaradení na zbernicu]]&lt;br /&gt;
| [[Súbor:Mcu_i2c_1_schematic.jpg|600px|Obr. 1b. Interné zapojenie]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Obr. 1 A)Pripojenie zaradení na zbernicu, B) Interná schéma zapojenia rozhrania I2C&amp;lt;ref name=&amp;quot;sparkfun&amp;quot;&amp;gt;https://learn.sparkfun.com/tutorials/i2c/all&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SDA (Serial Data) je dátový signál a SCL (Serial Clock) je hodinový signál. Hodinový signál je vždy generovaný aktuálnym radičom zbernice; niektoré periférne zariadenia môžu niekedy vynútiť nízku hodnotu hodinového signálu, aby radič oneskoril odoslanie ďalších údajov (alebo aby potreboval viac času na prípravu údajov pred pokusom radiča o ich taktovanie). Tento postup sa nazýva &amp;quot;natiahnutie hodín&amp;quot; (clock stretching).&lt;br /&gt;
&lt;br /&gt;
'''Terminologická poznámka''': Označenie master/slave môže byť nahradené označním controller/peripheral.&lt;br /&gt;
&lt;br /&gt;
I2C umožňuje prepojenie až 128 rôznych zariadení s pomocou iba dvoch obojsmerných vodičov. Jeden tvoria hodinový signál SCL (Synchronous Clock) a druhý dátový kanál SDA (Synchronous Data). Maximálna dĺžka vodičov je daná ich najvyššou povolenou kapacitou 400 pF, všeobecne sa uvádza cca 10cm. Každý vodič musí byť pripojený jedným pull-up rezistorom ku kladnému napätiu, čo zaistí vysokú úroveň v pokojovom stave. Pri prebiehajúcom prenose sú na SDA vysielané jednotlivé dátové bity pričom platí pravidlo, že logická úroveň na SDA sa môže nastaviť len ak je SCL v úrovni L. Toto pravidlo je porušené v dvoch špeciálnych prípadoch, a to pri vysielaní podmienok START a STOP, ktoré sa používajú na začatie komunikácie a k ukončeniu prenosu.&lt;br /&gt;
Maximálna frekvencia signálu SCL je podľa verzie I2C 100 kHz alebo 400 kHz. Pre obe frekvencie je daná minimálna povolená doba zotrvania SCL v úrovni L a H. Pri komunikácii aj pri prenose dát si jednotlivé stanice synchronizujú generátory hodín tak, že trvanie úrovne H na SCL je odmeriavané vnútorným časovačom každej stanice až od okamihu, keď SCL skutočne úrovne H dosiahne (pretože je SCL typu otvorený kolektor, môže byť v úrovni L držaný aj v situácii kedy sa daná stanica snaží nastaviť úroveň H). Podobne je doba trvania úrovne L na SCL odmeriavaná od zostupnej hrany. Tento mechanizmus umožňuje pre niektoré zo staníc spomaliť prenos: pomalá stanica môže podržať po určitú dobu signál SCL v úrovni L a tým zabrániť vysielajúcej stanici vo vyslaní ďalšieho bitu. Zbernica I2C neumožňuje duplexný prenos, v jednom okamihu vysiela len jedno zariadenie. Všetky zariadenia pripojené na zbernicu musia mať individuálnu adresu a implementovaný mechanizmus komunikácie pomocou I²C zbernice &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Princíp obojsmernej komunikácie&amp;lt;ref&amp;gt;Texas Instruments, Understanding the I2C Bus, Application Report SLVA704 - June 2015. https://www.ti.com/lit/slva704&amp;lt;/ref&amp;gt;==&lt;br /&gt;
Otvorený kolektor označuje typ výstupu, ktorý môže stiahnuť napäťovú úroveň zbernica na nízku úroveň - teda log.0 (vo väčšine prípadov na zem), alebo &amp;quot;uvoľniť&amp;quot; zbernicu a nechať napätie aby pomocou pull-up rezistora stúplo na úroveň logicej.1. V prípade, že je zbernica uvoľnená uzlom master alebo slave, pripojený pull-up rezistor je zodpovedný za vytiahnutie zbernice na úroveň napájacieho napätia. Keďže žiadne zariadenie nesmie vynucovať vysokú úroveň napätie na linke (teda úroveň pre log.1), znamená to že na zbernici nikdy nedôjde ku komunikačnému problému, keď sa jedno zariadenie pokúsi pripojiť napätie pre úroveň log.1 a iné zariadenie stiahne zbernicu na úroveň log.0, čo by spôsobilo skrat (napájacie napätie na zem). I2C vyžaduje, aby v prípade že master v zapojení s viacerými mastermi vysiela a vidí, že linka je v úrovni log.0 (iné zariadenie ju ťahá nadol - teda iné zariadenie komunikuje), zastaví komunikáciu, pretože zbernicu používa iné zariadenie. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_bidirCom.png|300px|Obr. 1x. Základná štruktúra linky SDA/SCL]]&lt;br /&gt;
&lt;br /&gt;
Obr. 1x. Základná štruktúra linky SDA/SCL&lt;br /&gt;
&lt;br /&gt;
Obr. 1x zobrazuje zjednodušenú schému vnútornej štruktúry master alebo slave zariadenia pre komunikačné linky SDA/SCL. Táto schéma obsahuje vyrovnávaciu pamät (buffer) na čítanie vstupných údajov a znižujúci (pull-down) tranzistor FET na prenos údajov. Zariadenie je schopné meniť napäťovú úroveň iba na log.0 (vytvoriť skrat na zem) alebo uvoľniť linku zbernice (vysoká impedancia voči zemi) a umožniť, aby pull-up rezistor zvýšil napätie. Toto je dôležitý koncept, ktorý si treba uvedomiť pri práci s I2C zariadeniami, pretože žiadne zariadenie nesmie zvyšovať úroveň napätia pre log.1. Táto vlastnosť umožňuje obojsmernú komunikáciu medzi uzlami master a slave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Protokol prenášaných údajov&amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Údaje v rozhraní I2C sa prenášajú v tzv. správach. Každá správa je rozdelená do  jednotlivých rámcov, a to: adresný rámec, ktorý identifikuje binárnu adresu Slave zariadenia a následne jeden alebo viacero dátových rámcov, ktoré obsahujú prenášaný obsah. Správy obsahujú aj bity pre čítanie/zápis, bity ACK/NACK a podmienky START a STOP (Obr. 2). &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_Basic_Address_and_Data_Frames.jpg|1024px|Obr. 2. Štruktúra správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 2. Štruktúra správy cez I2C rozhranie&amp;lt;ref name=&amp;quot;sparkfun&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''START''' - podmienka štart signalizuje začiatok komunikácie. Linka SDA sa prepne z vysokej (log. 1) na nízku hodnotu (log. 0) ''skôr'', ako sa linka SCL prepne z vysokej na nízku hodnotu.&lt;br /&gt;
* '''ADDRESS''' - adresa Slave zariadenia, s ktorým chce Master komunikovať. Adresa predstavuje 7 alebo 10 bitové celé číslo v binárnom tvare, ktoré predstavuje jedinečný identifikátor každého Slave zariadenia. Dve zariadenia by nemali mať tú istú adresu v jednej I2C zbernici.&lt;br /&gt;
* '''RW''' - jeden bit, ktorý určuje či sa vykonáva operácia zápisu alebo čítania:&lt;br /&gt;
** Ak RW = 0, zápis údajov na Slave zariadenie.&lt;br /&gt;
** Ak RW = 1, čítanie údajov zo Slave zariadenia.&lt;br /&gt;
* '''ACK/NACK''' nasleduje za každým rámcom v správe. Je to bit potvrdenia/nepotvrdenia:&lt;br /&gt;
** Ak bol úspešne prijatý adresný alebo dátový rámec, prijímajúce zariadenie vráti odosielateľovi log. 0 (ACK - Acknowledged).  &lt;br /&gt;
** Ak nastala chyba v prenose, prijímajúce zariadenie vráti odosielateľovi log. 1 (NACK - Not Acknowledged).&lt;br /&gt;
* Existuje niekoľko situácií, ktoré vedú k vytvoreniu NACK:&lt;br /&gt;
** Prijímač vykonáva nejakú funkciu v reálnom čase a nie je pripravený začať komunikáciu s Masterom.&lt;br /&gt;
** Prijímač odbrží neznáme údaje alebo príkazy.&lt;br /&gt;
** Počas prenosu prijímač nemôže prijímať ďalšie dátové bajty.&lt;br /&gt;
** Master ukončí čítanie údajov a oznámi to Slave zariadeniu pomocou NACK. &lt;br /&gt;
&lt;br /&gt;
* '''DATA''' - Dátový rámec je vždy dlhý 8 bitov a posiela sa s najvýznamnejším bitom (MSB) ako prvým. Za každým dátovým rámcom bezprostredne nasleduje bit ACK/NACK na overenie, či bol rámec úspešne prijatý. Pred odoslaním ďalšieho dátového rámca musí bit ACK prijať buď master, alebo slave (v závislosti od toho, kto dáta odosiela).&lt;br /&gt;
* '''STOP''' - ukončovacia podmienka štart signalizuje koniec komunikácie. Linka SDA sa prepne z nízkej (log. 0) na vysokú hodnotu (log. 1) ''potom'', čo sa linka SCL prepne z nízkej úrovne na vysokú &amp;lt;ref&amp;gt;Scott Campbell. BASICS OF THE I2C COMMUNICATION PROTOCOL. https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Sal Afzal. I2C Primer: What is I2C? (Part 1). https://www.analog.com/en/technical-articles/i2c-primer-what-is-i2c-part-1.html.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní&lt;br /&gt;
&lt;br /&gt;
===Dátový prenos na zbernici I2C&amp;lt;ref&amp;gt;https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/&amp;lt;/ref&amp;gt;===&lt;br /&gt;
# Master vyšle štart podmienku každému pripojenému slave prepnutím linky SDA z úrovne vysokého napätia na úroveň nízkeho napätia pred prepnutím linky SCL z vysokej na nízku.&lt;br /&gt;
# Master posiela každému uzlu slave 7 alebo 10-bitovú adresu s ktorým chce komunikovať, spolu s bitom pre čítanie/zápis&lt;br /&gt;
# Každý slave porovnáva adresu odoslanú od mastera so svojou vlastnou adresou. Ak sa adresa zhoduje, podriadená jednotka vráti bit ACK tým, že potiahne linku SDA na jeden bit. Ak sa adresa od nadradeného zariadenia nezhoduje s vlastnou adresou podriadeného zariadenia, podriadené zariadenie ponechá linku SDA na úrovni log.1.&lt;br /&gt;
# Master odošle alebo prijme dátový rámec&lt;br /&gt;
# Po prenose každého dátového rámca prijímacie zariadenie vráti odosielateľovi ďalší bit ACK, aby potvrdilo úspešné prijatie rámca&lt;br /&gt;
# Ak chcete zastaviť prenos dát, master pošle podriadenému zariadeniu stop podmienku prepnutím SCL na vysokú hodnotu pred prepnutím SDA na vysokú hodnotu.&lt;br /&gt;
&lt;br /&gt;
Na Obr.3 je vyobrazený časový diagram zápisu a čítania údajov s veľkosťou 2B prostredníctvom rozhrania I2C. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_3_casovyDiagram.png|600px|Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Základné vlastnosti a parametre zbernice I2C===&lt;br /&gt;
&lt;br /&gt;
Základná pracovná frekvencia linky je 100kHz. Špecifikácia I2C dovoľuje zvýšiť túto frekvenciu až na 3.4 MHz. Zvýšenie frekvencie na strane mikrokontroléra je záležitosť konfigurácie. Je potrebné zvoliť takú frekvenciu, ktorú podporuje pripojený senzor alebo zariadenie, s ktorým chceme komunikovať.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Časovanie !! SCL&lt;br /&gt;
|-&lt;br /&gt;
| Standard Mode || 100 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Fast Mode || 400 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Fast Mode Plus || 1 MHz&lt;br /&gt;
|-&lt;br /&gt;
| High Speed Mode || 3.4 MHz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje a odkazy ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah_vpravo&amp;diff=13271</id>
		<title>Šablóna:MCU ARM Obsah vpravo</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah_vpravo&amp;diff=13271"/>
		<updated>2023-03-25T14:19:22Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Vytvorená stránka „&amp;lt;div class=&amp;quot;sideBox&amp;quot; style=&amp;quot;width:250px;background-color:rgb(240,255,190);padding-left:5px;border:2px solid rgb(155,155,100)&amp;quot;&amp;gt; Mikrokontroléry ARM ---- {{MCU_ARM_Ob…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;sideBox&amp;quot; style=&amp;quot;width:250px;background-color:rgb(240,255,190);padding-left:5px;border:2px solid rgb(155,155,100)&amp;quot;&amp;gt;&lt;br /&gt;
[[Mikrokontroléry ARM]]&lt;br /&gt;
----&lt;br /&gt;
{{MCU_ARM_Obsah}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Kategória:Pri tlačení vynechať]]&lt;br /&gt;
[[Kategória:MCU ARM]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13270</id>
		<title>Šablóna:MCU ARM Obsah</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13270"/>
		<updated>2023-03-25T14:19:16Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{vyuka_tema|Architektúra ARM mikrokotnrolérov|Základné nastavenie STM32 core}}&lt;br /&gt;
{{vyuka_tema|ARM - vstupno/výstupné piny|nieco o pinoch}}&lt;br /&gt;
{{vyuka_tema|Komunikačné rozhranie UART|UART - základné použitie pre STM32}}&lt;br /&gt;
{{vyuka_tema|Komunikačné rozhranie I2C|I2C - základné použitie pre STM32|I2C - komunikácia s teplomerom LM75}}&lt;br /&gt;
{{vyuka_tema|Komunikačné rozhranie SPI|SPI - základné použitie pre STM32}}&lt;br /&gt;
&lt;br /&gt;
[[Kategória:Pri tlačení vynechať]]&lt;br /&gt;
[[Kategória:MCU ARM]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13269</id>
		<title>Šablóna:MCU ARM Obsah</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13269"/>
		<updated>2023-03-25T14:14:31Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;sideBox&amp;quot; style=&amp;quot;width:250px;background-color:rgb(240,255,190);padding-left:5px;border:2px solid rgb(155,155,100)&amp;quot;&amp;gt;&lt;br /&gt;
[[Mikrokontroléry ARM]]&lt;br /&gt;
----&lt;br /&gt;
{{vyuka_tema|Architektúra ARM mikrokotnrolérov|Základné nastavenie STM32 core}}&lt;br /&gt;
{{vyuka_tema|ARM - vstupno/výstupné piny|nieco o pinoch}}&lt;br /&gt;
{{vyuka_tema|Komunikačné rozhranie UART|UART - základné použitie pre STM32}}&lt;br /&gt;
{{vyuka_tema|Komunikačné rozhranie I2C|I2C - základné použitie pre STM32|I2C - komunikácia s teplomerom LM75}}&lt;br /&gt;
{{vyuka_tema|Komunikačné rozhranie SPI|SPI - základné použitie pre STM32}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Kategória:Pri tlačení vynechať]]&lt;br /&gt;
[[Kategória:MCU ARM]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13267</id>
		<title>Komunikačné rozhranie I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13267"/>
		<updated>2023-03-25T14:11:36Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Juraj premiestnil stránku MCU ARM/I2C na Komunikačné rozhranie I2C&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Inter-Integrated Circuit alebo I²C je dvojvodičová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná predovšetkým na prepojenie periférnych zariadení s mikrokontrolérom. Na zbernicu sú pripojené zariadenia rozdelené na riadiace (Master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (Slave - zariadenie adresované Masterom) &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;Gabriel Gašpar a Juraj Ďuďák. Využitie mikrokontrolérov v automatizovanom riadení. Spektrum, 2023. ISBN: 978-80-227-5283-1.&amp;lt;/ref&amp;gt; na Obr. 1 &amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;Matúš Nečas: Multi-displej systém pre embedded aplikácie, Bakalárska práca, MTF STUBA, 2023&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Súbor:Mcu_i2c_1_pripojenie.png|600px|Obr. 1a. Pripojenie zaradení na zbernicu]]&lt;br /&gt;
| [[Súbor:Mcu_i2c_1_schematic.jpg|600px|Obr. 1b. Interné zapojenie]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Obr. 1 A)Pripojenie zaradení na zbernicu, B) Interná schéma zapojenia rozhrania I2C&amp;lt;ref name=&amp;quot;sparkfun&amp;quot;&amp;gt;https://learn.sparkfun.com/tutorials/i2c/all&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SDA (Serial Data) je dátový signál a SCL (Serial Clock) je hodinový signál. Hodinový signál je vždy generovaný aktuálnym radičom zbernice; niektoré periférne zariadenia môžu niekedy vynútiť nízku hodnotu hodinového signálu, aby radič oneskoril odoslanie ďalších údajov (alebo aby potreboval viac času na prípravu údajov pred pokusom radiča o ich taktovanie). Tento postup sa nazýva &amp;quot;natiahnutie hodín&amp;quot; (clock stretching).&lt;br /&gt;
&lt;br /&gt;
'''Terminologická poznámka''': Označenie master/slave môže byť nahradené označním controller/peripheral.&lt;br /&gt;
&lt;br /&gt;
I2C umožňuje prepojenie až 128 rôznych zariadení s pomocou iba dvoch obojsmerných vodičov. Jeden tvoria hodinový signál SCL (Synchronous Clock) a druhý dátový kanál SDA (Synchronous Data). Maximálna dĺžka vodičov je daná ich najvyššou povolenou kapacitou 400 pF, všeobecne sa uvádza cca 10cm. Každý vodič musí byť pripojený jedným pull-up rezistorom ku kladnému napätiu, čo zaistí vysokú úroveň v pokojovom stave. Pri prebiehajúcom prenose sú na SDA vysielané jednotlivé dátové bity pričom platí pravidlo, že logická úroveň na SDA sa môže nastaviť len ak je SCL v úrovni L. Toto pravidlo je porušené v dvoch špeciálnych prípadoch, a to pri vysielaní podmienok START a STOP, ktoré sa používajú na začatie komunikácie a k ukončeniu prenosu.&lt;br /&gt;
Maximálna frekvencia signálu SCL je podľa verzie I2C 100 kHz alebo 400 kHz. Pre obe frekvencie je daná minimálna povolená doba zotrvania SCL v úrovni L a H. Pri komunikácii aj pri prenose dát si jednotlivé stanice synchronizujú generátory hodín tak, že trvanie úrovne H na SCL je odmeriavané vnútorným časovačom každej stanice až od okamihu, keď SCL skutočne úrovne H dosiahne (pretože je SCL typu otvorený kolektor, môže byť v úrovni L držaný aj v situácii kedy sa daná stanica snaží nastaviť úroveň H). Podobne je doba trvania úrovne L na SCL odmeriavaná od zostupnej hrany. Tento mechanizmus umožňuje pre niektoré zo staníc spomaliť prenos: pomalá stanica môže podržať po určitú dobu signál SCL v úrovni L a tým zabrániť vysielajúcej stanici vo vyslaní ďalšieho bitu. Zbernica I2C neumožňuje duplexný prenos, v jednom okamihu vysiela len jedno zariadenie. Všetky zariadenia pripojené na zbernicu musia mať individuálnu adresu a implementovaný mechanizmus komunikácie pomocou I²C zbernice &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Princíp obojsmernej komunikácie&amp;lt;ref&amp;gt;Texas Instruments, Understanding the I2C Bus, Application Report SLVA704 - June 2015. https://www.ti.com/lit/slva704&amp;lt;/ref&amp;gt;==&lt;br /&gt;
Otvorený kolektor označuje typ výstupu, ktorý môže stiahnuť napäťovú úroveň zbernica na nízku úroveň - teda log.0 (vo väčšine prípadov na zem), alebo &amp;quot;uvoľniť&amp;quot; zbernicu a nechať napätie aby pomocou pull-up rezistora stúplo na úroveň logicej.1. V prípade, že je zbernica uvoľnená uzlom master alebo slave, pripojený pull-up rezistor je zodpovedný za vytiahnutie zbernice na úroveň napájacieho napätia. Keďže žiadne zariadenie nesmie vynucovať vysokú úroveň napätie na linke (teda úroveň pre log.1), znamená to že na zbernici nikdy nedôjde ku komunikačnému problému, keď sa jedno zariadenie pokúsi pripojiť napätie pre úroveň log.1 a iné zariadenie stiahne zbernicu na úroveň log.0, čo by spôsobilo skrat (napájacie napätie na zem). I2C vyžaduje, aby v prípade že master v zapojení s viacerými mastermi vysiela a vidí, že linka je v úrovni log.0 (iné zariadenie ju ťahá nadol - teda iné zariadenie komunikuje), zastaví komunikáciu, pretože zbernicu používa iné zariadenie. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_bidirCom.png|300px|Obr. 1x. Základná štruktúra linky SDA/SCL]]&lt;br /&gt;
&lt;br /&gt;
Obr. 1x. Základná štruktúra linky SDA/SCL&lt;br /&gt;
&lt;br /&gt;
Obr. 1x zobrazuje zjednodušenú schému vnútornej štruktúry master alebo slave zariadenia pre komunikačné linky SDA/SCL. Táto schéma obsahuje vyrovnávaciu pamät (buffer) na čítanie vstupných údajov a znižujúci (pull-down) tranzistor FET na prenos údajov. Zariadenie je schopné meniť napäťovú úroveň iba na log.0 (vytvoriť skrat na zem) alebo uvoľniť linku zbernice (vysoká impedancia voči zemi) a umožniť, aby pull-up rezistor zvýšil napätie. Toto je dôležitý koncept, ktorý si treba uvedomiť pri práci s I2C zariadeniami, pretože žiadne zariadenie nesmie zvyšovať úroveň napätia pre log.1. Táto vlastnosť umožňuje obojsmernú komunikáciu medzi uzlami master a slave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Protokol prenášaných údajov&amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Údaje v rozhraní I2C sa prenášajú v tzv. správach. Každá správa je rozdelená do  jednotlivých rámcov, a to: adresný rámec, ktorý identifikuje binárnu adresu Slave zariadenia a následne jeden alebo viacero dátových rámcov, ktoré obsahujú prenášaný obsah. Správy obsahujú aj bity pre čítanie/zápis, bity ACK/NACK a podmienky START a STOP (Obr. 2). &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_Basic_Address_and_Data_Frames.jpg|1024px|Obr. 2. Štruktúra správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 2. Štruktúra správy cez I2C rozhranie&amp;lt;ref name=&amp;quot;sparkfun&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''START''' - podmienka štart signalizuje začiatok komunikácie. Linka SDA sa prepne z vysokej (log. 1) na nízku hodnotu (log. 0) ''skôr'', ako sa linka SCL prepne z vysokej na nízku hodnotu.&lt;br /&gt;
* '''ADDRESS''' - adresa Slave zariadenia, s ktorým chce Master komunikovať. Adresa predstavuje 7 alebo 10 bitové celé číslo v binárnom tvare, ktoré predstavuje jedinečný identifikátor každého Slave zariadenia. Dve zariadenia by nemali mať tú istú adresu v jednej I2C zbernici.&lt;br /&gt;
* '''RW''' - jeden bit, ktorý určuje či sa vykonáva operácia zápisu alebo čítania:&lt;br /&gt;
** Ak RW = 0, zápis údajov na Slave zariadenie.&lt;br /&gt;
** Ak RW = 1, čítanie údajov zo Slave zariadenia.&lt;br /&gt;
* '''ACK/NACK''' nasleduje za každým rámcom v správe. Je to bit potvrdenia/nepotvrdenia:&lt;br /&gt;
** Ak bol úspešne prijatý adresný alebo dátový rámec, prijímajúce zariadenie vráti odosielateľovi log. 0 (ACK - Acknowledged).  &lt;br /&gt;
** Ak nastala chyba v prenose, prijímajúce zariadenie vráti odosielateľovi log. 1 (NACK - Not Acknowledged).&lt;br /&gt;
* Existuje niekoľko situácií, ktoré vedú k vytvoreniu NACK:&lt;br /&gt;
** Prijímač vykonáva nejakú funkciu v reálnom čase a nie je pripravený začať komunikáciu s Masterom.&lt;br /&gt;
** Prijímač odbrží neznáme údaje alebo príkazy.&lt;br /&gt;
** Počas prenosu prijímač nemôže prijímať ďalšie dátové bajty.&lt;br /&gt;
** Master ukončí čítanie údajov a oznámi to Slave zariadeniu pomocou NACK. &lt;br /&gt;
&lt;br /&gt;
* '''DATA''' - Dátový rámec je vždy dlhý 8 bitov a posiela sa s najvýznamnejším bitom (MSB) ako prvým. Za každým dátovým rámcom bezprostredne nasleduje bit ACK/NACK na overenie, či bol rámec úspešne prijatý. Pred odoslaním ďalšieho dátového rámca musí bit ACK prijať buď master, alebo slave (v závislosti od toho, kto dáta odosiela).&lt;br /&gt;
* '''STOP''' - ukončovacia podmienka štart signalizuje koniec komunikácie. Linka SDA sa prepne z nízkej (log. 0) na vysokú hodnotu (log. 1) ''potom'', čo sa linka SCL prepne z nízkej úrovne na vysokú &amp;lt;ref&amp;gt;Scott Campbell. BASICS OF THE I2C COMMUNICATION PROTOCOL. https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Sal Afzal. I2C Primer: What is I2C? (Part 1). https://www.analog.com/en/technical-articles/i2c-primer-what-is-i2c-part-1.html.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní&lt;br /&gt;
&lt;br /&gt;
===Dátový prenos na zbernici I2C&amp;lt;ref&amp;gt;https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/&amp;lt;/ref&amp;gt;===&lt;br /&gt;
# Master vyšle štart podmienku každému pripojenému slave prepnutím linky SDA z úrovne vysokého napätia na úroveň nízkeho napätia pred prepnutím linky SCL z vysokej na nízku.&lt;br /&gt;
# Master posiela každému uzlu slave 7 alebo 10-bitovú adresu s ktorým chce komunikovať, spolu s bitom pre čítanie/zápis&lt;br /&gt;
# Každý slave porovnáva adresu odoslanú od mastera so svojou vlastnou adresou. Ak sa adresa zhoduje, podriadená jednotka vráti bit ACK tým, že potiahne linku SDA na jeden bit. Ak sa adresa od nadradeného zariadenia nezhoduje s vlastnou adresou podriadeného zariadenia, podriadené zariadenie ponechá linku SDA na úrovni log.1.&lt;br /&gt;
# Master odošle alebo prijme dátový rámec&lt;br /&gt;
# Po prenose každého dátového rámca prijímacie zariadenie vráti odosielateľovi ďalší bit ACK, aby potvrdilo úspešné prijatie rámca&lt;br /&gt;
# Ak chcete zastaviť prenos dát, master pošle podriadenému zariadeniu stop podmienku prepnutím SCL na vysokú hodnotu pred prepnutím SDA na vysokú hodnotu.&lt;br /&gt;
&lt;br /&gt;
Na Obr.3 je vyobrazený časový diagram zápisu a čítania údajov s veľkosťou 2B prostredníctvom rozhrania I2C. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_3_casovyDiagram.png|600px|Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Základné vlastnosti a parametre zbernice I2C===&lt;br /&gt;
&lt;br /&gt;
Základná pracovná frekvencia linky je 100kHz. Špecifikácia I2C dovoľuje zvýšiť túto frekvenciu až na 3.4 MHz. Zvýšenie frekvencie na strane mikrokontroléra je záležitosť konfigurácie. Je potrebné zvoliť takú frekvenciu, ktorú podporuje pripojený senzor alebo zariadenie, s ktorým chceme komunikovať.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Časovanie !! SCL&lt;br /&gt;
|-&lt;br /&gt;
| Standard Mode || 100 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Fast Mode || 400 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Fast Mode Plus || 1 MHz&lt;br /&gt;
|-&lt;br /&gt;
| High Speed Mode || 3.4 MHz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje a odkazy ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=MCU_ARM/I2C&amp;diff=13268</id>
		<title>MCU ARM/I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=MCU_ARM/I2C&amp;diff=13268"/>
		<updated>2023-03-25T14:11:36Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Juraj premiestnil stránku MCU ARM/I2C na Komunikačné rozhranie I2C&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#presmeruj [[Komunikačné rozhranie I2C]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13266</id>
		<title>Šablóna:MCU ARM Obsah</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13266"/>
		<updated>2023-03-25T14:08:24Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;sideBox&amp;quot; style=&amp;quot;width:250px;background-color:rgb(240,255,190);padding-left:5px;border:2px solid rgb(155,155,100)&amp;quot;&amp;gt;&lt;br /&gt;
[[Mikrokontroléry ARM]]&lt;br /&gt;
----&lt;br /&gt;
{{vyuka_tema|Mikrokontroléry ARM|I2C - základné použitie pre STM32|I2C - komunikácia s teplomerom LM75}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Architektúra ARM mikrokotnrolérov&lt;br /&gt;
&lt;br /&gt;
Vstupno/výstupné piny&lt;br /&gt;
&lt;br /&gt;
Rozhranie UART&lt;br /&gt;
&lt;br /&gt;
[[MCU_ARM/I2C|Rozhranie I2C]]&lt;br /&gt;
&lt;br /&gt;
{{vyuka_tema|MCU_ARM/I2C|I2C - základné použitie pre STM32|I2C - komunikácia s teplomerom LM75}}&lt;br /&gt;
&lt;br /&gt;
Rozhranie SPI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Kategória:Pri tlačení vynechať]]&lt;br /&gt;
[[Kategória:MCU ARM]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13265</id>
		<title>Šablóna:MCU ARM Obsah</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13265"/>
		<updated>2023-03-25T13:53:27Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;sideBox&amp;quot; style=&amp;quot;width:250px;background-color:rgb(240,255,190);padding-left:5px;border:2px solid rgb(155,155,100)&amp;quot;&amp;gt;&lt;br /&gt;
[[Mikrokontroléry ARM]]&lt;br /&gt;
----&lt;br /&gt;
Architektúra ARM mikrokotnrolérov&lt;br /&gt;
&lt;br /&gt;
Vstupno/výstupné piny&lt;br /&gt;
&lt;br /&gt;
Rozhranie UART&lt;br /&gt;
&lt;br /&gt;
[[MCU_ARM/I2C|Rozhranie I2C]]&lt;br /&gt;
&lt;br /&gt;
{{vyuka_tema|MCU_ARM/I2C|I2C - základné použitie pre STM32|I2C - komunikácia s teplomerom LM75}}&lt;br /&gt;
&lt;br /&gt;
Rozhranie SPI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Kategória:Pri tlačení vynechať]]&lt;br /&gt;
[[Kategória:MCU ARM]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13264</id>
		<title>Šablóna:MCU ARM Obsah</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13264"/>
		<updated>2023-03-25T13:43:42Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:none repeat scroll 0 0 white;border:2px solid green; float:right;margin-left:1em; padding:0.3em; position:relative; width:300px; background-color:rgb(240,255,190); padding-left:5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Mikrokontroléry ARM]]&lt;br /&gt;
----&lt;br /&gt;
Architektúra ARM mikrokotnrolérov&lt;br /&gt;
&lt;br /&gt;
Vstupno/výstupné piny&lt;br /&gt;
&lt;br /&gt;
Rozhranie UART&lt;br /&gt;
&lt;br /&gt;
[[MCU_ARM/I2C|Rozhranie I2C]]&lt;br /&gt;
&lt;br /&gt;
{{vyuka_tema|MCU_ARM/I2C|Práca v NetBeans|Práca v SciTe}}&lt;br /&gt;
&lt;br /&gt;
{{vyuka_tema|Rozhranie I2C|Práca v NetBeans|Práca v SciTe}}&lt;br /&gt;
&lt;br /&gt;
{{vyuka_tema|MCU_ARM/I2C|I2C - základné použitie pre STM32|I2C - komunikácia s teplomerom LM75}}&lt;br /&gt;
&lt;br /&gt;
Rozhranie SPI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Kategória:Pri tlačení vynechať]]&lt;br /&gt;
[[Kategória:MCU ARM]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13263</id>
		<title>Šablóna:MCU ARM Obsah</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13263"/>
		<updated>2023-03-25T13:40:22Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:none repeat scroll 0 0 white;border:2px solid green; float:right;margin-left:1em; padding:0.3em; position:relative; width:300px; background-color:rgb(240,255,190); padding-left:5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Mikrokontroléry ARM]]&lt;br /&gt;
----&lt;br /&gt;
Architektúra ARM mikrokotnrolérov&lt;br /&gt;
&lt;br /&gt;
Vstupno/výstupné piny&lt;br /&gt;
&lt;br /&gt;
Rozhranie UART&lt;br /&gt;
&lt;br /&gt;
[[MCU_ARM/I2C|Rozhranie I2C]]&lt;br /&gt;
&lt;br /&gt;
{{vyuka_tema|MCU_ARM/I2C|I2C - základné použitie pre STM32|I2C - komunikácia s teplomerom LM75}}&lt;br /&gt;
&lt;br /&gt;
Rozhranie SPI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Kategória:Pri tlačení vynechať]]&lt;br /&gt;
[[Kategória:MCU ARM]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13262</id>
		<title>Komunikačné rozhranie I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13262"/>
		<updated>2023-03-25T13:15:17Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Inter-Integrated Circuit alebo I²C je dvojvodičová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná predovšetkým na prepojenie periférnych zariadení s mikrokontrolérom. Na zbernicu sú pripojené zariadenia rozdelené na riadiace (Master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (Slave - zariadenie adresované Masterom) &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;Gabriel Gašpar a Juraj Ďuďák. Využitie mikrokontrolérov v automatizovanom riadení. Spektrum, 2023. ISBN: 978-80-227-5283-1.&amp;lt;/ref&amp;gt; na Obr. 1 &amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;Matúš Nečas: Multi-displej systém pre embedded aplikácie, Bakalárska práca, MTF STUBA, 2023&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Súbor:Mcu_i2c_1_pripojenie.png|600px|Obr. 1a. Pripojenie zaradení na zbernicu]]&lt;br /&gt;
| [[Súbor:Mcu_i2c_1_schematic.jpg|600px|Obr. 1b. Interné zapojenie]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Obr. 1 A)Pripojenie zaradení na zbernicu, B) Interná schéma zapojenia rozhrania I2C&amp;lt;ref name=&amp;quot;sparkfun&amp;quot;&amp;gt;https://learn.sparkfun.com/tutorials/i2c/all&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SDA (Serial Data) je dátový signál a SCL (Serial Clock) je hodinový signál. Hodinový signál je vždy generovaný aktuálnym radičom zbernice; niektoré periférne zariadenia môžu niekedy vynútiť nízku hodnotu hodinového signálu, aby radič oneskoril odoslanie ďalších údajov (alebo aby potreboval viac času na prípravu údajov pred pokusom radiča o ich taktovanie). Tento postup sa nazýva &amp;quot;natiahnutie hodín&amp;quot; (clock stretching).&lt;br /&gt;
&lt;br /&gt;
'''Terminologická poznámka''': Označenie master/slave môže byť nahradené označním controller/peripheral.&lt;br /&gt;
&lt;br /&gt;
I2C umožňuje prepojenie až 128 rôznych zariadení s pomocou iba dvoch obojsmerných vodičov. Jeden tvoria hodinový signál SCL (Synchronous Clock) a druhý dátový kanál SDA (Synchronous Data). Maximálna dĺžka vodičov je daná ich najvyššou povolenou kapacitou 400 pF, všeobecne sa uvádza cca 10cm. Každý vodič musí byť pripojený jedným pull-up rezistorom ku kladnému napätiu, čo zaistí vysokú úroveň v pokojovom stave. Pri prebiehajúcom prenose sú na SDA vysielané jednotlivé dátové bity pričom platí pravidlo, že logická úroveň na SDA sa môže nastaviť len ak je SCL v úrovni L. Toto pravidlo je porušené v dvoch špeciálnych prípadoch, a to pri vysielaní podmienok START a STOP, ktoré sa používajú na začatie komunikácie a k ukončeniu prenosu.&lt;br /&gt;
Maximálna frekvencia signálu SCL je podľa verzie I2C 100 kHz alebo 400 kHz. Pre obe frekvencie je daná minimálna povolená doba zotrvania SCL v úrovni L a H. Pri komunikácii aj pri prenose dát si jednotlivé stanice synchronizujú generátory hodín tak, že trvanie úrovne H na SCL je odmeriavané vnútorným časovačom každej stanice až od okamihu, keď SCL skutočne úrovne H dosiahne (pretože je SCL typu otvorený kolektor, môže byť v úrovni L držaný aj v situácii kedy sa daná stanica snaží nastaviť úroveň H). Podobne je doba trvania úrovne L na SCL odmeriavaná od zostupnej hrany. Tento mechanizmus umožňuje pre niektoré zo staníc spomaliť prenos: pomalá stanica môže podržať po určitú dobu signál SCL v úrovni L a tým zabrániť vysielajúcej stanici vo vyslaní ďalšieho bitu. Zbernica I2C neumožňuje duplexný prenos, v jednom okamihu vysiela len jedno zariadenie. Všetky zariadenia pripojené na zbernicu musia mať individuálnu adresu a implementovaný mechanizmus komunikácie pomocou I²C zbernice &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Princíp obojsmernej komunikácie&amp;lt;ref&amp;gt;Texas Instruments, Understanding the I2C Bus, Application Report SLVA704 - June 2015. https://www.ti.com/lit/slva704&amp;lt;/ref&amp;gt;==&lt;br /&gt;
Otvorený kolektor označuje typ výstupu, ktorý môže stiahnuť napäťovú úroveň zbernica na nízku úroveň - teda log.0 (vo väčšine prípadov na zem), alebo &amp;quot;uvoľniť&amp;quot; zbernicu a nechať napätie aby pomocou pull-up rezistora stúplo na úroveň logicej.1. V prípade, že je zbernica uvoľnená uzlom master alebo slave, pripojený pull-up rezistor je zodpovedný za vytiahnutie zbernice na úroveň napájacieho napätia. Keďže žiadne zariadenie nesmie vynucovať vysokú úroveň napätie na linke (teda úroveň pre log.1), znamená to že na zbernici nikdy nedôjde ku komunikačnému problému, keď sa jedno zariadenie pokúsi pripojiť napätie pre úroveň log.1 a iné zariadenie stiahne zbernicu na úroveň log.0, čo by spôsobilo skrat (napájacie napätie na zem). I2C vyžaduje, aby v prípade že master v zapojení s viacerými mastermi vysiela a vidí, že linka je v úrovni log.0 (iné zariadenie ju ťahá nadol - teda iné zariadenie komunikuje), zastaví komunikáciu, pretože zbernicu používa iné zariadenie. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_bidirCom.png|300px|Obr. 1x. Základná štruktúra linky SDA/SCL]]&lt;br /&gt;
&lt;br /&gt;
Obr. 1x. Základná štruktúra linky SDA/SCL&lt;br /&gt;
&lt;br /&gt;
Obr. 1x zobrazuje zjednodušenú schému vnútornej štruktúry master alebo slave zariadenia pre komunikačné linky SDA/SCL. Táto schéma obsahuje vyrovnávaciu pamät (buffer) na čítanie vstupných údajov a znižujúci (pull-down) tranzistor FET na prenos údajov. Zariadenie je schopné meniť napäťovú úroveň iba na log.0 (vytvoriť skrat na zem) alebo uvoľniť linku zbernice (vysoká impedancia voči zemi) a umožniť, aby pull-up rezistor zvýšil napätie. Toto je dôležitý koncept, ktorý si treba uvedomiť pri práci s I2C zariadeniami, pretože žiadne zariadenie nesmie zvyšovať úroveň napätia pre log.1. Táto vlastnosť umožňuje obojsmernú komunikáciu medzi uzlami master a slave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Protokol prenášaných údajov&amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Údaje v rozhraní I2C sa prenášajú v tzv. správach. Každá správa je rozdelená do  jednotlivých rámcov, a to: adresný rámec, ktorý identifikuje binárnu adresu Slave zariadenia a následne jeden alebo viacero dátových rámcov, ktoré obsahujú prenášaný obsah. Správy obsahujú aj bity pre čítanie/zápis, bity ACK/NACK a podmienky START a STOP (Obr. 2). &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_Basic_Address_and_Data_Frames.jpg|1024px|Obr. 2. Štruktúra správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 2. Štruktúra správy cez I2C rozhranie&amp;lt;ref name=&amp;quot;sparkfun&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''START''' - podmienka štart signalizuje začiatok komunikácie. Linka SDA sa prepne z vysokej (log. 1) na nízku hodnotu (log. 0) ''skôr'', ako sa linka SCL prepne z vysokej na nízku hodnotu.&lt;br /&gt;
* '''ADDRESS''' - adresa Slave zariadenia, s ktorým chce Master komunikovať. Adresa predstavuje 7 alebo 10 bitové celé číslo v binárnom tvare, ktoré predstavuje jedinečný identifikátor každého Slave zariadenia. Dve zariadenia by nemali mať tú istú adresu v jednej I2C zbernici.&lt;br /&gt;
* '''RW''' - jeden bit, ktorý určuje či sa vykonáva operácia zápisu alebo čítania:&lt;br /&gt;
** Ak RW = 0, zápis údajov na Slave zariadenie.&lt;br /&gt;
** Ak RW = 1, čítanie údajov zo Slave zariadenia.&lt;br /&gt;
* '''ACK/NACK''' nasleduje za každým rámcom v správe. Je to bit potvrdenia/nepotvrdenia:&lt;br /&gt;
** Ak bol úspešne prijatý adresný alebo dátový rámec, prijímajúce zariadenie vráti odosielateľovi log. 0 (ACK - Acknowledged).  &lt;br /&gt;
** Ak nastala chyba v prenose, prijímajúce zariadenie vráti odosielateľovi log. 1 (NACK - Not Acknowledged).&lt;br /&gt;
* Existuje niekoľko situácií, ktoré vedú k vytvoreniu NACK:&lt;br /&gt;
** Prijímač vykonáva nejakú funkciu v reálnom čase a nie je pripravený začať komunikáciu s Masterom.&lt;br /&gt;
** Prijímač odbrží neznáme údaje alebo príkazy.&lt;br /&gt;
** Počas prenosu prijímač nemôže prijímať ďalšie dátové bajty.&lt;br /&gt;
** Master ukončí čítanie údajov a oznámi to Slave zariadeniu pomocou NACK. &lt;br /&gt;
&lt;br /&gt;
* '''DATA''' - Dátový rámec je vždy dlhý 8 bitov a posiela sa s najvýznamnejším bitom (MSB) ako prvým. Za každým dátovým rámcom bezprostredne nasleduje bit ACK/NACK na overenie, či bol rámec úspešne prijatý. Pred odoslaním ďalšieho dátového rámca musí bit ACK prijať buď master, alebo slave (v závislosti od toho, kto dáta odosiela).&lt;br /&gt;
* '''STOP''' - ukončovacia podmienka štart signalizuje koniec komunikácie. Linka SDA sa prepne z nízkej (log. 0) na vysokú hodnotu (log. 1) ''potom'', čo sa linka SCL prepne z nízkej úrovne na vysokú &amp;lt;ref&amp;gt;Scott Campbell. BASICS OF THE I2C COMMUNICATION PROTOCOL. https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Sal Afzal. I2C Primer: What is I2C? (Part 1). https://www.analog.com/en/technical-articles/i2c-primer-what-is-i2c-part-1.html.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní&lt;br /&gt;
&lt;br /&gt;
===Dátový prenos na zbernici I2C&amp;lt;ref&amp;gt;https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/&amp;lt;/ref&amp;gt;===&lt;br /&gt;
# Master vyšle štart podmienku každému pripojenému slave prepnutím linky SDA z úrovne vysokého napätia na úroveň nízkeho napätia pred prepnutím linky SCL z vysokej na nízku.&lt;br /&gt;
# Master posiela každému uzlu slave 7 alebo 10-bitovú adresu s ktorým chce komunikovať, spolu s bitom pre čítanie/zápis&lt;br /&gt;
# Každý slave porovnáva adresu odoslanú od mastera so svojou vlastnou adresou. Ak sa adresa zhoduje, podriadená jednotka vráti bit ACK tým, že potiahne linku SDA na jeden bit. Ak sa adresa od nadradeného zariadenia nezhoduje s vlastnou adresou podriadeného zariadenia, podriadené zariadenie ponechá linku SDA na úrovni log.1.&lt;br /&gt;
# Master odošle alebo prijme dátový rámec&lt;br /&gt;
# Po prenose každého dátového rámca prijímacie zariadenie vráti odosielateľovi ďalší bit ACK, aby potvrdilo úspešné prijatie rámca&lt;br /&gt;
# Ak chcete zastaviť prenos dát, master pošle podriadenému zariadeniu stop podmienku prepnutím SCL na vysokú hodnotu pred prepnutím SDA na vysokú hodnotu.&lt;br /&gt;
&lt;br /&gt;
Na Obr.3 je vyobrazený časový diagram zápisu a čítania údajov s veľkosťou 2B prostredníctvom rozhrania I2C. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_3_casovyDiagram.png|600px|Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Základné vlastnosti a parametre zbernice I2C===&lt;br /&gt;
&lt;br /&gt;
Základná pracovná frekvencia linky je 100kHz. Špecifikácia I2C dovoľuje zvýšiť túto frekvenciu až na 3.4 MHz. Zvýšenie frekvencie na strane mikrokontroléra je záležitosť konfigurácie. Je potrebné zvoliť takú frekvenciu, ktorú podporuje pripojený senzor alebo zariadenie, s ktorým chceme komunikovať.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Časovanie !! SCL&lt;br /&gt;
|-&lt;br /&gt;
| Standard Mode || 100 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Fast Mode || 400 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Fast Mode Plus || 1 MHz&lt;br /&gt;
|-&lt;br /&gt;
| High Speed Mode || 3.4 MHz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje a odkazy ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13261</id>
		<title>Šablóna:MCU ARM Obsah</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13261"/>
		<updated>2023-03-25T13:13:37Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:none repeat scroll 0 0 white;border:2px solid green; float:right;margin-left:1em; padding:0.3em; position:relative; width:300px; background-color:rgb(240,255,190); padding-left:5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Mikrokontroléry ARM]]&lt;br /&gt;
----&lt;br /&gt;
Architektúra ARM mikrokotnrolérov&lt;br /&gt;
&lt;br /&gt;
Vstupno/výstupné piny&lt;br /&gt;
&lt;br /&gt;
Rozhranie UART&lt;br /&gt;
&lt;br /&gt;
[[MCU_ARM/I2C|Rozhranie I2C]]&lt;br /&gt;
&lt;br /&gt;
Rozhranie SPI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Kategória:Pri tlačení vynechať]]&lt;br /&gt;
[[Kategória:MCU ARM]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:MCU_I2C_Basic_Address_and_Data_Frames.jpg&amp;diff=13260</id>
		<title>Súbor:MCU I2C Basic Address and Data Frames.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:MCU_I2C_Basic_Address_and_Data_Frames.jpg&amp;diff=13260"/>
		<updated>2023-03-25T13:03:56Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Mcu_i2c_1_schematic.jpg&amp;diff=13259</id>
		<title>Súbor:Mcu i2c 1 schematic.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Mcu_i2c_1_schematic.jpg&amp;diff=13259"/>
		<updated>2023-03-25T12:59:53Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13258</id>
		<title>Komunikačné rozhranie I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13258"/>
		<updated>2023-03-24T22:44:20Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah}}&lt;br /&gt;
&lt;br /&gt;
Inter-Integrated Circuit alebo I²C je dvojžilová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná predovšetkým na prepojenie periférnych zariadení s mikrokontrolérom. Na zbernicu sú pripojené zariadenia rozdelené na riadiace (Master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (Slave - zariadenie adresované Masterom) &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;Gabriel Gašpar a Juraj Ďuďák. Využitie mikrokontrolérov v automatizovanom riadení. Spektrum, 2023. ISBN: 978-80-227-5283-1.&amp;lt;/ref&amp;gt; na Obr. 1 &amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;Matúš Nečas: Multi-displej systém pre embedded aplikácie, Bakalárska práca, MTF STUBA, 2023&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_1_pripojenie.png|600px|Obr. 1. Pripojenie zaradení na zbernicu]]&lt;br /&gt;
&lt;br /&gt;
Obr. 1. Pripojenie zaradení na zbernicu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I2C umožňuje prepojenie až 128 rôznych zariadení s pomocou iba dvoch obojsmerných vodičov. Jeden tvoria hodinový signál SCL (Synchronous Clock) a druhý dátový kanál SDA (Synchronous Data). Maximálna dĺžka vodičov je daná ich najvyššou povolenou kapacitou 400 pF, všeobecne sa uvádza cca 10cm. Každý vodič musí byť pripojený jedným pull-up rezistorom ku kladnému napätiu, čo zaistí vysokú úroveň v pokojovom stave. Pri prebiehajúcom prenose sú na SDA vysielané jednotlivé dátové bity pričom platí pravidlo, že logická úroveň na SDA sa môže nastaviť len ak je SCL v úrovni L. Toto pravidlo je porušené v dvoch špeciálnych prípadoch, a to pri vysielaní podmienok START a STOP, ktoré sa používajú na začatie komunikácie a k ukončeniu prenosu.&lt;br /&gt;
Maximálna frekvencia signálu SCL je podľa verzie I2C 100 kHz alebo 400 kHz. Pre obe frekvencie je daná minimálna povolená doba zotrvania SCL v úrovni L a H. Pri komunikácii aj pri prenose dát si jednotlivé stanice synchronizujú generátory hodín tak, že trvanie úrovne H na SCL je odmeriavané vnútorným časovačom každej stanice až od okamihu, keď SCL skutočne úrovne H dosiahne (pretože je SCL typu otvorený kolektor, môže byť v úrovni L držaný aj v situácii kedy sa daná stanica snaží nastaviť úroveň H). Podobne je doba trvania úrovne L na SCL odmeriavaná od zostupnej hrany. Tento mechanizmus umožňuje pre niektoré zo staníc spomaliť prenos: pomalá stanica môže podržať po určitú dobu signál SCL v úrovni L a tým zabrániť vysielajúcej stanici vo vyslaní ďalšieho bitu. Zbernica I2C neumožňuje duplexný prenos, v jednom okamihu vysiela len jedno zariadenie. Všetky zariadenia pripojené na zbernicu musia mať individuálnu adresu a implementovaný mechanizmus komunikácie pomocou I²C zbernice &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Princíp obojsmernej komunikácie&amp;lt;ref&amp;gt;Texas Instruments, Understanding the I2C Bus, Application Report SLVA704 - June 2015. https://www.ti.com/lit/slva704&amp;lt;/ref&amp;gt;===&lt;br /&gt;
Otvorený kolektor označuje typ výstupu, ktorý môže stiahnuť napäťovú úroveň zbernica na nízku úroveň - teda log.0 (vo väčšine prípadov na zem), alebo &amp;quot;uvoľniť&amp;quot; zbernicu a nechať napätie aby pomocou pull-up rezistora stúplo na úroveň logicej.1. V prípade, že je zbernica uvoľnená uzlom master alebo slave, pripojený pull-up rezistor je zodpovedný za vytiahnutie zbernice na úroveň napájacieho napätia. Keďže žiadne zariadenie nesmie vynucovať vysokú úroveň napätie na linke (teda úroveň pre log.1), znamená to že na zbernici nikdy nedôjde ku komunikačnému problému, keď sa jedno zariadenie pokúsi pripojiť napätie pre úroveň log.1 a iné zariadenie stiahne zbernicu na úroveň log.0, čo by spôsobilo skrat (napájacie napätie na zem). I2C vyžaduje, aby v prípade že master v zapojení s viacerými mastermi vysiela a vidí, že linka je v úrovni log.0 (iné zariadenie ju ťahá nadol - teda iné zariadenie komunikuje), zastaví komunikáciu, pretože zbernicu používa iné zariadenie. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_bidirCom.png|300px|Obr. 1x. Základná štruktúra linky SDA/SCL]]&lt;br /&gt;
&lt;br /&gt;
Obr. 1x. Základná štruktúra linky SDA/SCL&lt;br /&gt;
&lt;br /&gt;
Obr. 1x zobrazuje zjednodušenú schému vnútornej štruktúry master alebo slave zariadenia pre komunikačné linky SDA/SCL. Táto schéma obsahuje vyrovnávaciu pamät (buffer) na čítanie vstupných údajov a znižujúci (pull-down) tranzistor FET na prenos údajov. Zariadenie je schopné meniť napäťovú úroveň iba na log.0 (vytvoriť skrat na zem) alebo uvoľniť linku zbernice (vysoká impedancia voči zemi) a umožniť, aby pull-up rezistor zvýšil napätie. Toto je dôležitý koncept, ktorý si treba uvedomiť pri práci s I2C zariadeniami, pretože žiadne zariadenie nesmie zvyšovať úroveň napätia pre log.1. Táto vlastnosť umožňuje obojsmernú komunikáciu medzi uzlami master a slave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Protokol prenášaných údajov&amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Údaje v rozhraní I2C sa prenášajú v tzv. správach. Každá správa je rozdelená do  jednotlivých rámcov, a to: adresný rámec, ktorý identifikuje binárnu adresu Slave zariadenia a následne jeden alebo viacero dátových rámcov, ktoré obsahujú prenášaný obsah. Správy obsahujú aj bity pre čítanie/zápis, bity ACK/NACK a podmienky START a STOP (Obr. 2). &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_2_strukturaSpravy.png|600px|Obr. 2. Štruktúra správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 2. Štruktúra správy cez I2C rozhranie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''START''' - podmienka štart signalizuje začiatok komunikácie. Linka SDA sa prepne z vysokej (log. 1) na nízku hodnotu (log. 0) ''skôr'', ako sa linka SCL prepne z vysokej na nízku hodnotu.&lt;br /&gt;
* '''ADDRESS''' - adresa Slave zariadenia, s ktorým chce Master komunikovať. Adresa predstavuje 7 alebo 10 bitové celé číslo v binárnom tvare, ktoré predstavuje jedinečný identifikátor každého Slave zariadenia. Dve zariadenia by nemali mať tú istú adresu v jednej I2C zbernici.&lt;br /&gt;
* '''RW''' - jeden bit, ktorý určuje či sa vykonáva operácia zápisu alebo čítania:&lt;br /&gt;
** Ak RW = 0, zápis údajov na Slave zariadenie.&lt;br /&gt;
** Ak RW = 1, čítanie údajov zo Slave zariadenia.&lt;br /&gt;
* '''ACK/NACK''' nasleduje za každým rámcom v správe. Je to bit potvrdenia/nepotvrdenia:&lt;br /&gt;
** Ak bol úspešne prijatý adresný alebo dátový rámec, prijímajúce zariadenie vráti odosielateľovi log. 0 (ACK - Acknowledged).  &lt;br /&gt;
** Ak nastala chyba v prenose, prijímajúce zariadenie vráti odosielateľovi log. 1 (NACK - Not Acknowledged).&lt;br /&gt;
* Existuje niekoľko situácií, ktoré vedú k vytvoreniu NACK:&lt;br /&gt;
** Prijímač vykonáva nejakú funkciu v reálnom čase a nie je pripravený začať komunikáciu s Masterom.&lt;br /&gt;
** Prijímač odbrží neznáme údaje alebo príkazy.&lt;br /&gt;
** Počas prenosu prijímač nemôže prijímať ďalšie dátové bajty.&lt;br /&gt;
** Master ukončí čítanie údajov a oznámi to Slave zariadeniu pomocou NACK. &lt;br /&gt;
&lt;br /&gt;
* '''DATA''' - Dátový rámec je vždy dlhý 8 bitov a posiela sa s najvýznamnejším bitom (MSB) ako prvým. Za každým dátovým rámcom bezprostredne nasleduje bit ACK/NACK na overenie, či bol rámec úspešne prijatý. Pred odoslaním ďalšieho dátového rámca musí bit ACK prijať buď master, alebo slave (v závislosti od toho, kto dáta odosiela).&lt;br /&gt;
* '''STOP''' - ukončovacia podmienka štart signalizuje koniec komunikácie. Linka SDA sa prepne z nízkej (log. 0) na vysokú hodnotu (log. 1) ''potom'', čo sa linka SCL prepne z nízkej úrovne na vysokú &amp;lt;ref&amp;gt;Scott Campbell. BASICS OF THE I2C COMMUNICATION PROTOCOL. https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Sal Afzal. I2C Primer: What is I2C? (Part 1). https://www.analog.com/en/technical-articles/i2c-primer-what-is-i2c-part-1.html.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Na Obr.3 je vyobrazený časový diagram zápisu a čítania údajov s veľkosťou 2B prostredníctvom rozhrania I2C. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_3_casovyDiagram.png|600px|Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní]]&lt;br /&gt;
&lt;br /&gt;
Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní&lt;br /&gt;
&lt;br /&gt;
===Základné vlastnosti a parametre zbernice I2C===&lt;br /&gt;
&lt;br /&gt;
Základná pracovná frekvencia linky je 100kHz. Špecifikácia I2C dovoľuje zvýšiť túto frekvenciu až na 3.4 MHz. Zvýšenie frekvencie na strane mikrokontroléra je záležitosť konfigurácie. Je potrebné zvoliť takú frekvenciu, ktorú podporuje pripojený senzor alebo zariadenie, s ktorým chceme komunikovať.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Časovanie !! SCL&lt;br /&gt;
|-&lt;br /&gt;
| Standard Mode || 100 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Fast Mode || 400 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Fast Mode Plus || 1 MHz&lt;br /&gt;
|-&lt;br /&gt;
| High Speed Mode || 3.4 MHz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Modifikácia I2C protokolu pre displeje===&lt;br /&gt;
&lt;br /&gt;
Pri displejoch treba v prenášanej správe obsiahnuť aj informáciu o tom či sa posiela príkaz alebo dáta. Preto je do správy pridaný 8-bitový DC rámec, ktorý nasleduje vždy za rámcom adresy. DC rámec obvykle nadobúda hodnoty 0 pre príkaz a 64 pre dáta, avšak toto pravidlo nie je pevne dané. Po odoslaní DC rámca sa odošle N rámcov dát (Obr.4).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_4_displeje.png|600px|Obr. 4. Štruktúra displejovej správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 4. Štruktúra displejovej správy cez I2C rozhranie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje a aOdkazy ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Mcu_i2c_bidirCom.png&amp;diff=13257</id>
		<title>Súbor:Mcu i2c bidirCom.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Mcu_i2c_bidirCom.png&amp;diff=13257"/>
		<updated>2023-03-24T22:41:29Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13256</id>
		<title>Komunikačné rozhranie I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13256"/>
		<updated>2023-03-21T22:35:42Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah}}&lt;br /&gt;
&lt;br /&gt;
Inter-Integrated Circuit alebo I²C je dvojžilová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná predovšetkým na prepojenie periférnych zariadení s mikrokontrolérom. Na zbernicu sú pripojené zariadenia rozdelené na riadiace (Master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (Slave - zariadenie adresované Masterom) &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;Gabriel Gašpar a Juraj Ďuďák. Využitie mikrokontrolérov v automatizovanom riadení. Spektrum, 2023. ISBN: 978-80-227-5283-1.&amp;lt;/ref&amp;gt; na Obr. 1 &amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;Matúš Nečas: Multi-displej systém pre embedded aplikácie, Bakalárska práca, MTF STUBA, 2023&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_1_pripojenie.png|600px|Obr. 1. Pripojenie zaradení na zbernicu]]&lt;br /&gt;
&lt;br /&gt;
Obr. 1. Pripojenie zaradení na zbernicu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I2C umožňuje prepojenie až 128 rôznych zariadení s pomocou iba dvoch obojsmerných vodičov. Jeden tvoria hodinový signál SCL (Synchronous Clock) a druhý dátový kanál SDA (Synchronous Data). Maximálna dĺžka vodičov je daná ich najvyššou povolenou kapacitou 400 pF, všeobecne sa uvádza cca 10cm. Každý vodič musí byť pripojený jedným pull-up rezistorom ku kladnému napätiu, čo zaistí vysokú úroveň v pokojovom stave. Pri prebiehajúcom prenose sú na SDA vysielané jednotlivé dátové bity pričom platí pravidlo, že logická úroveň na SDA sa môže nastaviť len ak je SCL v úrovni L. Toto pravidlo je porušené v dvoch špeciálnych prípadoch, a to pri vysielaní podmienok START a STOP, ktoré sa používajú na začatie komunikácie a k ukončeniu prenosu.&lt;br /&gt;
Maximálna frekvencia signálu SCL je podľa verzie I2C 100 kHz alebo 400 kHz. Pre obe frekvencie je daná minimálna povolená doba zotrvania SCL v úrovni L a H. Pri komunikácii aj pri prenose dát si jednotlivé stanice synchronizujú generátory hodín tak, že trvanie úrovne H na SCL je odmeriavané vnútorným časovačom každej stanice až od okamihu, keď SCL skutočne úrovne H dosiahne (pretože je SCL typu otvorený kolektor, môže byť v úrovni L držaný aj v situácii kedy sa daná stanica snaží nastaviť úroveň H). Podobne je doba trvania úrovne L na SCL odmeriavaná od zostupnej hrany. Tento mechanizmus umožňuje pre niektoré zo staníc spomaliť prenos: pomalá stanica môže podržať po určitú dobu signál SCL v úrovni L a tým zabrániť vysielajúcej stanici vo vyslaní ďalšieho bitu. Zbernica I2C neumožňuje duplexný prenos, v jednom okamihu vysiela len jedno zariadenie. Všetky zariadenia pripojené na zbernicu musia mať individuálnu adresu a implementovaný mechanizmus komunikácie pomocou I²C zbernice &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Protokol prenášaných údajov&amp;lt;ref name=&amp;quot;bpmn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Údaje v rozhraní I2C sa prenášajú v tzv. správach. Každá správa je rozdelená do  jednotlivých rámcov, a to: adresný rámec, ktorý identifikuje binárnu adresu Slave zariadenia a následne jeden alebo viacero dátových rámcov, ktoré obsahujú prenášaný obsah. Správy obsahujú aj bity pre čítanie/zápis, bity ACK/NACK a podmienky START a STOP (Obr. 2). &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_2_strukturaSpravy.png|600px|Obr. 2. Štruktúra správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 2. Štruktúra správy cez I2C rozhranie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''START''' - podmienka štart signalizuje začiatok komunikácie. Linka SDA sa prepne z vysokej (log. 1) na nízku hodnotu (log. 0) ''skôr'', ako sa linka SCL prepne z vysokej na nízku hodnotu.&lt;br /&gt;
* '''ADDRESS''' - adresa Slave zariadenia, s ktorým chce Master komunikovať. Adresa predstavuje 7 alebo 10 bitové celé číslo v binárnom tvare, ktoré predstavuje jedinečný identifikátor každého Slave zariadenia. Dve zariadenia by nemali mať tú istú adresu v jednej I2C zbernici.&lt;br /&gt;
* '''RW''' - jeden bit, ktorý určuje či sa vykonáva operácia zápisu alebo čítania:&lt;br /&gt;
** Ak RW = 0, zápis údajov na Slave zariadenie.&lt;br /&gt;
** Ak RW = 1, čítanie údajov zo Slave zariadenia.&lt;br /&gt;
* '''ACK/NACK''' nasleduje za každým rámcom v správe. Je to bit potvrdenia/nepotvrdenia:&lt;br /&gt;
** Ak bol úspešne prijatý adresný alebo dátový rámec, prijímajúce zariadenie vráti odosielateľovi log. 0 (ACK - Acknowledged).  &lt;br /&gt;
** Ak nastala chyba v prenose, prijímajúce zariadenie vráti odosielateľovi log. 1 (NACK - Not Acknowledged).&lt;br /&gt;
* Existuje niekoľko situácií, ktoré vedú k vytvoreniu NACK:&lt;br /&gt;
** Prijímač vykonáva nejakú funkciu v reálnom čase a nie je pripravený začať komunikáciu s Masterom.&lt;br /&gt;
** Prijímač odbrží neznáme údaje alebo príkazy.&lt;br /&gt;
** Počas prenosu prijímač nemôže prijímať ďalšie dátové bajty.&lt;br /&gt;
** Master ukončí čítanie údajov a oznámi to Slave zariadeniu pomocou NACK. &lt;br /&gt;
&lt;br /&gt;
* '''DATA''' - Dátový rámec je vždy dlhý 8 bitov a posiela sa s najvýznamnejším bitom (MSB) ako prvým. Za každým dátovým rámcom bezprostredne nasleduje bit ACK/NACK na overenie, či bol rámec úspešne prijatý. Pred odoslaním ďalšieho dátového rámca musí bit ACK prijať buď master, alebo slave (v závislosti od toho, kto dáta odosiela).&lt;br /&gt;
* '''STOP''' - ukončovacia podmienka štart signalizuje koniec komunikácie. Linka SDA sa prepne z nízkej (log. 0) na vysokú hodnotu (log. 1) ''potom'', čo sa linka SCL prepne z nízkej úrovne na vysokú &amp;lt;ref&amp;gt;Scott Campbell. BASICS OF THE I2C COMMUNICATION PROTOCOL. https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Sal Afzal. I2C Primer: What is I2C? (Part 1). https://www.analog.com/en/technical-articles/i2c-primer-what-is-i2c-part-1.html.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Na Obr.3 je vyobrazený časový diagram zápisu a čítania údajov s veľkosťou 2B prostredníctvom rozhrania I2C. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_3_casovyDiagram.png|600px|Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní]]&lt;br /&gt;
&lt;br /&gt;
Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
===Modifikácia I2C protokolu pre displeje===&lt;br /&gt;
&lt;br /&gt;
Pri displejoch treba v prenášanej správe obsiahnuť aj informáciu o tom či sa posiela príkaz alebo dáta. Preto je do správy pridaný 8-bitový DC rámec, ktorý nasleduje vždy za rámcom adresy. DC rámec obvykle nadobúda hodnoty 0 pre príkaz a 64 pre dáta, avšak toto pravidlo nie je pevne dané. Po odoslaní DC rámca sa odošle N rámcov dát (Obr.4).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_4_displeje.png|600px|Obr. 4. Štruktúra displejovej správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 4. Štruktúra displejovej správy cez I2C rozhranie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje a aOdkazy ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13254</id>
		<title>Komunikačné rozhranie I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13254"/>
		<updated>2023-03-21T20:28:34Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah}}&lt;br /&gt;
&lt;br /&gt;
Inter-Integrated Circuit alebo I²C je dvojžilová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná predovšetkým na prepojenie periférnych zariadení s mikrokontrolérom. Na zbernicu sú pripojené zariadenia rozdelené na riadiace (Master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (Slave - zariadenie adresované Masterom) &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;Gabriel Gašpar a Juraj Ďuďák. Využitie mikrokontrolérov v automatizovanom riadení. Spektrum, 2023. ISBN: 978-80-227-5283-1.&amp;lt;/ref&amp;gt; na Obr. 1&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_1_pripojenie.png|600px|Obr. 1. Pripojenie zaradení na zbernicu]]&lt;br /&gt;
&lt;br /&gt;
Obr. 1. Pripojenie zaradení na zbernicu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I2C umožňuje prepojenie až 128 rôznych zariadení s pomocou iba dvoch obojsmerných vodičov. Jeden tvoria hodinový signál SCL (Synchronous Clock) a druhý dátový kanál SDA (Synchronous Data). Maximálna dĺžka vodičov je daná ich najvyššou povolenou kapacitou 400 pF, všeobecne sa uvádza cca 10cm. Každý vodič musí byť pripojený jedným pull-up rezistorom ku kladnému napätiu, čo zaistí vysokú úroveň v pokojovom stave. Pri prebiehajúcom prenose sú na SDA vysielané jednotlivé dátové bity pričom platí pravidlo, že logická úroveň na SDA sa môže nastaviť len ak je SCL v úrovni L. Toto pravidlo je porušené v dvoch špeciálnych prípadoch, a to pri vysielaní podmienok START a STOP, ktoré sa používajú na začatie komunikácie a k ukončeniu prenosu.&lt;br /&gt;
Maximálna frekvencia signálu SCL je podľa verzie I2C 100 kHz alebo 400 kHz. Pre obe frekvencie je daná minimálna povolená doba zotrvania SCL v úrovni L a H. Pri komunikácii aj pri prenose dát si jednotlivé stanice synchronizujú generátory hodín tak, že trvanie úrovne H na SCL je odmeriavané vnútorným časovačom každej stanice až od okamihu, keď SCL skutočne úrovne H dosiahne (pretože je SCL typu otvorený kolektor, môže byť v úrovni L držaný aj v situácii kedy sa daná stanica snaží nastaviť úroveň H). Podobne je doba trvania úrovne L na SCL odmeriavaná od zostupnej hrany. Tento mechanizmus umožňuje pre niektoré zo staníc spomaliť prenos: pomalá stanica môže podržať po určitú dobu signál SCL v úrovni L a tým zabrániť vysielajúcej stanici vo vyslaní ďalšieho bitu. Zbernica I2C neumožňuje duplexný prenos, v jednom okamihu vysiela len jedno zariadenie. Všetky zariadenia pripojené na zbernicu musia mať individuálnu adresu a implementovaný mechanizmus komunikácie pomocou I²C zbernice &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Protokol prenášaných údajov===&lt;br /&gt;
&lt;br /&gt;
Údaje v rozhraní I2C sa prenášajú v tzv. správach. Každá správa je rozdelená do  jednotlivých rámcov, a to: adresný rámec, ktorý identifikuje binárnu adresu Slave zariadenia a následne jeden alebo viacero dátových rámcov, ktoré obsahujú prenášaný obsah. Správy obsahujú aj bity pre čítanie/zápis, bity ACK/NACK a podmienky START a STOP (Obr. 2). &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_2_strukturaSpravy.png|600px|Obr. 2. Štruktúra správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 2. Štruktúra správy cez I2C rozhranie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''START''' - podmienka štart signalizuje začiatok komunikácie. Linka SDA sa prepne z vysokej (log. 1) na nízku hodnotu (log. 0) ''skôr'', ako sa linka SCL prepne z vysokej na nízku hodnotu.&lt;br /&gt;
* '''ADDRESS''' - adresa Slave zariadenia, s ktorým chce Master komunikovať. Adresa predstavuje 7 alebo 10 bitové celé číslo v binárnom tvare, ktoré predstavuje jedinečný identifikátor každého Slave zariadenia. Dve zariadenia by nemali mať tú istú adresu v jednej I2C zbernici.&lt;br /&gt;
* '''RW''' - jeden bit, ktorý určuje či sa vykonáva operácia zápisu alebo čítania:&lt;br /&gt;
** Ak RW = 0, zápis údajov na Slave zariadenie.&lt;br /&gt;
** Ak RW = 1, čítanie údajov zo Slave zariadenia.&lt;br /&gt;
* '''ACK/NACK''' nasleduje za každým rámcom v správe. Je to bit potvrdenia/nepotvrdenia:&lt;br /&gt;
** Ak bol úspešne prijatý adresný alebo dátový rámec, prijímajúce zariadenie vráti odosielateľovi log. 0 (ACK - Acknowledged).  &lt;br /&gt;
** Ak nastala chyba v prenose, prijímajúce zariadenie vráti odosielateľovi log. 1 (NACK - Not Acknowledged).&lt;br /&gt;
* Existuje niekoľko situácií, ktoré vedú k vytvoreniu NACK:&lt;br /&gt;
** Prijímač vykonáva nejakú funkciu v reálnom čase a nie je pripravený začať komunikáciu s Masterom.&lt;br /&gt;
** Prijímač odbrží neznáme údaje alebo príkazy.&lt;br /&gt;
** Počas prenosu prijímač nemôže prijímať ďalšie dátové bajty.&lt;br /&gt;
** Master ukončí čítanie údajov a oznámi to Slave zariadeniu pomocou NACK. &lt;br /&gt;
&lt;br /&gt;
* '''DATA''' - Dátový rámec je vždy dlhý 8 bitov a posiela sa s najvýznamnejším bitom (MSB) ako prvým. Za každým dátovým rámcom bezprostredne nasleduje bit ACK/NACK na overenie, či bol rámec úspešne prijatý. Pred odoslaním ďalšieho dátového rámca musí bit ACK prijať buď master, alebo slave (v závislosti od toho, kto dáta odosiela).&lt;br /&gt;
* '''STOP''' - ukončovacia podmienka štart signalizuje koniec komunikácie. Linka SDA sa prepne z nízkej (log. 0) na vysokú hodnotu (log. 1) ''potom'', čo sa linka SCL prepne z nízkej úrovne na vysokú &amp;lt;ref&amp;gt;Scott Campbell. BASICS OF THE I2C COMMUNICATION PROTOCOL. https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Sal Afzal. I2C Primer: What is I2C? (Part 1). https://www.analog.com/en/technical-articles/i2c-primer-what-is-i2c-part-1.html.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Na Obr.3 je vyobrazený časový diagram zápisu a čítania údajov s veľkosťou 2B prostredníctvom rozhrania I2C. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_3_casovyDiagram.png|600px|Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní]]&lt;br /&gt;
&lt;br /&gt;
Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
===Modifikácia I2C protokolu pre displeje===&lt;br /&gt;
&lt;br /&gt;
Pri displejoch treba v prenášanej správe obsiahnuť aj informáciu o tom či sa posiela príkaz alebo dáta. Preto je do správy pridaný 8-bitový DC rámec, ktorý nasleduje vždy za rámcom adresy. DC rámec obvykle nadobúda hodnoty 0 pre príkaz a 64 pre dáta, avšak toto pravidlo nie je pevne dané. Po odoslaní DC rámca sa odošle N rámcov dát (Obr.4).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_4_displeje.png|600px|Obr. 4. Štruktúra displejovej správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 4. Štruktúra displejovej správy cez I2C rozhranie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje a aOdkazy ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13252</id>
		<title>Komunikačné rozhranie I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13252"/>
		<updated>2023-03-21T20:26:41Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah}}&lt;br /&gt;
&lt;br /&gt;
Inter-Integrated Circuit alebo I²C je dvojžilová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná predovšetkým na prepojenie periférnych zariadení s mikrokontrolérom. Na zbernicu sú pripojené zariadenia rozdelené na riadiace (Master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (Slave - zariadenie adresované Masterom) &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;Gabriel Gašpar a Juraj Ďuďák. Využitie mikrokontrolérov v automatizovanom riadení. Spektrum, 2023. ISBN: 978-80-227-5283-1.&amp;lt;/ref&amp;gt; na Obr. 1&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_1_pripojenie.png|600px|Obr. 1. Pripojenie zaradení na zbernicu]]&lt;br /&gt;
&lt;br /&gt;
Obr. 1. Pripojenie zaradení na zbernicu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I2C umožňuje prepojenie až 128 rôznych zariadení s pomocou iba dvoch obojsmerných vodičov. Jeden tvoria hodinový signál SCL (Synchronous Clock) a druhý dátový kanál SDA (Synchronous Data). Maximálna dĺžka vodičov je daná ich najvyššou povolenou kapacitou 400 pF, všeobecne sa uvádza cca 10cm. Každý vodič musí byť pripojený jedným pull-up rezistorom ku kladnému napätiu, čo zaistí vysokú úroveň v pokojovom stave. Pri prebiehajúcom prenose sú na SDA vysielané jednotlivé dátové bity pričom platí pravidlo, že logická úroveň na SDA sa môže nastaviť len ak je SCL v úrovni L. Toto pravidlo je porušené v dvoch špeciálnych prípadoch, a to pri vysielaní podmienok START a STOP, ktoré sa používajú na začatie komunikácie a k ukončeniu prenosu.&lt;br /&gt;
Maximálna frekvencia signálu SCL je podľa verzie I2C 100 kHz alebo 400 kHz. Pre obe frekvencie je daná minimálna povolená doba zotrvania SCL v úrovni L a H. Pri komunikácii aj pri prenose dát si jednotlivé stanice synchronizujú generátory hodín tak, že trvanie úrovne H na SCL je odmeriavané vnútorným časovačom každej stanice až od okamihu, keď SCL skutočne úrovne H dosiahne (pretože je SCL typu otvorený kolektor, môže byť v úrovni L držaný aj v situácii kedy sa daná stanica snaží nastaviť úroveň H). Podobne je doba trvania úrovne L na SCL odmeriavaná od zostupnej hrany. Tento mechanizmus umožňuje pre niektoré zo staníc spomaliť prenos: pomalá stanica môže podržať po určitú dobu signál SCL v úrovni L a tým zabrániť vysielajúcej stanici vo vyslaní ďalšieho bitu. Zbernica I2C neumožňuje duplexný prenos, v jednom okamihu vysiela len jedno zariadenie. Všetky zariadenia pripojené na zbernicu musia mať individuálnu adresu a implementovaný mechanizmus komunikácie pomocou I²C zbernice &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Protokol prenášaných údajov===&lt;br /&gt;
&lt;br /&gt;
Údaje v rozhraní I2C sa prenášajú v tzv. správach. Každá správa je rozdelená do  jednotlivých rámcov, a to: adresný rámec, ktorý identifikuje binárnu adresu Slave zariadenia a následne jeden alebo viacero dátových rámcov, ktoré obsahujú prenášaný obsah. Správy obsahujú aj bity pre čítanie/zápis, bity ACK/NACK a podmienky START a STOP (Obr. 2). &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_2_strukturaSpravy.png|600px|Obr. 2. Štruktúra správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 2. Štruktúra správy cez I2C rozhranie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''START''' - podmienka štart signalizuje začiatok komunikácie. Linka SDA sa prepne z vysokej (log. 1) na nízku hodnotu (log. 0) ''skôr'', ako sa linka SCL prepne z vysokej na nízku hodnotu.&lt;br /&gt;
* '''ADDRESS''' - adresa Slave zariadenia, s ktorým chce Master komunikovať. Adresa predstavuje 7 alebo 10 bitové celé číslo v binárnom tvare, ktoré predstavuje jedinečný identifikátor každého Slave zariadenia. Dve zariadenia by nemali mať tú istú adresu v jednej I2C zbernici.&lt;br /&gt;
* '''RW''' - jeden bit, ktorý určuje či sa vykonáva operácia zápisu alebo čítania:&lt;br /&gt;
** Ak RW = 0, zápis údajov na Slave zariadenie.&lt;br /&gt;
** Ak RW = 1, čítanie údajov zo Slave zariadenia.&lt;br /&gt;
* '''ACK/NACK''' nasleduje za každým rámcom v správe. Je to bit potvrdenia/nepotvrdenia:&lt;br /&gt;
** Ak bol úspešne prijatý adresný alebo dátový rámec, prijímajúce zariadenie vráti odosielateľovi log. 0 (ACK - Acknowledged).  &lt;br /&gt;
** Ak nastala chyba v prenose, prijímajúce zariadenie vráti odosielateľovi log. 1 (NACK - Not Acknowledged).&lt;br /&gt;
Existuje niekoľko situácií, ktoré vedú k vytvoreniu NACK:&lt;br /&gt;
** Prijímač vykonáva nejakú funkciu v reálnom čase a nie je pripravený začať komunikáciu s Masterom.&lt;br /&gt;
** Prijímač odbrží neznáme údaje alebo príkazy.&lt;br /&gt;
** Počas prenosu prijímač nemôže prijímať ďalšie dátové bajty.&lt;br /&gt;
** Master ukončí čítanie údajov a oznámi to Slave zariadeniu pomocou NACK. &lt;br /&gt;
&lt;br /&gt;
* '''DATA''' - Dátový rámec je vždy dlhý 8 bitov a posiela sa s najvýznamnejším bitom (MSB) ako prvým. Za každým dátovým rámcom bezprostredne nasleduje bit ACK/NACK na overenie, či bol rámec úspešne prijatý. Pred odoslaním ďalšieho dátového rámca musí bit ACK prijať buď master, alebo slave (v závislosti od toho, kto dáta odosiela).&lt;br /&gt;
* '''STOP''' - ukončovacia podmienka štart signalizuje koniec komunikácie. Linka SDA sa prepne z nízkej (log. 0) na vysokú hodnotu (log. 1) ''potom'', čo sa linka SCL prepne z nízkej úrovne na vysokú &amp;lt;ref&amp;gt;Scott Campbell. BASICS OF THE I2C COMMUNICATION PROTOCOL. https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Sal Afzal. I2C Primer: What is I2C? (Part 1). https://www.analog.com/en/technical-articles/i2c-primer-what-is-i2c-part-1.html.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Na Obr.3 je vyobrazený časový diagram zápisu a čítania údajov s veľkosťou 2B prostredníctvom rozhrania I2C. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_3_casovyDiagram.png|600px|Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní]]&lt;br /&gt;
&lt;br /&gt;
Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
===Modifikácia I2C protokolu pre displeje===&lt;br /&gt;
&lt;br /&gt;
Pri displejoch treba v prenášanej správe obsiahnuť aj informáciu o tom či sa posiela príkaz alebo dáta. Preto je do správy pridaný 8-bitový DC rámec, ktorý nasleduje vždy za rámcom adresy. DC rámec obvykle nadobúda hodnoty 0 pre príkaz a 64 pre dáta, avšak toto pravidlo nie je pevne dané. Po odoslaní DC rámca sa odošle N rámcov dát (Obr.4).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_4_displeje.png|600px|Obr. 4. Štruktúra displejovej správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 4. Štruktúra displejovej správy cez I2C rozhranie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje a aOdkazy ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13251</id>
		<title>Komunikačné rozhranie I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13251"/>
		<updated>2023-03-21T20:25:25Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah}}&lt;br /&gt;
&lt;br /&gt;
Inter-Integrated Circuit alebo I²C je dvojžilová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná predovšetkým na prepojenie periférnych zariadení s mikrokontrolérom. Na zbernicu sú pripojené zariadenia rozdelené na riadiace (Master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (Slave - zariadenie adresované Masterom) &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;Gabriel Gašpar a Juraj Ďuďák. Využitie mikrokontrolérov v automatizovanom riadení. Spektrum, 2023. ISBN: 978-80-227-5283-1.&amp;lt;/ref&amp;gt; na Obr. 1&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_1_pripojenie.png|600px|Obr. 1. Pripojenie zaradení na zbernicu]]&lt;br /&gt;
&lt;br /&gt;
Obr. 1. Pripojenie zaradení na zbernicu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I2C umožňuje prepojenie až 128 rôznych zariadení s pomocou iba dvoch obojsmerných vodičov. Jeden tvoria hodinový signál SCL (Synchronous Clock) a druhý dátový kanál SDA (Synchronous Data). Maximálna dĺžka vodičov je daná ich najvyššou povolenou kapacitou 400 pF, všeobecne sa uvádza cca 10cm. Každý vodič musí byť pripojený jedným pull-up rezistorom ku kladnému napätiu, čo zaistí vysokú úroveň v pokojovom stave. Pri prebiehajúcom prenose sú na SDA vysielané jednotlivé dátové bity pričom platí pravidlo, že logická úroveň na SDA sa môže nastaviť len ak je SCL v úrovni L. Toto pravidlo je porušené v dvoch špeciálnych prípadoch, a to pri vysielaní podmienok START a STOP, ktoré sa používajú na začatie komunikácie a k ukončeniu prenosu.&lt;br /&gt;
Maximálna frekvencia signálu SCL je podľa verzie I2C 100 kHz alebo 400 kHz. Pre obe frekvencie je daná minimálna povolená doba zotrvania SCL v úrovni L a H. Pri komunikácii aj pri prenose dát si jednotlivé stanice synchronizujú generátory hodín tak, že trvanie úrovne H na SCL je odmeriavané vnútorným časovačom každej stanice až od okamihu, keď SCL skutočne úrovne H dosiahne (pretože je SCL typu otvorený kolektor, môže byť v úrovni L držaný aj v situácii kedy sa daná stanica snaží nastaviť úroveň H). Podobne je doba trvania úrovne L na SCL odmeriavaná od zostupnej hrany. Tento mechanizmus umožňuje pre niektoré zo staníc spomaliť prenos: pomalá stanica môže podržať po určitú dobu signál SCL v úrovni L a tým zabrániť vysielajúcej stanici vo vyslaní ďalšieho bitu. Zbernica I2C neumožňuje duplexný prenos, v jednom okamihu vysiela len jedno zariadenie. Všetky zariadenia pripojené na zbernicu musia mať individuálnu adresu a implementovaný mechanizmus komunikácie pomocou I²C zbernice &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Protokol prenášaných údajov===&lt;br /&gt;
&lt;br /&gt;
Údaje v rozhraní I2C sa prenášajú v tzv. správach. Každá správa je rozdelená do  jednotlivých rámcov, a to: adresný rámec, ktorý identifikuje binárnu adresu Slave zariadenia a následne jeden alebo viacero dátových rámcov, ktoré obsahujú prenášaný obsah. Správy obsahujú aj bity pre čítanie/zápis, bity ACK/NACK a podmienky START a STOP (Obr. 2). &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_2_strukturaSpravy.png|600px|Obr. 2. Štruktúra správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
Obr. 2. Štruktúra správy cez I2C rozhranie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''START''' - podmienka štart signalizuje začiatok komunikácie. Linka SDA sa prepne z vysokej (log. 1) na nízku hodnotu (log. 0) ''skôr'', ako sa linka SCL prepne z vysokej na nízku hodnotu.&lt;br /&gt;
* '''ADDRESS''' - adresa Slave zariadenia, s ktorým chce Master komunikovať. Adresa predstavuje 7 alebo 10 bitové celé číslo v binárnom tvare, ktoré predstavuje jedinečný identifikátor každého Slave zariadenia. Dve zariadenia by nemali mať tú istú adresu v jednej I2C zbernici.&lt;br /&gt;
* '''RW''' - jeden bit, ktorý určuje či sa vykonáva operácia zápisu alebo čítania:&lt;br /&gt;
** Ak RW = 0, zápis údajov na Slave zariadenie.&lt;br /&gt;
** Ak RW = 1, čítanie údajov zo Slave zariadenia.&lt;br /&gt;
* '''ACK/NACK''' nasleduje za každým rámcom v správe. Je to bit potvrdenia/nepotvrdenia:&lt;br /&gt;
** Ak bol úspešne prijatý adresný alebo dátový rámec, prijímajúce zariadenie vráti odosielateľovi log. 0 (ACK - Acknowledged).  &lt;br /&gt;
** Ak nastala chyba v prenose, prijímajúce zariadenie vráti odosielateľovi log. 1 (NACK - Not Acknowledged).&lt;br /&gt;
Existuje niekoľko situácií, ktoré vedú k vytvoreniu NACK:&lt;br /&gt;
** Prijímač vykonáva nejakú funkciu v reálnom čase a nie je pripravený začať komunikáciu s Masterom.&lt;br /&gt;
** Prijímač odbrží neznáme údaje alebo príkazy.&lt;br /&gt;
** Počas prenosu prijímač nemôže prijímať ďalšie dátové bajty.&lt;br /&gt;
** Master ukončí čítanie údajov a oznámi to Slave zariadeniu pomocou NACK. &lt;br /&gt;
&lt;br /&gt;
* '''DATA''' - Dátový rámec je vždy dlhý 8 bitov a posiela sa s najvýznamnejším bitom (MSB) ako prvým. Za každým dátovým rámcom bezprostredne nasleduje bit ACK/NACK na overenie, či bol rámec úspešne prijatý. Pred odoslaním ďalšieho dátového rámca musí bit ACK prijať buď master, alebo slave (v závislosti od toho, kto dáta odosiela).&lt;br /&gt;
* '''STOP''' - ukončovacia podmienka štart signalizuje koniec komunikácie. Linka SDA sa prepne z nízkej (log. 0) na vysokú hodnotu (log. 1) ''potom'', čo sa linka SCL prepne z nízkej úrovne na vysokú &amp;lt;ref&amp;gt;Scott Campbell. BASICS OF THE I2C COMMUNICATION PROTOCOL. https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Sal Afzal. I2C Primer: What is I2C? (Part 1). https://www.analog.com/en/technical-articles/i2c-primer-what-is-i2c-part-1.html.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Na Obr.3 je vyobrazený časový diagram zápisu a čítania údajov s veľkosťou 2B prostredníctvom rozhrania I2C. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_3_casovyDiagram.png|náhľad|Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní]]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
===Modifikácia I2C protokolu pre displeje===&lt;br /&gt;
&lt;br /&gt;
Pri displejoch treba v prenášanej správe obsiahnuť aj informáciu o tom či sa posiela príkaz alebo dáta. Preto je do správy pridaný 8-bitový DC rámec, ktorý nasleduje vždy za rámcom adresy. DC rámec obvykle nadobúda hodnoty 0 pre príkaz a 64 pre dáta, avšak toto pravidlo nie je pevne dané. Po odoslaní DC rámca sa odošle N rámcov dát (Obr.~4).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_4_displeje.png|náhľad|Obr. 4. Štruktúra displejovej správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
== Zdroje a aOdkazy ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13248</id>
		<title>Komunikačné rozhranie I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13248"/>
		<updated>2023-03-21T20:21:49Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah}}&lt;br /&gt;
&lt;br /&gt;
Inter-Integrated Circuit alebo I²C je dvojžilová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná predovšetkým na prepojenie periférnych zariadení s mikrokontrolérom. Na zbernicu sú pripojené zariadenia rozdelené na riadiace (Master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (Slave - zariadenie adresované Masterom) &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;Gabriel Gašpar a Juraj Ďuďák. Využitie mikrokontrolérov v automatizovanom riadení. Spektrum, 2023. ISBN: 978-80-227-5283-1.&amp;lt;/ref&amp;gt; na Obr. 1&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_1_pripojenie.png|Onr. 1. Pripojenie zaradení na zbernicu]]&lt;br /&gt;
&lt;br /&gt;
I2C umožňuje prepojenie až 128 rôznych zariadení s pomocou iba dvoch obojsmerných vodičov. Jeden tvoria hodinový signál SCL (Synchronous Clock) a druhý dátový kanál SDA (Synchronous Data). Maximálna dĺžka vodičov je daná ich najvyššou povolenou kapacitou 400 pF, všeobecne sa uvádza cca 10cm. Každý vodič musí byť pripojený jedným pull-up rezistorom ku kladnému napätiu, čo zaistí vysokú úroveň v pokojovom stave. Pri prebiehajúcom prenose sú na SDA vysielané jednotlivé dátové bity pričom platí pravidlo, že logická úroveň na SDA sa môže nastaviť len ak je SCL v úrovni L. Toto pravidlo je porušené v dvoch špeciálnych prípadoch, a to pri vysielaní podmienok START a STOP, ktoré sa používajú na začatie komunikácie a k ukončeniu prenosu.&lt;br /&gt;
Maximálna frekvencia signálu SCL je podľa verzie I2C 100 kHz alebo 400 kHz. Pre obe frekvencie je daná minimálna povolená doba zotrvania SCL v úrovni L a H. Pri komunikácii aj pri prenose dát si jednotlivé stanice synchronizujú generátory hodín tak, že trvanie úrovne H na SCL je odmeriavané vnútorným časovačom každej stanice až od okamihu, keď SCL skutočne úrovne H dosiahne (pretože je SCL typu otvorený kolektor, môže byť v úrovni L držaný aj v situácii kedy sa daná stanica snaží nastaviť úroveň H). Podobne je doba trvania úrovne L na SCL odmeriavaná od zostupnej hrany. Tento mechanizmus umožňuje pre niektoré zo staníc spomaliť prenos: pomalá stanica môže podržať po určitú dobu signál SCL v úrovni L a tým zabrániť vysielajúcej stanici vo vyslaní ďalšieho bitu. Zbernica I2C neumožňuje duplexný prenos, v jednom okamihu vysiela len jedno zariadenie. Všetky zariadenia pripojené na zbernicu musia mať individuálnu adresu a implementovaný mechanizmus komunikácie pomocou I²C zbernice &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Protokol prenášaných údajov===&lt;br /&gt;
&lt;br /&gt;
Údaje v rozhraní I2C sa prenášajú v tzv. správach. Každá správa je rozdelená do  jednotlivých rámcov, a to: adresný rámec, ktorý identifikuje binárnu adresu Slave zariadenia a následne jeden alebo viacero dátových rámcov, ktoré obsahujú prenášaný obsah. Správy obsahujú aj bity pre čítanie/zápis, bity ACK/NACK a podmienky START a STOP (Obr. 2). &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_2_strukturaSpravy.png|náhľad|Obr. 2. Štruktúra správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
* '''START''' - podmienka štart signalizuje začiatok komunikácie. Linka SDA sa prepne z vysokej (log. 1) na nízku hodnotu (log. 0) ''skôr'', ako sa linka SCL prepne z vysokej na nízku hodnotu.&lt;br /&gt;
* '''ADDRESS''' - adresa Slave zariadenia, s ktorým chce Master komunikovať. Adresa predstavuje 7 alebo 10 bitové celé číslo v binárnom tvare, ktoré predstavuje jedinečný identifikátor každého Slave zariadenia. Dve zariadenia by nemali mať tú istú adresu v jednej I2C zbernici.&lt;br /&gt;
* '''RW''' - jeden bit, ktorý určuje či sa vykonáva operácia zápisu alebo čítania:&lt;br /&gt;
** Ak RW = 0, zápis údajov na Slave zariadenie.&lt;br /&gt;
** Ak RW = 1, čítanie údajov zo Slave zariadenia.&lt;br /&gt;
* '''ACK/NACK''' nasleduje za každým rámcom v správe. Je to bit potvrdenia/nepotvrdenia:&lt;br /&gt;
** Ak bol úspešne prijatý adresný alebo dátový rámec, prijímajúce zariadenie vráti odosielateľovi log. 0 (ACK - Acknowledged).  &lt;br /&gt;
** Ak nastala chyba v prenose, prijímajúce zariadenie vráti odosielateľovi log. 1 (NACK - Not Acknowledged).&lt;br /&gt;
Existuje niekoľko situácií, ktoré vedú k vytvoreniu NACK:&lt;br /&gt;
** Prijímač vykonáva nejakú funkciu v reálnom čase a nie je pripravený začať komunikáciu s Masterom.&lt;br /&gt;
** Prijímač odbrží neznáme údaje alebo príkazy.&lt;br /&gt;
** Počas prenosu prijímač nemôže prijímať ďalšie dátové bajty.&lt;br /&gt;
** Master ukončí čítanie údajov a oznámi to Slave zariadeniu pomocou NACK. &lt;br /&gt;
&lt;br /&gt;
* '''DATA''' - Dátový rámec je vždy dlhý 8 bitov a posiela sa s najvýznamnejším bitom (MSB) ako prvým. Za každým dátovým rámcom bezprostredne nasleduje bit ACK/NACK na overenie, či bol rámec úspešne prijatý. Pred odoslaním ďalšieho dátového rámca musí bit ACK prijať buď master, alebo slave (v závislosti od toho, kto dáta odosiela).&lt;br /&gt;
* '''STOP''' - ukončovacia podmienka štart signalizuje koniec komunikácie. Linka SDA sa prepne z nízkej (log. 0) na vysokú hodnotu (log. 1) ''potom'', čo sa linka SCL prepne z nízkej úrovne na vysokú &amp;lt;ref&amp;gt;Scott Campbell. BASICS OF THE I2C COMMUNICATION PROTOCOL. https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Sal Afzal. I2C Primer: What is I2C? (Part 1). https://www.analog.com/en/technical-articles/i2c-primer-what-is-i2c-part-1.html.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Na Obr.3 je vyobrazený časový diagram zápisu a čítania údajov s veľkosťou 2B prostredníctvom rozhrania I2C. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_3_casovyDiagram.png|náhľad|Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní]]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
===Modifikácia I2C protokolu pre displeje===&lt;br /&gt;
&lt;br /&gt;
Pri displejoch treba v prenášanej správe obsiahnuť aj informáciu o tom či sa posiela príkaz alebo dáta. Preto je do správy pridaný 8-bitový DC rámec, ktorý nasleduje vždy za rámcom adresy. DC rámec obvykle nadobúda hodnoty 0 pre príkaz a 64 pre dáta, avšak toto pravidlo nie je pevne dané. Po odoslaní DC rámca sa odošle N rámcov dát (Obr.~4).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_4_displeje.png|náhľad|Obr. 4. Štruktúra displejovej správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
== Zdroje a aOdkazy ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13246</id>
		<title>Komunikačné rozhranie I2C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Komunika%C4%8Dn%C3%A9_rozhranie_I2C&amp;diff=13246"/>
		<updated>2023-03-21T20:17:16Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Vytvorená stránka „{{MCU_ARM_Obsah}}  Inter-Integrated Circuit alebo I²C je dvojžilová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MCU_ARM_Obsah}}&lt;br /&gt;
&lt;br /&gt;
Inter-Integrated Circuit alebo I²C je dvojžilová obojsmerná zbernica vyvinutá firmou Philips začiatkom 90-tych rokov 20. storočia, používaná predovšetkým na prepojenie periférnych zariadení s mikrokontrolérom. Na zbernicu sú pripojené zariadenia rozdelené na riadiace (Master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (Slave - zariadenie adresované Masterom) &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;Gabriel Gašpar a Juraj Ďuďák. Využitie mikrokontrolérov v automatizovanom riadení. Spektrum, 2023. ISBN: 978-80-227-5283-1.&amp;lt;/ref&amp;gt; na Obr. 1&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Mcu_i2c_1_pripojenie.png|náhľad|Onr. 1. Pripojenie zaradení na zbernicu]]&lt;br /&gt;
&lt;br /&gt;
I2C umožňuje prepojenie až 128 rôznych zariadení s pomocou iba dvoch obojsmerných vodičov. Jeden tvoria hodinový signál SCL (Synchronous Clock) a druhý dátový kanál SDA (Synchronous Data). Maximálna dĺžka vodičov je daná ich najvyššou povolenou kapacitou 400 pF, všeobecne sa uvádza cca 10cm. Každý vodič musí byť pripojený jedným pull-up rezistorom ku kladnému napätiu, čo zaistí vysokú úroveň v pokojovom stave. Pri prebiehajúcom prenose sú na SDA vysielané jednotlivé dátové bity pričom platí pravidlo, že logická úroveň na SDA sa môže nastaviť len ak je SCL v úrovni L. Toto pravidlo je porušené v dvoch špeciálnych prípadoch, a to pri vysielaní podmienok START a STOP, ktoré sa používajú na začatie komunikácie a k ukončeniu prenosu.&lt;br /&gt;
Maximálna frekvencia signálu SCL je podľa verzie I2C 100 kHz alebo 400 kHz. Pre obe frekvencie je daná minimálna povolená doba zotrvania SCL v úrovni L a H. Pri komunikácii aj pri prenose dát si jednotlivé stanice synchronizujú generátory hodín tak, že trvanie úrovne H na SCL je odmeriavané vnútorným časovačom každej stanice až od okamihu, keď SCL skutočne úrovne H dosiahne (pretože je SCL typu otvorený kolektor, môže byť v úrovni L držaný aj v situácii kedy sa daná stanica snaží nastaviť úroveň H). Podobne je doba trvania úrovne L na SCL odmeriavaná od zostupnej hrany. Tento mechanizmus umožňuje pre niektoré zo staníc spomaliť prenos: pomalá stanica môže podržať po určitú dobu signál SCL v úrovni L a tým zabrániť vysielajúcej stanici vo vyslaní ďalšieho bitu. Zbernica I2C neumožňuje duplexný prenos, v jednom okamihu vysiela len jedno zariadenie. Všetky zariadenia pripojené na zbernicu musia mať individuálnu adresu a implementovaný mechanizmus komunikácie pomocou I²C zbernice &amp;lt;ref name=&amp;quot;upythonUcebnica&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Protokol prenášaných údajov===&lt;br /&gt;
&lt;br /&gt;
Údaje v rozhraní I2C sa prenášajú v tzv. správach. Každá správa je rozdelená do  jednotlivých rámcov, a to: adresný rámec, ktorý identifikuje binárnu adresu Slave zariadenia a následne jeden alebo viacero dátových rámcov, ktoré obsahujú prenášaný obsah. Správy obsahujú aj bity pre čítanie/zápis, bity ACK/NACK a podmienky START a STOP (Obr. 2). &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_2_strukturaSpravy.png|náhľad|Obr. 2. Štruktúra správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
* '''START''' - podmienka štart signalizuje začiatok komunikácie. Linka SDA sa prepne z vysokej (log. 1) na nízku hodnotu (log. 0) ''skôr'', ako sa linka SCL prepne z vysokej na nízku hodnotu.&lt;br /&gt;
* '''ADDRESS''' - adresa Slave zariadenia, s ktorým chce Master komunikovať. Adresa predstavuje 7 alebo 10 bitové celé číslo v binárnom tvare, ktoré predstavuje jedinečný identifikátor každého Slave zariadenia. Dve zariadenia by nemali mať tú istú adresu v jednej I2C zbernici.&lt;br /&gt;
* '''RW''' - jeden bit, ktorý určuje či sa vykonáva operácia zápisu alebo čítania:&lt;br /&gt;
** Ak RW = 0, zápis údajov na Slave zariadenie.&lt;br /&gt;
** Ak RW = 1, čítanie údajov zo Slave zariadenia.&lt;br /&gt;
* '''ACK/NACK''' nasleduje za každým rámcom v správe. Je to bit potvrdenia/nepotvrdenia:&lt;br /&gt;
** Ak bol úspešne prijatý adresný alebo dátový rámec, prijímajúce zariadenie vráti odosielateľovi log. 0 (ACK - Acknowledged).  &lt;br /&gt;
** Ak nastala chyba v prenose, prijímajúce zariadenie vráti odosielateľovi log. 1 (NACK - Not Acknowledged).&lt;br /&gt;
Existuje niekoľko situácií, ktoré vedú k vytvoreniu NACK:&lt;br /&gt;
** Prijímač vykonáva nejakú funkciu v reálnom čase a nie je pripravený začať komunikáciu s Masterom.&lt;br /&gt;
** Prijímač odbrží neznáme údaje alebo príkazy.&lt;br /&gt;
** Počas prenosu prijímač nemôže prijímať ďalšie dátové bajty.&lt;br /&gt;
** Master ukončí čítanie údajov a oznámi to Slave zariadeniu pomocou NACK. &lt;br /&gt;
&lt;br /&gt;
* '''DATA''' - Dátový rámec je vždy dlhý 8 bitov a posiela sa s najvýznamnejším bitom (MSB) ako prvým. Za každým dátovým rámcom bezprostredne nasleduje bit ACK/NACK na overenie, či bol rámec úspešne prijatý. Pred odoslaním ďalšieho dátového rámca musí bit ACK prijať buď master, alebo slave (v závislosti od toho, kto dáta odosiela).&lt;br /&gt;
* '''STOP''' - ukončovacia podmienka štart signalizuje koniec komunikácie. Linka SDA sa prepne z nízkej (log. 0) na vysokú hodnotu (log. 1) ''potom'', čo sa linka SCL prepne z nízkej úrovne na vysokú &amp;lt;ref&amp;gt;Scott Campbell. BASICS OF THE I2C COMMUNICATION PROTOCOL. https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Sal Afzal. I2C Primer: What is I2C? (Part 1). https://www.analog.com/en/technical-articles/i2c-primer-what-is-i2c-part-1.html.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Na Obr.3 je vyobrazený časový diagram zápisu a čítania údajov s veľkosťou 2B prostredníctvom rozhrania I2C. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_3_casovyDiagram.png|náhľad|Obr. 3. Časový priebeh zápisu a čítania údajov v I2C rozhraní]]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
===Modifikácia I2C protokolu pre displeje===&lt;br /&gt;
&lt;br /&gt;
Pri displejoch treba v prenášanej správe obsiahnuť aj informáciu o tom či sa posiela príkaz alebo dáta. Preto je do správy pridaný 8-bitový DC rámec, ktorý nasleduje vždy za rámcom adresy. DC rámec obvykle nadobúda hodnoty 0 pre príkaz a 64 pre dáta, avšak toto pravidlo nie je pevne dané. Po odoslaní DC rámca sa odošle N rámcov dát (Obr.~4).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:MCU_I2C_4_displeje.png|náhľad|Obr. 4. Štruktúra displejovej správy cez I2C rozhranie]]&lt;br /&gt;
&lt;br /&gt;
== Zdroje a aOdkazy ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13245</id>
		<title>Šablóna:MCU ARM Obsah</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:MCU_ARM_Obsah&amp;diff=13245"/>
		<updated>2023-03-21T19:49:51Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Vytvorená stránka „__NOTOC__ &amp;lt;div style=&amp;quot;background:none repeat scroll 0 0 white;border:2px solid green; float:right;margin-left:1em; padding:0.3em; position:relative; width:300px; backgro…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:none repeat scroll 0 0 white;border:2px solid green; float:right;margin-left:1em; padding:0.3em; position:relative; width:300px; background-color:rgb(240,255,190); padding-left:5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Mikrokontroléry ARM]]&lt;br /&gt;
----&lt;br /&gt;
Architektúra ARM mikrokotnrolérov&lt;br /&gt;
&lt;br /&gt;
Vstupno/výstupné piny&lt;br /&gt;
&lt;br /&gt;
Rozhranie UART&lt;br /&gt;
&lt;br /&gt;
[[MCU_ARM/I2C|Rozhranie I2C]]&lt;br /&gt;
&lt;br /&gt;
Rozhranie SPI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Kategória:Pri tlačení vynechať]]&lt;br /&gt;
[[Kategória:MCU ARM]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Mikrokontrol%C3%A9ry_ARM&amp;diff=13244</id>
		<title>Mikrokontroléry ARM</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Mikrokontrol%C3%A9ry_ARM&amp;diff=13244"/>
		<updated>2023-03-21T19:46:11Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Vytvorená stránka „== Obsah ==  * Architektúra ARM mikrokotnrolérov * Vstupno/výstupné piny * rozhranie UART * rozhranie I2C * rozhranie SPI“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obsah ==&lt;br /&gt;
&lt;br /&gt;
* Architektúra ARM mikrokotnrolérov&lt;br /&gt;
* Vstupno/výstupné piny&lt;br /&gt;
* rozhranie UART&lt;br /&gt;
* [[MCU_ARM/I2C|rozhranie I2C]]&lt;br /&gt;
* rozhranie SPI&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Podklady_k_predn%C3%A1%C5%A1kam_a_cvi%C4%8Deniam&amp;diff=13243</id>
		<title>Podklady k prednáškam a cvičeniam</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Podklady_k_predn%C3%A1%C5%A1kam_a_cvi%C4%8Deniam&amp;diff=13243"/>
		<updated>2023-03-21T19:44:45Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
== Teoretická informatika a matematika==&lt;br /&gt;
* [[Základy informatiky - jazyk C]]&lt;br /&gt;
* [[Algoritmy a programovanie]]&lt;br /&gt;
* [[Databázové systémy]]&lt;br /&gt;
* [[Softvérové inžinierstvo]]&lt;br /&gt;
* [[Spolupráca počítača s prostredím]]&lt;br /&gt;
* [[Základy informatiky - jazyk Java]]&lt;br /&gt;
* [[Základy informatiky - jazyk Python]]&lt;br /&gt;
* [[Webovské technológie]]&lt;br /&gt;
----&lt;br /&gt;
*[[Numerická matematika]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
==Aplikovaná informatika==&lt;br /&gt;
* [[Mikrokontroléry ARM]]&lt;br /&gt;
* [[Konfigurovateľné mikroprocesorové systémy]]&lt;br /&gt;
* [[Logické a číslicové systémy ]]&lt;br /&gt;
* [[Simulácie a modelovanie | Simulácie a modelovanie pre elektroniku a elektrotechniku ]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
== Mechatronika ==&lt;br /&gt;
* [[Prevodníky]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
== Kvalita==&lt;br /&gt;
* [[Bezpečnosť technických systémov]]&lt;br /&gt;
* [[Kolokviálna skúška]]&lt;br /&gt;
* [[Softvérové systémy v manažérstve kvality]] (CAQ)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Podklady_k_predn%C3%A1%C5%A1kam_a_cvi%C4%8Deniam&amp;diff=13242</id>
		<title>Podklady k prednáškam a cvičeniam</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Podklady_k_predn%C3%A1%C5%A1kam_a_cvi%C4%8Deniam&amp;diff=13242"/>
		<updated>2023-03-21T19:35:17Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
== Teoretická informatika a matematika==&lt;br /&gt;
* [[Základy informatiky - jazyk C]]&lt;br /&gt;
* [[Algoritmy a programovanie]]&lt;br /&gt;
* [[Databázové systémy]]&lt;br /&gt;
* [[Softvérové inžinierstvo]]&lt;br /&gt;
* [[Spolupráca počítača s prostredím]]&lt;br /&gt;
* [[Základy informatiky - jazyk Java]]&lt;br /&gt;
* [[Základy informatiky - jazyk Python]]&lt;br /&gt;
* [[Webovské technológie]]&lt;br /&gt;
----&lt;br /&gt;
*[[Numerická matematika]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
==Aplikovaná informatika==&lt;br /&gt;
* [[Mikrokontroléry prakticky]]&lt;br /&gt;
* [[Konfigurovateľné mikroprocesorové systémy]]&lt;br /&gt;
* [[Logické a číslicové systémy ]]&lt;br /&gt;
* [[Simulácie a modelovanie | Simulácie a modelovanie pre elektroniku a elektrotechniku ]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
== Mechatronika ==&lt;br /&gt;
* [[Prevodníky]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
== Kvalita==&lt;br /&gt;
* [[Bezpečnosť technických systémov]]&lt;br /&gt;
* [[Kolokviálna skúška]]&lt;br /&gt;
* [[Softvérové systémy v manažérstve kvality]] (CAQ)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Podklady_k_predn%C3%A1%C5%A1kam_a_cvi%C4%8Deniam&amp;diff=13241</id>
		<title>Podklady k prednáškam a cvičeniam</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Podklady_k_predn%C3%A1%C5%A1kam_a_cvi%C4%8Deniam&amp;diff=13241"/>
		<updated>2023-03-21T19:03:04Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
== Teoretická informatika a matematika==&lt;br /&gt;
* [[Základy informatiky - jazyk C]]&lt;br /&gt;
* [[Algoritmy a programovanie]]&lt;br /&gt;
* [[Databázové systémy]]&lt;br /&gt;
* [[Expertné systémy]]&lt;br /&gt;
* [[Softvérové inžinierstvo]]&lt;br /&gt;
* [[Spolupráca počítača s prostredím]]&lt;br /&gt;
* [[Základy informatiky - jazyk Java]]&lt;br /&gt;
* [[Základy informatiky - jazyk Python]]&lt;br /&gt;
* [[Webovské technológie]]&lt;br /&gt;
----&lt;br /&gt;
*[[Numerická matematika]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
==Aplikovaná informatika==&lt;br /&gt;
* [[Mikrokontroléry prakticky]]&lt;br /&gt;
* [[Konfigurovateľné mikroprocesorové systémy]]&lt;br /&gt;
* [[Logické a číslicové systémy ]]&lt;br /&gt;
* [[Simulácie a modelovanie | Simulácie a modelovanie pre elektroniku a elektrotechniku ]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
== Mechatronika ==&lt;br /&gt;
* [[Prevodníky]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:500px; padding:15px; text-align:left;border: 2px solid orange;border-radius: 15px; -moz-border-radius:15px;float:left;margin:16px&amp;quot; &amp;gt;&lt;br /&gt;
== Kvalita==&lt;br /&gt;
* [[Bezpečnosť technických systémov]]&lt;br /&gt;
* [[Kolokviálna skúška]]&lt;br /&gt;
* [[Softvérové systémy v manažérstve kvality]] (CAQ)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Z%C3%A1klady_informatiky_-_jazyk_C&amp;diff=13240</id>
		<title>Základy informatiky - jazyk C</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Z%C3%A1klady_informatiky_-_jazyk_C&amp;diff=13240"/>
		<updated>2023-02-06T13:41:54Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Teoretická informatika]]&lt;br /&gt;
[[Kategória:Základy informatiky]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Názov=Základy informatiky&lt;br /&gt;
Forma=Podklady k prednáškam a cvičeniam&lt;br /&gt;
Abstrakt= Podklady pre kurz programovania v jazyku C, časť 1: základy jazyka.&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Skripta_ZI}}&lt;br /&gt;
{{Priklady_ZI}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Referenčný manuál: C standard library=&lt;br /&gt;
{{Funkcie jazyka c}}&lt;br /&gt;
&lt;br /&gt;
==Referencie==&lt;br /&gt;
* Pavel Herout: Učebnice jazyka C, Kopp, EAN 9788072323838 &lt;br /&gt;
* Mike Banahan, Declan Brady and Mark Doran: The C Book, Addison Wesley in 1991, http://publications.gbdirect.co.uk/c_book/&lt;br /&gt;
* Ďuďák J.: Zbierka úloh z algoritmizácie pre predmet Základy informatiky, Fakulta mechatroniky, TnU AD, ISBN 978-80-8075-199-9&lt;br /&gt;
* Úvod do programovania v jazyku C - http://people.tuke.sk/igor.podlubny/C/index.htm&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:Skripta_ZI&amp;diff=13239</id>
		<title>Šablóna:Skripta ZI</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0abl%C3%B3na:Skripta_ZI&amp;diff=13239"/>
		<updated>2023-02-06T13:41:13Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot; style=&amp;quot;width:250px;background-color:rgb(255,240,190);padding-left:5px;border:2px solid rgb(246,188,40)&amp;quot;&amp;gt;&lt;br /&gt;
[[Základy informatiky - jazyk C]]&lt;br /&gt;
----&lt;br /&gt;
====Učebné texty====&lt;br /&gt;
[[Booleova algebra]]&lt;br /&gt;
&lt;br /&gt;
[[Algoritmus]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - štruktúra kódu|Štruktúra kódu]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - príkazy preprocesora|Príkazy preprocesora]] &lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - dátové typy, premenné|Dátové typy, premenné]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - operátory|Operátory]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - vstupno/výstupné operácie|Vstupno/výstupné operácie]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - podmienky|Podmienky]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - cykly|Cykly]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - polia|Polia]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - reťazce|Reťazce]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - funkcie|Funkcie]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - súbory|Súbory]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - štruktúry|Štruktúry]]&lt;br /&gt;
&lt;br /&gt;
[[Jazyk C - smerník (pointer)|Smerník (pointer)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Kategória:Pri tlačení vynechať]]&lt;br /&gt;
[[Kategória:Základy informatiky]]&lt;br /&gt;
[[Kategória:Študijné materiály]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Algoritmus&amp;diff=13238</id>
		<title>Algoritmus</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Algoritmus&amp;diff=13238"/>
		<updated>2022-09-19T20:54:53Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Skripta_ZI}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==&amp;lt;big&amp;gt;Algoritmus&amp;lt;/big&amp;gt;==&lt;br /&gt;
'''Algoritmus''' znamená proces alebo súbor pravidiel ktoré sa majú dodržiavať pri operáciach alebo riešení problémov. Algoritmus sa preto týka súboru pravidiel,pokynov ktoré postupne definujú, ako sa má práca vykonať, aby sa dosiahli očakávané výsledky.&amp;lt;ref&amp;gt;&amp;gt;https://www.geeksforgeeks.org/introduction-to-algorithms/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Práca počítača je presne determinovaná. Počítač je absolútne neiniciatívny a všetko, čo chceme, aby urobil mu musíme nariadiť. Prácu počítaču nariaďujeme programom. K tomu aby sme mohli program zostaviť potrebujeme vytvoriť postupnosť krokov, ktorá v každom okamihu určuje ako postupovať ďalej, tzv. algoritmus. Jedna z definícií algoritmu hovorí, že algoritmus je presný popis definujúci výpočtový proces, vedúci od meniteľných vstupných údajov až k žiadaným výsledkom. Táto definícia síce presne vystihuje podstatu a účel algoritmu, je však úzko špecializovaná Obmedzuje sa len na výpočtový proces. Algoritmy však nepoužívame len pri počítačoch pri príprave programov, ale ich použitie je všeobecné. Pomocou algoritmu totiž môžeme presne definovať akýkoľvek determinovaný proces. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Univerzalny algoritmus.png|none|240px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Navrhnutý algoritmus je nezávislý od jazyka, tzn. že ide iba o jednoduché pokyny, ktoré je možné implementovať v akomkoľvek jazyku, a napriek tomu bude výstup rovnaký, ako sa očakávalo.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;Vlasnosti algoritmu&amp;lt;/big&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===Hlavné vlasnosti algoritmu===&lt;br /&gt;
;Jasný a jednoznačný: Každý krok algoritmu musí byť presne definovaný a nesmie dovoľovať viacej výkladov, teda nesmie pripúšťať pochybnosť o tom, ako postupovať ďalej - t. j. ako jednotlivé kroky nasledujú po sebe,&lt;br /&gt;
&lt;br /&gt;
;Všeobecnosť: Algoritmus musí vyhovovať riešeniu všeobecnej skupiny úloh. Algoritmus musí vychádzať s meniteľných vstupných údajov, t. j. musí to byť popis riešenia nie len jednej úlohy, ale celej skupiny príbuzných úloh líšiacich sa od seba len vstupnými údajmi, &amp;lt;ref&amp;gt;https://spseke.sk/tutor/projekt/algoritmy.htm&amp;lt;/ref&amp;gt;. Ako príklad môžeme uviesť riešenie kvadratickej rovnice, kde menitenými vstupnými údajmi sú koeficienty a,b,c a skupina úloh toho istého typu je množina všetkých kvadratických rovníc, kde a,b,c patria do R.&lt;br /&gt;
&lt;br /&gt;
;Rezultatívnosť: Algoritmus musí vždy vyústiť do nejakého riešenia a to po konečnom počte krokov. Podotknime, že výsledok algoritmu môže byť aj &amp;quot;neviem&amp;quot; alebo &amp;quot;riešenie neexistuje&amp;quot;, čo sa dá považovať správny výsledok.&lt;br /&gt;
&lt;br /&gt;
;Konečnosť: Počet opakovaní každého kroku je konečný&lt;br /&gt;
&lt;br /&gt;
;Elementárnosť: Algoritmus pozostáva z konečného počtu elementárnych krokov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Doplnkové vlasnosti alogritmu===&lt;br /&gt;
&lt;br /&gt;
;Zrozumiteľnosť:  Použitie takých prostriedkov na zápis algoritmu, ktoré by mali byť zrozumiteľné rôznym pracovníkom, ktorí budú s algoritmom pracovať (analytik, programátor, používateľ, oponent...).&lt;br /&gt;
&lt;br /&gt;
;Správnosť: Algoritmus musí úplne a správne riešiť danú úlohu.&lt;br /&gt;
&lt;br /&gt;
;Efektívnosť:  Algoritmus má byť čo najvýhodnejší (najefektívnejší). Zmyslom efektívnosti je minimalizovať nároky na spracovanie činnosti podľa algoritmu. Efektívnosť môžeme posudzovať z rôznych hľadísk (výpočtový čas a kapacita pamätí počítača, minimalizácia finančných nárokov, minimalizácia spotreby energie, minimalizácia nárokov na personálne alebo materiálne vybavenie, minimalizácia dopadov na životné prostredie a pod.), prípadne sa snažíme optimalizovať vzájomný vzťah viacerých hľadísk. Táto požiadavka je často v rozpore s požiadavkou na štruktúrovanosť (prehľadnosť, modulárnosť, usporiadanosť) algoritmu.&lt;br /&gt;
&lt;br /&gt;
;Modifikovateľnosť:  Algoritmus by mal byť vytvorený tak, aby sa dal ľahko modifikovať pri potrebnej zmene vyvolanej zmenou podmienok riešenia (vonkajších a vnútorných).&lt;br /&gt;
&lt;br /&gt;
;Štruktúrovanosť:  Požiadavka na vnútornú štruktúru algoritmu, ktorý by mal byť rozdelený na relatívne samostatné, ale logicky nadväzujúce celky, ktoré riešia vždy príslušnú časť algoritmu, požiadavka súvisí so zrozumiteľnosťou a modifikovateľnosťou, dobre štruktúrovaný algoritmus je zrozumiteľný a ľahko modifikovateľný (opraviteľný).&lt;br /&gt;
&lt;br /&gt;
==Riešenie problému pomocou algorimtu==&lt;br /&gt;
'''1.''' Problém, ktorý má tento algoritmus vyriešiť.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Obmedzenia problému, ktoré je potrebné zohľadniť pri jeho riešení.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Vstup, ktorý sa má prijať na vyriešenie problému.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Výstup, ktorý možno očakávať, keď sa problém vyrieši.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Riešenie tohto problému v daných obmedzeniach.&amp;lt;ref&amp;gt;https://www.geeksforgeeks.org/introduction-to-algorithms/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Značky vývojových diagramov==&lt;br /&gt;
[[Súbor:začiatok.png|100px|none]] Značka sa využíva na začatie alebo ukončenie vývojového diagramu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Untitled Diagram.png|100px|none]] Výkonný blok na program&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vstuo.png|100px|none]] Služi na zápis vstup a výstupov vývojoveého diagramu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Untitled Diagram (3).png|160px|none]] Rozhodovací blok s jedným vstupom a viacerými výstupmi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Spojka.png|none|30px]]  Spojka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Spojnica.png|none|160px]]  Spojnica&lt;br /&gt;
&lt;br /&gt;
==Príklady==&lt;br /&gt;
'''Príklady''' na tvorbu vývojových diagramov nájdete v sekcií:&lt;br /&gt;
[http://www.kiwiki.info/index.php/Jazyk_C_(príklady)_-_Algoritmy[Príklady algoritmus]]&lt;br /&gt;
&lt;br /&gt;
=Referencie=&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=12911</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=12911"/>
		<updated>2021-03-21T19:56:30Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Vytvorená stránka „Kategória:Algoritmy triedenia {{Draft}} {{Skripta programovanie}} __TOC__“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Jazyk_C_(pr%C3%ADklady)_-_Algoritmy&amp;diff=12910</id>
		<title>Jazyk C (príklady) - Algoritmy</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Jazyk_C_(pr%C3%ADklady)_-_Algoritmy&amp;diff=12910"/>
		<updated>2021-03-06T18:15:26Z</updated>

		<summary type="html">&lt;p&gt;Juraj: /* Kvadratická rovnica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Priklady_ZI}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Obsah==&lt;br /&gt;
V tejto kapitole budú ukázaná tvorba jednoduchých vývojových diagramov. Budú ukázané základné prvky algoritmizácie úloh, použitie rozhodovania, opakovania istého počtu operácií. K zvládnutiu tejto kapitoly sa predpokladá znalosť grafických značiek použitých pri tvorbe vývojových diagramov.&lt;br /&gt;
&lt;br /&gt;
===Grafické značky vývojových diagramov===&lt;br /&gt;
&lt;br /&gt;
Medzi základné stavebné bloky vývojových diagramov (VD)  patria bloky, ktoré reprezentujú&lt;br /&gt;
&lt;br /&gt;
*začiatok / koniec VD&lt;br /&gt;
*vykonávací blok&lt;br /&gt;
*rozhodovací blok&lt;br /&gt;
*spojka&lt;br /&gt;
*vstup / výstup dát&lt;br /&gt;
*orientované spojnice blokov&lt;br /&gt;
[http://www.kiwiki.info/index.php/Algoritmus[Vývojové stavebné bloky]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Príklady==&lt;br /&gt;
&lt;br /&gt;
===Absolútna hodnota===&lt;br /&gt;
;Zadanie: Vieme, že absolútna hodnota je definovaná ako vzdialenosť čísla od začiatku súradnicového systému (resp. od nuly). Nakreslite vývojový diagram, ktorý by znázorňoval výpočet absolútnej hodnoty.&lt;br /&gt;
&lt;br /&gt;
;Analýza problému: Pre absolútnu hodnotu reálnych čísel platí:&lt;br /&gt;
* abs(x) = x&lt;br /&gt;
* abs(-x) = x&lt;br /&gt;
Inak povedané, pre x&amp;gt;=0, je absolútna hodnota x rovná práve x, pre x&amp;lt;0 je absolútna hodnota x rovná -1*x. &lt;br /&gt;
Teda, stačí nám zistiť, či je x menšie ako nula.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:78 2 alg1.png|240px|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Kvadratická rovnica===&lt;br /&gt;
;Zadanie: Navrhnite algoritmus výpočtu koreňov kvadratickej rovnice ax2+bx+c=0. Vstupom do algoritmu budú koeficienty a, b, c, a výstupom budú korene kvadratickej rovnice x1,2.&lt;br /&gt;
&lt;br /&gt;
;Analýza problému: Riešenie tejto rovnice je známe, úlohou je tento problém znázorniť v podobe vývojového diagramu. Vieme, že kvadratická rovnica má dva korene (x1 a x2). Tieto korene môžu byť rôzne, alebo riešením je jeden dvojnásobný koreň. Toto zistíme pomocou výpočtu diskriminantu kvadratickej rovnice. Diskriminant je definovaný ako D=b2-4ac&lt;br /&gt;
Rozoberme si jednotlivé prípady riešenia.&lt;br /&gt;
*D&amp;gt;0 : Rovnica má dva korene: x1=(-b+D1/2)/2a, x2=(-b-D1/2)/2a&lt;br /&gt;
*D=0 : Rovnica má jeden dvojnásobný koreň: x1,2=-b/2a&lt;br /&gt;
*D&amp;lt;0 : Rovnica má riešenie na množine komplexných čísel:&lt;br /&gt;
Vieme, že i2=-1. (i je komplexná jednotka). Potom výpočet druhej odmocniny diskriminantu je (D)1/2=(i2 * (-D))1/2=i*(-D) ½ (poznámka: D&amp;lt;0). Teda korene kvadratickej rovnice budú x1=(-b+iD1/2)/2a, x2=(-b-iD1/2)/2a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:80 2 alg2.png|480px|none]]&lt;br /&gt;
&lt;br /&gt;
===Maximum z 3 hodnôt===&lt;br /&gt;
;Zadanie: V predajni skrípt majú 3 skriptá, o ktoré máme záujem. Cena skrípt je a, b, c Sk. Navrhnite algoritmus, ktorý nájde najdrahšie skriptá; teda skriptá s maximálnou cenou.&lt;br /&gt;
&lt;br /&gt;
;Analýza problému: V prípade, ak máme zistiť maximálnu (alebo minimálnu) hodnotu z troch čísel, musíme každé číslo porovnať s každým iným číslom. Teda, spolu budeme robiť 3 porovnania (a&amp;lt;-&amp;gt;b, a&amp;lt;-&amp;gt;c, b&amp;lt;-&amp;gt;c). Nemá zmysel porovnávať ab a ba, lebo toto sú totožné porovnania. Ak teda máme zistiť najväčšie číslo z a, b, c, môžeme postupovať napríklad nasledovne: Najskôr porovnáme : a&amp;gt;b. Ak toto platí, potom porovnáme a&amp;gt;c. V prípade ak aj toto platí, tak maximum je a. Keby platilo že: a&amp;gt;b a c&amp;gt;a, potom vieme, že maximum je c. Takto by sme mohli pokračovať ďalej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:82 2 alg3.png|360px|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Opakované načítanie===&lt;br /&gt;
&lt;br /&gt;
;Zadanie: Na faktúre je údaj o počte položiek a samotné položky (položka obsahuje o.i. aj cenu v Sk). Ak viete koľko je na faktúre položiek, navrhnite algoritmus, ktorý vypočíta celkovú sumu položiek faktúry. Prvý vstupný údaj bude číslo pocet, ktoré nám hovorí o počte nasledujúcich položiek. Následne sa načíta pocet položiek ( – celých čísel symbolizujúcim cenu položky). Navrhnite algoritmus, ktorý vypočíta výslednú sumu ceny všetkých položiek.&lt;br /&gt;
&lt;br /&gt;
;Analýza problému: V tomto prípade nikdy popredu nevieme, koľko budeme načítavať položiek. Tento údaj sa dozvieme až v momente, keď načítame prvý údaj. Úlohou bude teda navrhnúť algoritmus, ktorý by načítal požadovaný počet položiek (počet položiek môže byť od 0 až po ľubovoľne veľké konečné číslo). Na riešenie tohto problému využijeme cyklus. Tento cyklus sa bude opakovať toľkokrát, koľko položiek máme načítať. Pri každom opakovaní cyklu načítame jednu položku (položku označme ako premennú a) a jej hodnotu pripočítame k výslednej sume. Ďalším algoritmickým problémom je zabezpečiť, aby sa tento cyklus vykonával presne pocet krát. Tu využijeme prvý vstupný údaj pocet. Pri každej iterácii (opakovaní) cyklu sa hodnota premennej pocet zníži o 1. Cyklus budeme opakovať dovtedy, pokiaľ bude premenná pocet rôzna od nuly. Na výpočet súčtu všetkých položiek využijeme premennú suma, ktorú na začiatku vynulujeme (priradíme jej hodnotu 0).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:84 2 alg4.png|360px|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Násobenie===&lt;br /&gt;
&lt;br /&gt;
;Zadanie: V počítačoch (na hardvérovej úrovni) sa operácia násobenia vykoná pomocou opakovaného sčítavania dvoch hodnôt. Vytvorte algoritmus, ktorý by násobil dve celé čísla pomocou opakovaného sčítavania.&lt;br /&gt;
&lt;br /&gt;
;Analýza problému: Na riešenie problému nemôžeme použiť operáciu násobenia (*), musíme použiť operáciu sčítavania (+). Zoberme si príklad: x=5*3. Tu budeme 3 krát pripočítame hodnotu 5 do premennej x, ktorú musíme najskôr vynulovať. Teda x=5+5+5=15. Vo všeobecnosti máme x=a*b=a+a+...+a : sčítavanie robíme b krát. Z uvedeného vyplýva, že nemôžeme pevne napísať, koľkokrát sa a pripočíta do premennej x. Tu bude vhodné využiť nejaký cyklus. V každom cykle sa do premennej x pripočíta hodnota a. Počet opakovaní cyklu je b. V každej iterácii cyklu hodnotu premennej b znížime o 1. Cyklus ukončíme, ak sa b=0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:86 2 alg5.png|300px|none]]&lt;br /&gt;
&lt;br /&gt;
===Prvočíslo===&lt;br /&gt;
;Zadanie: Navrhnite algoritmus, ktorý zistí, či zadané číslo a je prvočíslo.&lt;br /&gt;
&lt;br /&gt;
;Analýza problému: Prvočíslo je číslo, ktoré je delitelné iba číslom 1 a sebou samým. Pri testovaní čísla a na prvočíselnosť postupne celočíselne deliť číslo a číslami del=2, 3, ...n. Ak pri všetkých deleniach bude nejaký zvyšok (a sa nedá deliť číslom del), povieme že číslo a je prvočíslo. Ak v priebehu delenia zistíme, že a je delitené číslom del bezo zvyšku, algoritmus ukončíme, a povieme že a nie je prvočíslo. Ďalší problém je určiť, dokedy má zmysel zväčšovať deliteľ del. V predchádzajúcom texte sme del zvyšovali po hodnotu n. Úlohou je odhadnúť vhodné n. Pokúsme sa postupovať nasledovne: ako prvý deliteľ je del=2. Teda delíme a číslom del=2. Výsledok po tomto delení označme podiel. Ak budeme premennú del zvyšovať, nebude mať zmysel zväčšovať ju nad hodnotu podiel=a/2, pretože číslo a nemôže deliť žiadne číslo, ktoré je väčšie ako a/2. Ďalej, nech del=3. Ak číslo del (del=3) nedelí číslo a, hranica delenia – n sa zníži na hodnotu a/3, pretože žiadne číslo väčšie ako a/3 nemôže deliť a bezo zvyšku. Z uvedeného nám vyplýva, že hranicu n môžeme určiť nasledovne: Pri každom delení si zapamätáme podiel. Ďalšie delenie robíme iba ak podiel&amp;gt;del. V algoritme použijeme ešte jednu premennú prvocislo. Táto premenná nám bude hovoriť, či je číslo prvočíslo alebo nie je. Na začiatku má hodnotu 1 – teda predpokladáme, že číslo je prvočíslo. V prípade, ak počas delenia zistíme, že nejaké číslo del delí a bezo zvyšku, premennej prvocislo priradíme hodnotu 0. Vyhlásime, že a nie je prvočíslo.&lt;br /&gt;
&lt;br /&gt;
; Ukážka:&lt;br /&gt;
*a=23&lt;br /&gt;
*a del podiel&lt;br /&gt;
*23 / 2 = 11 zv 1&lt;br /&gt;
*23 / 3 = 7 zv 2&lt;br /&gt;
*23 / 4 = 5 zv 3&lt;br /&gt;
*23 / 5 = 4 zv 3 del &amp;gt; podiel; koniec; a je prvočíslo, pretože ani jeden zvyšok po delení nebol 0&lt;br /&gt;
*23 je prvočíslo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:88 2 alg6.png|480px|none]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Jazyk_C_(pr%C3%ADklady)_-_Prv%C3%A9_programy&amp;diff=12909</id>
		<title>Jazyk C (príklady) - Prvé programy</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Jazyk_C_(pr%C3%ADklady)_-_Prv%C3%A9_programy&amp;diff=12909"/>
		<updated>2021-03-06T17:48:08Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Priklady_ZI}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Princípy tvorby programov==&lt;br /&gt;
V tejto kapitole je ukázaná práca s premnnými a s funkciami na formátovaný vstup a výstup textu.&lt;br /&gt;
Na porozumenie danej problematiky je potrebné zvládnuť deklaráciu a základné použitie premených. Pre prácu s funkciami vstupu/výstupu textu je potrebné zvládnuť syntax týchto funkcií.&lt;br /&gt;
Pri popise syntaxe funkcií sú niektoré časti uvádzané v hranatých zátvorkách [ ]. Takýto zápis znamená, že časť, ktorá je v hranatej zátvorke je nepovinná a teda sa môže vynechať.&lt;br /&gt;
==Priklady==&lt;br /&gt;
===Priklad č.1 - Obvod a obsah obdĺžnika===&lt;br /&gt;
;Zadanie: Vytvorte program, ktorý po zadaní strán obdĺžnika vypočíta jeho obvod a obsah.&lt;br /&gt;
&lt;br /&gt;
;Analýza problému: Označme si jednu stranu a a druhú stranu b. Pre jednoduchosť a názornosť budeme uvažovať celé čísla. Vzťah pre obvod obdĺžnka je o=2(a+b) a obsah S=ab. Tieto údaje sa následne vypíšu na monitor.&lt;br /&gt;
&lt;br /&gt;
'''Program:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int a,b;&lt;br /&gt;
    printf(&amp;quot;Zadaj dlzku stran obdlznika (a, b)&amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d %d&amp;quot;,&amp;amp;a,&amp;amp;b);&lt;br /&gt;
    int o,S;&lt;br /&gt;
    o=2*(a+b);&lt;br /&gt;
    S=a*b;&lt;br /&gt;
    printf(&amp;quot;Obvod= %d\nObsah= %d&amp;quot;,o,S);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Priklad č.2 - Obvod a obsah kruhu===&lt;br /&gt;
;Zadanie:Navrhnite program, ktorý po zadaní priemeru kruhu vypočíta jeho obvod a obsah.&lt;br /&gt;
&lt;br /&gt;
;Analýza problému: Obvod kruhu je definovaný ako o=2Πr, obsah ako S= Πr2. Keďže Π nemá celočíselnú hodnotu, ani obsah a obvod hruhu nebudú celočíselné hodnoty. Preto zvolíme premnné typu float (reálne čísla). V programe si zadefinujme ešte premennú pi (pi=3.14).&lt;br /&gt;
&lt;br /&gt;
'''Program:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    float r,pi=3.14;&lt;br /&gt;
    printf(&amp;quot;Zadaj polomer kruhu (r) &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%f&amp;quot;,&amp;amp;r);&lt;br /&gt;
    float o,S;&lt;br /&gt;
    o=2*pi*r;&lt;br /&gt;
    S=pi*r*r;&lt;br /&gt;
    printf(&amp;quot;Obvod= %f\nObsah= %f&amp;quot;,o,S);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Priklad č.3 - Operátory===&lt;br /&gt;
;Zadanie: Precvičiť si operátory jazyka C.&lt;br /&gt;
&lt;br /&gt;
;Analýza problému: Budeme pracovať s tromi premennými (int x=5, y=3; float z=3.0;). Okrem štandardných operátorov (+,-,*,/) ponznáme operátory &amp;amp;,|, ^,%,&amp;gt;&amp;gt;,&amp;lt;&amp;lt;.&lt;br /&gt;
&lt;br /&gt;
'''Význam operátorov'''&lt;br /&gt;
* x+y=8   // sčítanie&lt;br /&gt;
* x/y=1   // celočíselné delenie&lt;br /&gt;
* x / z=1.666666 // reálne delenie&lt;br /&gt;
* x &amp;amp; y=1 (lebo 101 &amp;amp; 011 = 001)   //bitový logický súčin AND&lt;br /&gt;
* x | y=7 (lebo 101 | 011 = 111)   //bitový logický súčet OR&lt;br /&gt;
* x ^ y=6 (lebo 101 ^ 011 = 110) // bitový exkluzívny logický súčet XOR&lt;br /&gt;
* x % y=2   //zvyšok po celočíselnom delení&lt;br /&gt;
* x&amp;gt;&amp;gt;2=1 (lebo 101 &amp;gt;&amp;gt; 2 = 001)  // bitový posun x doprava o 2 bity&lt;br /&gt;
* x&amp;lt;&amp;lt;3=40 (lebo 101 &amp;lt;&amp;lt; 3 = 101000) //bitový posun x doľava o 3 bity&lt;br /&gt;
&lt;br /&gt;
'''Program:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
    int x=5,y=3;&lt;br /&gt;
    float z=3.0;&lt;br /&gt;
    printf(&amp;quot;x+y=%d\n&amp;quot;,x+y);&lt;br /&gt;
    printf(&amp;quot;x/y=%d\n&amp;quot;,x/y);&lt;br /&gt;
    printf(&amp;quot;x/z=%f\n&amp;quot;,x/z);&lt;br /&gt;
    printf(&amp;quot;x&amp;amp;y=%d\n&amp;quot;,x&amp;amp;y);&lt;br /&gt;
    printf(&amp;quot;x|y=%d\n&amp;quot;,x|y);&lt;br /&gt;
    printf(&amp;quot;x^y=%d\n&amp;quot;,x^y);&lt;br /&gt;
    printf(&amp;quot;x%y=%d\n&amp;quot;,x%y);&lt;br /&gt;
    printf(&amp;quot;x&amp;gt;&amp;gt;2=%d\n&amp;quot;,x&amp;gt;&amp;gt;2);&lt;br /&gt;
    printf(&amp;quot;x&amp;lt;&amp;lt;3=%d\n&amp;quot;,x&amp;lt;&amp;lt;3);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Rekurzia_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=12908</id>
		<title>Rekurzia (riešené príklady)</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Rekurzia_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=12908"/>
		<updated>2021-02-21T19:20:11Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Draft}}&lt;br /&gt;
{{Skripta programovanie (zbierka úloh)}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Najväčší spoločný deliteľ==&lt;br /&gt;
'''Zadanie'''&lt;br /&gt;
Nájdite rekurzívny vzťah v Euklidovom algoritme pre výpočet najväčšieho spoločného deliteľa a využite ho vo funkcii, ktorá bude počítať najväčší spoločný deliteľ dvoch čísel, uvedených ako jej parametre. Funkciu použite v programe, ktorý načíta dve čísla a napíše hodnotu ich najväčšieho spoločného deliteľa.&lt;br /&gt;
&lt;br /&gt;
Poznámka: &lt;br /&gt;
V Euklidovom algoritme môžete namiesto klasického odpočítavania využiť zvyšok po delení, čo zníži počet krokov výpočtu a nebude potrebné sa zaoberať problémom „nesprávneho poradia“ čísel pri odpočítavaní.&lt;br /&gt;
&lt;br /&gt;
'''Vzorové príklady'''&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!vstup&lt;br /&gt;
!&lt;br /&gt;
!výstup&lt;br /&gt;
|-&lt;br /&gt;
|36 48&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|12&lt;br /&gt;
|-&lt;br /&gt;
|576 284&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|2553 7215&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|111&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Analýza riešenia'''&lt;br /&gt;
&lt;br /&gt;
Hľadaný rekurzívny vzťah je vidieť v postupe prevodu čísel postupným „modulovaním“ (operáciou modulo) – delenec a je nahradený deliteľom b, deliteľ b zase výsledkom a%b, ukončenie je pri nulovom b: &lt;br /&gt;
* NSD(a, b) = NSD(b, a%b) pre b&amp;gt;0, &lt;br /&gt;
* NSD(a, 0) = a&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int NSD(int a, int b)&lt;br /&gt;
{&lt;br /&gt;
   if (b == 0) return a;&lt;br /&gt;
   return NSD(b, a%b);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
   int a, b;&lt;br /&gt;
   cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;&lt;br /&gt;
   cout &amp;lt;&amp;lt; NSD(a, b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Fibonacciho postupnosť==&lt;br /&gt;
'''Zadanie'''&lt;br /&gt;
Pre Fibonacciho postupnosť platí, že hodnota ďalšieho jeho prvku je súčtom dvoch predchádzajúcich. Zostavte program, ktorý bude z klávesnice čítať čísla n, kým nenačíta nulu a pre každé číslo n vypíše n-té Fibonacciho číslo v poradí, za predpokladu, že Fib(0) = 0 a  Fib(1) = 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vzorové príklady'''&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!vstup&lt;br /&gt;
!&lt;br /&gt;
!výstup&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|34&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|6765 &lt;br /&gt;
|-&lt;br /&gt;
|40&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|102334155&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Analýza riešenia'''&lt;br /&gt;
&lt;br /&gt;
Fibonacciho postupnosť je rekurzívne definovaná ako:&lt;br /&gt;
* fib(0)=0&lt;br /&gt;
* fib(1)=1&lt;br /&gt;
* fib(i)=fib(i-1)+fib(i-2),  pre i&amp;lt;nowiki&amp;gt;&amp;gt;&amp;lt;/nowiki&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
Na tomto príklade je vhodné demonštrovať, čo sa stane, ak zabudneme v rekurzívnej funkcii uviesť podmienku pre ukončenie rekurzie – program havaruje kvôli pretečeniu zásobníka.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
long fib(int n)&lt;br /&gt;
{&lt;br /&gt;
  if (n &amp;lt; 2) return n;&lt;br /&gt;
  else return fib(n-1) + fib(n-2);&lt;br /&gt;
}&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
   int n;&lt;br /&gt;
   cin &amp;gt;&amp;gt; n;&lt;br /&gt;
   while (n)&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; fib(n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
      cin &amp;gt;&amp;gt; n;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Prevod čísel z 10-vej sústavy==&lt;br /&gt;
'''Zadanie'''&lt;br /&gt;
&lt;br /&gt;
Zostavte program, ktorý bude prevádzať prirodzené čísla do ľubovoľných číselných sústav so základom Z&amp;lt;10, využitím rekurzívnej funkcie. Túto funkciu postupne zdokonaľujte:&lt;br /&gt;
#Funkciu vylepšite, aby vedela prevádzať aj do sústav so základom Z&amp;lt;=16.&lt;br /&gt;
#Upravte funkciu tak, aby vedela prevádzať všetky celé čísla (čiže aj záporné a nulu).&lt;br /&gt;
#Pokúste sa funkciu obohatiť o prevod reálnych čísel (čiže aj desatinných).&lt;br /&gt;
V programe načítajte 2 vstupné údaje: číslo N v 10-vej sústave a základ novej sústavy z.&lt;br /&gt;
&lt;br /&gt;
'''Vzorové príklady'''&lt;br /&gt;
{|class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
!vstup&lt;br /&gt;
!výstup&lt;br /&gt;
|-&lt;br /&gt;
|80 2 &lt;br /&gt;
|1010000&lt;br /&gt;
|-&lt;br /&gt;
|93 16&lt;br /&gt;
|5D&lt;br /&gt;
|-&lt;br /&gt;
|0 8&lt;br /&gt;
|0 &lt;br /&gt;
|-&lt;br /&gt;
| -74 4&lt;br /&gt;
| -1022&lt;br /&gt;
|-&lt;br /&gt;
|3.141592654 16&lt;br /&gt;
|3.243F6A8A48AA&lt;br /&gt;
|-&lt;br /&gt;
| -0.1 2&lt;br /&gt;
| -0.0001100110011001100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Je vhodné začať jednoduchou funkciou na prevod prirodzeného čísla. Ak máme základ cieľovej sústavy z&amp;lt;10, môžeme problém vyjadriť aj rekurentným vzťahom v matematickom tvare: P(n, z) = P(n/z, z) * 10 + n%z (pre n &amp;gt; 0), a teda by bolo možné vytvoriť funkciu, ktorej návratovou hodnotou by bolo celé číslo.&lt;br /&gt;
&lt;br /&gt;
V prípade, že uvažujeme o vyššom základe, vo výsledku sa objavia aj symboly A, B, C, ...  funkcia by už musela výsledok vracať vo forme reťazca. Pre zjednodušenie nám stačí funkcia, ktorá bude výsledok priamo vypisovať. Je treba si uvedomiť, ako sa počíta prevod čísla – číslo vydelíme základom sústavy, tento podiel prevedieme a za ním bude nasledovať zvyšok po pôvodnom delení.&lt;br /&gt;
&lt;br /&gt;
Na vypísanie zvyšku pre vyššie sústavy by sme mohli pre zvyšky väčšie ako 9 použiť aj inkrementáciu znakového typu: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; char (‘A’ + n%z – 10);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keďže základ sústavy sa počas celého prevodu samozrejme nemení, nemá význam v každom volaní funkcie vytvárať jeho kópiu v podobe vstupnej premennej, ale stačí nám referencia (ušetrí sa pár bajtíkov pri každom vnorení).&lt;br /&gt;
&lt;br /&gt;
Ak chceme, aby funkcia dokázala prevádzať aj nulu a záporné čísla, musíme si pridať akúsi „úvodnú“ funkciu, ktorá ošetrí problematické situácie a až potom zavolá hlavnú rekurzívnu funkciu prevodu.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char znaky[] = &amp;quot;0123456789ABCDEF&amp;quot;;&lt;br /&gt;
void PrevodCele(int n, int &amp;amp;zaklad)&lt;br /&gt;
{&lt;br /&gt;
   if (n == 0) return;&lt;br /&gt;
   PrevodCele(n/zaklad, zaklad); // prevedie celu cast podielu&lt;br /&gt;
   cout &amp;lt;&amp;lt; znaky[n%zaklad]; // za tym napise zvysok&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void PrevodReal(double r, int &amp;amp;zaklad, int presnost)&lt;br /&gt;
{&lt;br /&gt;
   if (r == 0) return;&lt;br /&gt;
   r *= zaklad; // posunie o jeden rad vlavo&lt;br /&gt;
   cout &amp;lt;&amp;lt; znaky[int(r)]; // celu cast vypise&lt;br /&gt;
   PrevodReal(r - int(r), zaklad, presnost - 1); // zvysok prevedie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// uvodna funkcia na specialne pripady&lt;br /&gt;
void Prevod(double r, int zaklad, int presnost)&lt;br /&gt;
{&lt;br /&gt;
   // ak je zaporne&lt;br /&gt;
   if (r &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
      r = -r; cout &amp;lt;&amp;lt; '-';&lt;br /&gt;
   }&lt;br /&gt;
   // cela cast&lt;br /&gt;
   int n = int(r);&lt;br /&gt;
   if (n) &lt;br /&gt;
      PrevodCele(n, zaklad);&lt;br /&gt;
   else &lt;br /&gt;
      cout &amp;lt;&amp;lt; 0; // ak je nula, vypise ju&lt;br /&gt;
&lt;br /&gt;
   // desatinna cast (ak je)&lt;br /&gt;
   if (r -= n)&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; '.';&lt;br /&gt;
      PrevodReal(r, zaklad, presnost);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
   double r;&lt;br /&gt;
   int sustava;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;cislo v 10-kovej sustave: &amp;quot;; cin &amp;gt;&amp;gt; r;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;cielova sustava: &amp;quot;; cin &amp;gt;&amp;gt; sustava;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;prevedene: &amp;quot;;&lt;br /&gt;
   Prevod(r, sustava, 6);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prvočísla==&lt;br /&gt;
&lt;br /&gt;
'''Zadanie:'''&lt;br /&gt;
&lt;br /&gt;
Pomocou rekurzívneho riešenia vytvorte funkciu, ktorá otestuje, či je dané číslo prvočíslo.&lt;br /&gt;
===Prvé riešenie - neoptimalizované===&lt;br /&gt;
&lt;br /&gt;
'''Analýza riešenia:'''&lt;br /&gt;
&lt;br /&gt;
Testujeme číslo n na prvočíselnosť. Číslo n budeme postupne deliť číslami od 2 až po (n-1) aby sme zistili zvyšok po delení. Pri prvom zvyšku, ktorý je rovný 0 (teda číslo z delí číslo n bezo zvyšku) funkciu ukončíme a vrátime hodnotu 0 (n nie je prvočíslo). Ak je z&amp;lt;(n-1) tak funkciu is_prime1 voláme rekurzívne a v tomto volaní zvýšime parameter z o 1. (riadok č. 8). V prípade, že neplatí rovnosť z&amp;lt;(n-1) a ani jedno číslo z intervalu &amp;lt;2,n-1&amp;gt; nedelí číslo n bezo zvyšku, vrátime hodnotu 1 (n je prvočíslo).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int is_prime1(int n, int z=2)&lt;br /&gt;
{  &lt;br /&gt;
   if((n%z)==0)&lt;br /&gt;
      return 0;&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      if(z&amp;lt;(n-1))&lt;br /&gt;
         return is_prime1(n,z+1);&lt;br /&gt;
      else&lt;br /&gt;
         return 1;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Druhé riešenie - čiastočne optimalizované===&lt;br /&gt;
Optimalizácia v tomto prípade znamená eliminovať počet delení modulo. Myšlienka nájdenia hornej hranice hodnoty premennej ''z'' z predchádzajúceho príkladu:&lt;br /&gt;
*Číslo n delíme modulo hodnotou 2. (výsledok je rôzny od 0)&lt;br /&gt;
** nemá zmysel deliť číslom ''z'' väčším ako je n/2, pretože už nám nemôže vyjsť celočíselný podiel. Výsledok takéhoto delenia bude v intervale (0,1)&lt;br /&gt;
*Číslo n delíme modulo hodnotou 3. (výsledok je rôzny od 0)&lt;br /&gt;
** nemá zmysel deliť číslom ''z'' väčším ako je n/3, pretože už nám nemôže vyjsť celočíselný podiel. Výsledok takéhoto delenia bude v intervale &amp;lt;math&amp;gt;(1,2) \cup (2,3)&amp;lt;/math&amp;gt;. Podiel nebude mať hodnotu 2, pretože v tom prípade by bolo číslo n delitelné číslom 3 bezo zvyšku.&lt;br /&gt;
*Delitel n budeme zväčšovať až pokiaľ platí &amp;lt;math&amp;gt;\frac {n}{d}&amp;gt;d&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Horná hranica hodnoty d sa dá určiť nasledovne: &amp;lt;math&amp;gt;d=\sqrt{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int is_prime2(int n, int z=2)&lt;br /&gt;
{  &lt;br /&gt;
   if((n%z)==0)&lt;br /&gt;
      return 0;&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      if(z&amp;lt;sqrt(n))&lt;br /&gt;
         return is_prime2(n,z+1);&lt;br /&gt;
      else&lt;br /&gt;
         return 1;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tretie riešenie - viac optimalizované===&lt;br /&gt;
V predchádzajúcom príklade sme delili číslo n hodnotami premennej d. Premenná d mala prvú hodnotu 2 a potom sa k nej vždy pripočítala hodnota 1. Teda, číslo n sme postupne delili hodnotami &lt;br /&gt;
 2, 3, 4, 5, 6, 7, 8, ... &amp;lt;math&amp;gt;d=\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Všimnime si, že niektoré delenia sú opäť zbytočné: &lt;br /&gt;
*ak delíme číslom 2, potom nemá zmysel deliť žiadnym jeho násobkom&lt;br /&gt;
*vo všeobecnosti platí: ak delíme číslom ''j'', potom nemá zmysel deliť žiadnym násobkom čísla ''j''.&lt;br /&gt;
&lt;br /&gt;
Inak povedané, netreba deliť žiadnom zloženým číslom. Stačí deliť prvočíslami. A tu sa dostávame k rekurzívnej definícii prvočísel:&lt;br /&gt;
&lt;br /&gt;
'''Rekurzívna definícia prvočísla''':&lt;br /&gt;
* Číslo 2 je najmenšie prvočíslo.&lt;br /&gt;
* Prvočíslo je každé celé kladné číslo, ktoré nie je deliteľné žiadnym iným menším prvočíslom ako je toto číslo samotné.&lt;br /&gt;
&lt;br /&gt;
Pri takto stanovenej podmienke je komplikovanejšie vytvoriť podmienku, ktoré by toto spĺňala. Preto skúsme napísať program, ktorý by zbytočne nedelil násobkami čísel 2 a 3.&lt;br /&gt;
Ak nechceme deliť násobkami čísla 2, tak potom budeme postupne deliť premennú n hodnotami 3,5,7,9,11,...&lt;br /&gt;
&lt;br /&gt;
Ak nechceme deliť násobkami čísla 3, tak potom budeme postupne deliť premennú n hodnotami 4,5,7,8,10,11,13,14,...&lt;br /&gt;
&lt;br /&gt;
Prienikom týchto dvoch podmienok je, že nám zostava deliť číslami 5,7,11,13,17,19,23, ...&lt;br /&gt;
&lt;br /&gt;
V tejto postupnosti je jednoduché pravidlo: striedavé pripočítavanie hodnoty 2 a 4. Vyjadrené aritmetickou postupnosťou:&lt;br /&gt;
*&amp;lt;math&amp;gt;d_0=2&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;d_1=3&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;d_2=5&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;d_n=d_{n-1} + 3-(-1)^{i+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int is_prime3(int n, int z,int krok)&lt;br /&gt;
{ &lt;br /&gt;
   int d=z+3+krok;&lt;br /&gt;
   if((n%d)==0)&lt;br /&gt;
      return 0;&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      if(d&amp;lt;sqrt(n))&lt;br /&gt;
         return is_prime3(n,d,-krok);&lt;br /&gt;
      else&lt;br /&gt;
         return 1;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int is_prime(int n)&lt;br /&gt;
{&lt;br /&gt;
   if((n%2)==0) return 0;&lt;br /&gt;
   if((n%3)==0) return 0;&lt;br /&gt;
   if((n%5)==0) return 0;&lt;br /&gt;
   return is_prime3(n,5,-1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Rozbor zdrojového kódu:'''&lt;br /&gt;
&lt;br /&gt;
Pre hľadanie prvočísel použijeme funkciu is_prime, ktorá otestuje číslo n na deliteľnosť číslami 2, 3 a 5. Potom zavoláme pomocnú rekurzívnu funkciu is_prime3(int n, int z,int krok) ktorá bude testovať deliteľnosť čísla n prvkami postupnosti &amp;lt;math&amp;gt;\big\{d_n\big\}&amp;lt;/math&amp;gt;. Aby sme sa vyhli zbytočným podmienkam, ktoré môžu celý algoritmus spomaliť, definujeme tretí parameter funkcie is_prime3 ''krok''. Parameter krok je v našej postupnosti výraz &amp;lt;math&amp;gt; 3-(-1)^{i+1}&amp;lt;/math&amp;gt;, avšak tu nepočítame hodnotu mocniny &amp;lt;math&amp;gt;(-1)^{i+1}&amp;lt;/math&amp;gt; ale využívame skutočnosť že tento výraz nadobúda hodnoty -1,1,-1,1, ... .&lt;br /&gt;
&lt;br /&gt;
V premennej d je vypočítaná hodnota aktuálneho deliteľa podľa vzťahu: &amp;lt;math&amp;gt;d_n=d_{n-1} + 3-(-1)^{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Riešenie s globálnym poľom===&lt;br /&gt;
Pre zjednodušenie tvorby programu si vytvorme globálne pole do ktorého uložíme prvých n prvočísel. Potom najväčšie číslo, ktoré môžeme testovať na prvočíselnosť je &amp;lt;math&amp;gt;N=n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Analýza riešenia:'''&lt;br /&gt;
&lt;br /&gt;
Testujeme číslo n na prvočíselnosť. Ako prvé vypočítame zvyšok po delení prvým prvočíslom v poli ''pcisla'' (delíme číslom pcisla[0]=2). V prípade, ak je výsledok 0, tak výpočet ukončíme a vrátime hodnotu (0 - nie je prvočíslo). V opačnom prípade rekurzívne zavoláme funkciu jePrvocislo, kde druhý parameter (má význam indexu v poli ''pcisla'') zvýšime o 1. Teda v ďalšom volaní funkcie jePrvocislo už budeme deliť číslom pcisla[1]=3. Musíme však zabezpečiť, aby hodnota pcisla[i] v riadku č. 5 existovala. To zabezpečíme tak, že rekurzívne volanie dovolíme len ak je hodnota indexu i menšia ako počet hodnôt v pole pcisla.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int prvocisla[]={2,3,5,7,11,13,17,19,23,29,31,37};&lt;br /&gt;
&lt;br /&gt;
int is_prime4(int n, int i=0)&lt;br /&gt;
{ &lt;br /&gt;
  if(n%prvocisla[i]==0)&lt;br /&gt;
     return 0;&lt;br /&gt;
  if(i&amp;lt;223 &amp;amp;&amp;amp; n&amp;gt;pow(prvocisla[i],2))&lt;br /&gt;
     return is_prime4(n,i+1);&lt;br /&gt;
  else &lt;br /&gt;
     return 1;   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vzorové riešenie'''&lt;br /&gt;
&lt;br /&gt;
Uvádzame postupnosť volaní funkcie '''is_prime4(31)'''&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|+&lt;br /&gt;
!Vnorenie&lt;br /&gt;
!Volaná funkcia&lt;br /&gt;
!prvocisla[i]&lt;br /&gt;
!n%prvocisla[i]&lt;br /&gt;
!rekurzívne volanie&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|is_prime(31,0)&lt;br /&gt;
|2&lt;br /&gt;
|31%2=1&lt;br /&gt;
|is_prime(31,1)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|is_prime(31,1)&lt;br /&gt;
|3&lt;br /&gt;
|31%3=1&lt;br /&gt;
|is_prime(31,2)&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|is_prime(31,2)&lt;br /&gt;
|5&lt;br /&gt;
|31%5=1&lt;br /&gt;
|is_prime(31,3)&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|is_prime(31,3)&lt;br /&gt;
|7&lt;br /&gt;
|31%7=3&lt;br /&gt;
|is_prime(31,4)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| is_prime(31,4)&lt;br /&gt;
| 11&lt;br /&gt;
| n.a.&lt;br /&gt;
| neplatí podmienka n&amp;gt;prvocisla[i]^2&amp;lt;br/&amp;gt;n=31, i=4, prvocisla[i]=11&amp;lt;br/&amp;gt;funkcia vracia hodnotu '''1'''&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| návrat na is_prime(31,3)&lt;br /&gt;
| 7&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| návrat na is_prime(31,2)&lt;br /&gt;
| 5&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| návrat na is_prime(31,1)&lt;br /&gt;
| 3&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| návrat na is_prime(31,0)&lt;br /&gt;
| 2&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|}&lt;br /&gt;
====Porovnanie efektivity navrhovaných algoritmov====&lt;br /&gt;
Skôr ako budeme porovnávať ukázané algoritmy, poznamenajme, že tento spôsob zisťovania prvočíselnosti je pre veľké čísla veľmi neefektívny. Pri 8-cifernom čísle trvá výpočet funkcie is_prime približne 230 s. Pre zisťovanie prvočíselnosti existujú špeciálne algoritmy, napr. [http://en.wikipedia.org/wiki/AKS_primality_test ASK test], [http://en.wikipedia.org/wiki/Solovay%E2%80%93Strassen_primality_test Test Solovay-Strassena], [http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Test Millera-Rabina] a iné.&lt;br /&gt;
V nasledujúcej tabuľke a na obrázku sú výsledky porovnania efektívnosti týchto algoritmov pri hľadaní prvočísel na intervale (100,n) kde n sme menili od 50 000 do 2 000 000. V tabuľke ani v grafe nie je zahrnutá funkcia is_prime1, pretože pri n=100 000 pri rekurzívnom volaní funkcia neočakávane skončila.&lt;br /&gt;
Aby sme mohli porovnávať aj funkciu is_prime4, musíme do poľa ''prvocisla'' pridať všetky prvočísla, ktoré sú menšie ako &amp;lt;math&amp;gt;\sqrt{n_{max}}&amp;lt;/math&amp;gt;, kde n_max je v našom prípade 2 000 000. Pole ''prvocisla'' obsahuje prvých 233 prvočísel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int prvocisla[]={&lt;br /&gt;
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,&lt;br /&gt;
191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,&lt;br /&gt;
397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,&lt;br /&gt;
617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,&lt;br /&gt;
857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,&lt;br /&gt;
1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,&lt;br /&gt;
1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Naprogramované funkcie sme testovali nasledovne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   clock_t start, end;&lt;br /&gt;
   double elapsed;&lt;br /&gt;
   int n;&lt;br /&gt;
   n=50000; //100000, 200000, ... 2000000&lt;br /&gt;
   start = clock();&lt;br /&gt;
   for(int i=100;i&amp;lt;n;i++)&lt;br /&gt;
      is_prime(i);   &lt;br /&gt;
   end = clock();&lt;br /&gt;
   elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;&lt;br /&gt;
   cout&amp;lt;&amp;lt;elapsed&amp;lt;&amp;lt;endl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{| class=datatable&lt;br /&gt;
|+Tabuľka nameraných časov behu funkcií&lt;br /&gt;
|-&lt;br /&gt;
!n [tisíc]	&lt;br /&gt;
!is_prime_2 t[s]	&lt;br /&gt;
!is_prime t[s]&lt;br /&gt;
!is_prime4 t[s]&lt;br /&gt;
|-&lt;br /&gt;
|50	&lt;br /&gt;
|0,16	&lt;br /&gt;
|0,086&lt;br /&gt;
|0,061&lt;br /&gt;
|-&lt;br /&gt;
|100	&lt;br /&gt;
|0,398	&lt;br /&gt;
|0,134&lt;br /&gt;
|0,126&lt;br /&gt;
|-&lt;br /&gt;
|200	&lt;br /&gt;
|1,034	&lt;br /&gt;
|0,345&lt;br /&gt;
|0,304&lt;br /&gt;
|-&lt;br /&gt;
|500	&lt;br /&gt;
|1,245	&lt;br /&gt;
|1,237&lt;br /&gt;
|0,958&lt;br /&gt;
|-&lt;br /&gt;
|1000	&lt;br /&gt;
|3,275	&lt;br /&gt;
|3,264&lt;br /&gt;
|2,349&lt;br /&gt;
|-&lt;br /&gt;
|1500	&lt;br /&gt;
|17,203	&lt;br /&gt;
|5,831&lt;br /&gt;
|3,9&lt;br /&gt;
|-&lt;br /&gt;
|2000	&lt;br /&gt;
|26	&lt;br /&gt;
|8,6&lt;br /&gt;
|5,82&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pLines ymin=0 ymax=27 colors=FF0000,00FF00,0000FF size=600x250 plots legend&amp;gt;&lt;br /&gt;
,is_prime2, is_prime, is_prime4&lt;br /&gt;
50 tis, 0.16, 0.08, 0.061&lt;br /&gt;
100 tis, 0.398, 0.134, 0.126&lt;br /&gt;
200 tis, 1.034, 0.345, 0.304&lt;br /&gt;
500 tis, 1.245, 1.237, 0.958&lt;br /&gt;
1 mil, 3.275, 3.264, 2.349&lt;br /&gt;
1.5 mil, 17.203, 5.831, 3.9&lt;br /&gt;
2 mil, 26, 8.6, 5.82&lt;br /&gt;
&amp;lt;/pLines&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podobné časy pri nižších hodnotách n sú dané tým, že vzdialenosť susedných prvočísel je väčšia pri vyšších prvočíslach. Z grafu taktiež vidieť účinok optimalizácie algoritmu.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
*http://sk.wikipedia.org/wiki/Zoznam_prvo%C4%8D%C3%ADsiel&lt;br /&gt;
*http://www.prime-numbers.org/&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0trukt%C3%BAry_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=12907</id>
		<title>Štruktúry (riešené príklady)</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0trukt%C3%BAry_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=12907"/>
		<updated>2021-02-13T21:11:34Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Draft}}&lt;br /&gt;
{{Skripta programovanie (zbierka úloh)}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Štruktúra Zlomok==&lt;br /&gt;
'''Úloha:'''&lt;br /&gt;
&lt;br /&gt;
Zostavte program, ktorý pomôže pri práci so zlomkami – bude vedieť zlomok skrátiť a vypísať ho v čo najvhodnejšom tvare. Program načíta dva zlomky, každý hneď po načítaní upravene vypíše, ďalej vypíše ich súčin, súčet a podiel:&lt;br /&gt;
#Zostavte funkciu na načítanie zlomku z klávesnice a funkciu, ktorá vypíše zlomok na obrazovku v tvare „a/b“, napr. „3/4“. Postupne ju zdokonaľujte:&lt;br /&gt;
##V prípade, že zlomok má celú časť, vypíše ho v tvare „a b/c“, napr. namiesto „9/4“ bude písať „2 1/4“.&lt;br /&gt;
##V prípade, že jeho zvyšná časť je nulová, nebude ju vypisovať, napr. namiesto „6/2“ nebude písať „3 0/2“, ale iba „3“ a podobne, namiesto „0/2“ iba „0“.&lt;br /&gt;
#Vytvorte si pomocnú funkciu, ktorá zjednoduší (skráti) zlomok, napr. „36/48“ prevedie na „3/4“ a obohaťte ňou funkciu pre vypísanie zlomku (aby sa zlomok vypisoval už v zjednodušenom tvare). &lt;br /&gt;
#Zostavte funkcie, ktoré vypočítajú súčin, súčet a podiel dvoch zlomkov a použite ich v hlavnom programe.&lt;br /&gt;
&lt;br /&gt;
'''Vzorový vstup:'''&lt;br /&gt;
 5 4&lt;br /&gt;
 1 1/4&lt;br /&gt;
 6 8&lt;br /&gt;
 3/4&lt;br /&gt;
&lt;br /&gt;
'''Vzorový výstup:'''&lt;br /&gt;
 sucin: 15/16&lt;br /&gt;
 sucet: 2&lt;br /&gt;
 podiel: 1 2/3&lt;br /&gt;
&lt;br /&gt;
Cieľom je precvičiť si prácu so štruktúrou – bolo by vhodné ju v programe využiť.&lt;br /&gt;
Funkcia na načítanie zlomku môže využiť referenciu alebo štruktúru ako návratovú hodnotu. Pre krátenie zlomku môžeme využiť referenciu a pre matematické operácie so zlomkami zase návratovú hodnotu.&lt;br /&gt;
&lt;br /&gt;
Pre krátenie zlomku treba funkciu na najväčší spoločný deliteľ – použijeme Euklidov algoritmus postupného odpočítavania menšieho čísla od väčšieho a jeho zdokonalenie cez operáciu modulo.&lt;br /&gt;
Pri matematických funkciách môžeme využiť akýsi „akoby konštruktor“ na vytvorenie zlomku, no nie je to nutné.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
struct TZlomok { int citatel, menovatel; };&lt;br /&gt;
void CitajZlomok(TZlomok &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
   cin &amp;gt;&amp;gt; z.citatel;&lt;br /&gt;
   cin &amp;gt;&amp;gt; z.menovatel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int NSD(int a, int b)&lt;br /&gt;
{&lt;br /&gt;
   while (b)&lt;br /&gt;
   {&lt;br /&gt;
      int c = a % b;&lt;br /&gt;
      a = b;&lt;br /&gt;
      b = c;&lt;br /&gt;
   }&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SkratZlomok(TZlomok &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
   int nsd = NSD(z.citatel, z.menovatel);&lt;br /&gt;
   z.citatel /= nsd;&lt;br /&gt;
   z.menovatel /= nsd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VypisZlomok(TZlomok z)&lt;br /&gt;
{&lt;br /&gt;
   SkratZlomok(z);&lt;br /&gt;
   int cela_cast = z.citatel / z.menovatel;&lt;br /&gt;
   if (cela_cast)&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; cela_cast;&lt;br /&gt;
      int zvysok = z.citatel % z.menovatel;&lt;br /&gt;
      if (zvysok) cout &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; zvysok &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; z.menovatel;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; z.citatel;&lt;br /&gt;
      if (z.citatel) // ak je nula, napise len ju a nie napr. 0/1&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; z.menovatel;&lt;br /&gt;
   }&lt;br /&gt;
   cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok Zlomok(int cit, int men)&lt;br /&gt;
{&lt;br /&gt;
   TZlomok z;&lt;br /&gt;
   z.citatel = cit;&lt;br /&gt;
   z.menovatel = men;&lt;br /&gt;
   SkratZlomok(z);&lt;br /&gt;
   return z;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok SucinZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.citatel, z1.menovatel * z2.menovatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok SucetZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.menovatel + z2.citatel * z1.menovatel,&lt;br /&gt;
   z1.menovatel * z2.menovatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok PodielZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.menovatel, z1.menovatel * z2.citatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   TZlomok z1, z2;&lt;br /&gt;
   CitajZlomok(z1); VypisZlomok(z1);&lt;br /&gt;
   CitajZlomok(z2); VypisZlomok(z2);&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;sucin: &amp;quot;; VypisZlomok(SucinZlomkov(z1, z2));&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;sucet: &amp;quot;; VypisZlomok(SucetZlomkov(z1, z2));&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;podiel: &amp;quot;; VypisZlomok(PodielZlomkov(z1, z2));&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zásobník - pamäť typu LIFO==&lt;br /&gt;
===Intepreter postfixových aritmetických výrazov===&lt;br /&gt;
'''Zadanie:'''&lt;br /&gt;
&lt;br /&gt;
Vytvorte program v jazyku C, ktorý po spustení načíta od používateľa postfixový aritmetický výraz, vyhodnotí ho, vypíše jeho hodnotu do konzoly (na monitor) a skončí. &lt;br /&gt;
&lt;br /&gt;
'''Analýza:'''&lt;br /&gt;
&lt;br /&gt;
V postfixovom aritmetickom výraze sa operátor zapisuje vždy po svojich dvoch operandoch, ako to môžeme vidieť v nasledujúcom takomto výraze&lt;br /&gt;
 5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
ktorý má  hodnotu 2075.&lt;br /&gt;
Každý infixový  aritmetický výraz, môže byť prepísaný na postfixový. Infixová verzia uvedeného postfixového výrazu je nasledovná:&lt;br /&gt;
 5 * ( ( (9 + 8) * (4 * 6) ) + 7)&lt;br /&gt;
a tá má samozrejme po vyhodnotení rovnakú hodnotu 2075.&lt;br /&gt;
&lt;br /&gt;
Pomocou abstraktného dátového typu (ADT) zásobníka sa dajú veľmi dobre vyhodnocovať  práve postfixové aritmetické výrazy. Každý operátor si z vrcholu zásobníka načíta svoje dva operandy a po vykonaní operácie na nich vráti jej výsledok namiesto týchto dvoch operandov na vrchol zásobníka (využitie princípu dátovej štruktúry typu LIFO). Nasledujúci obrázok demonštruje tento jednoduchý princíp na vyhodnocovaní vyššie uvedeného postfixového aritmetického výrazu.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=wikitable&lt;br /&gt;
|+ Spracovanie postfixového výrazu 5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
|-&lt;br /&gt;
!index v pamati zásobníka&amp;lt;hr/&amp;gt;číslo kroku&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
! 4&lt;br /&gt;
! operácia&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 5&lt;br /&gt;
| 9&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 5&lt;br /&gt;
| 9&lt;br /&gt;
| 8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 8+9&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 4&lt;br /&gt;
| 6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 6 * 4&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 24&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 24*17&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 5&lt;br /&gt;
| 408&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 5&lt;br /&gt;
| 408&lt;br /&gt;
| 7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 408 + 7&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 5&lt;br /&gt;
| 415&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 415 * 5&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2075&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
Tabuľka ukazuje použitie zásobníka reprezentovaného celočíselným poľom (zasobnik.pamat[ ]) pre vyhodnotenie postfixového výrazu 5 9 8 + 4 6 * * 7 + * uloženého v znakovom poli (vyraz[ ]). Tento výraz postupne prechádzame zľava doprava. Ak narazíme na znak reprezentujúci číslo, vložíme ho na vrchol zásobníka (zasobnik.pamat[zasobnik.vrchol]), ak narazíme na znak reprezentujúci operátor, potom vyberieme z vrcholu zásobníka 2 operandy, aplikujeme na ne operátor a namiesto týchto dvoch operandov vložíme na vrchol zásobníka výsledok samotnej operácie. &lt;br /&gt;
Na reprezentáciu zásobníka použijeme štruktúru LIFO. Pre základné operácie so zásobníkom, vloženie položky na vrchol zásobníka a vybratie položky z jeho vrcholu, si vytvoríme dve funkcie:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  stav zasobnika push(LIFO &amp;amp;zasobnik, int x);&lt;br /&gt;
  int pop(LIFO &amp;amp;zasobnik); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Príklad vstupu do programu:'''&lt;br /&gt;
&lt;br /&gt;
5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
&lt;br /&gt;
'''Príklad výstupu z programu:'''&lt;br /&gt;
&lt;br /&gt;
2075 &lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include&amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
#define MAX_PAMAT 40 &lt;br /&gt;
&lt;br /&gt;
enum stav_zasobnika{OK=-1, FULL=INT_MAX, EMPTY=INT_MIN}; &lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    double pamat[ MAX_PAMAT ];&lt;br /&gt;
    int vrchol;&lt;br /&gt;
} LIFO;&lt;br /&gt;
&lt;br /&gt;
/** pre ucely ladenia */&lt;br /&gt;
void show(LIFO &amp;amp;zasobnik){&lt;br /&gt;
    cout&amp;lt;&amp;lt;&amp;quot;|&amp;quot;;&lt;br /&gt;
    for(int i=0; i&amp;lt;zasobnik.vrchol; i++) {&lt;br /&gt;
        cout&amp;lt;&amp;lt;zasobnik.pamat[i]&amp;lt;&amp;lt;&amp;quot;|&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//VLOZI novu polozku 'x' do pola 'zasobnik.pamat' (do zasobnika) a zvacsi indexovu premennu //'zasobnik.vrchol' o 1&lt;br /&gt;
stav_fronty push(LIFO &amp;amp;zasobnik,double x) {&lt;br /&gt;
&lt;br /&gt;
    if(zasobnik.vrchol&amp;lt;MAX_PAMAT)&lt;br /&gt;
        zasobnik.pamat[zasobnik.vrchol++]=x;&lt;br /&gt;
    else&lt;br /&gt;
        return FULL;&lt;br /&gt;
    return OK;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//zmensi indexovu premennu 'zasobnik.vrchol' o 1 a VYBERIE poslednu vlozenu polozku z pola //'zasobnik.pamat' (zo zasobnika)&lt;br /&gt;
double pop(LIFO &amp;amp;zasobnik) {&lt;br /&gt;
    if(zasobnik.vrchol&amp;gt;0)&lt;br /&gt;
        return zasobnik.pamat[--zasobnik.vrchol];&lt;br /&gt;
    else&lt;br /&gt;
        return EMPTY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
      LIFO f; //deklaracia strukturovej premennej typu 'LIFO' reprezentujucej zasobnik&lt;br /&gt;
      f.vrchol=0;&lt;br /&gt;
      int i,j,N;&lt;br /&gt;
      char vyraz[40];&lt;br /&gt;
&lt;br /&gt;
      //cout&amp;lt;&amp;lt;&amp;quot;Vlozte postfixovy vyraz na vyhodnotenie:\n&amp;quot;;&lt;br /&gt;
      cin.getline(vyraz,39)&lt;br /&gt;
&lt;br /&gt;
      N=(int)strlen(vyraz); //v 'X' je dlzka nacitaneho retazca zo standardneho vstupu &lt;br /&gt;
&lt;br /&gt;
      // v cykle 'for' prechadzame vstupny vyraz ulozeny v poli 'vyraz' zlava doprava. &lt;br /&gt;
      // Ak narazime na znak reprezentujuci cislo, vlozime ho na vrchol &lt;br /&gt;
      // zasobnika ('f.pamat[f.vrchol]'), ak narazime na znak&lt;br /&gt;
      // reprezentujuci operator, potom vyberieme z vrcholu zasobnika 2 operandy, aplikujeme na ne&lt;br /&gt;
      // operator a namiesto tychto dvoch operandov vlozime na vrchol zasobnika vysledok samotnej&lt;br /&gt;
      // operacie&lt;br /&gt;
&lt;br /&gt;
      for(i=0; i&amp;lt;N; i++)&lt;br /&gt;
      {&lt;br /&gt;
        if (vyraz[i]==' ') {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (vyraz[i]=='+') {&lt;br /&gt;
            push(f, (pop(f) + pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (vyraz[i]=='*') {&lt;br /&gt;
            push(f, (pop(f) * pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (vyraz[i]=='/') {&lt;br /&gt;
            push(f, (pop(f) / pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (vyraz[i]=='-') {&lt;br /&gt;
            push(f, (pop(f) - pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        j=0;&lt;br /&gt;
        while((vyraz[i]&amp;gt;='0' &amp;amp;&amp;amp; vyraz[i]&amp;lt;='9') || vyraz[i]=='.') {&lt;br /&gt;
            buffer[j] = vyraz[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
        buffer[j]=0;&lt;br /&gt;
        x = atof (buffer);&lt;br /&gt;
        if(FULL == push(f,x)){&lt;br /&gt;
            cout&amp;lt;&amp;lt;&amp;quot;LIFO overflow&amp;quot;;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
     }&lt;br /&gt;
      //na vrchole zasobnika je uz vysledok vyhodnoteneho postfixoveho aritmetickeho vyrazu, takze ho&lt;br /&gt;
      //vypiseme&lt;br /&gt;
      cout&amp;lt;&amp;lt;pop(f); &lt;br /&gt;
      return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0trukt%C3%BAry_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=12906</id>
		<title>Štruktúry (riešené príklady)</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0trukt%C3%BAry_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=12906"/>
		<updated>2021-02-13T21:10:13Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Draft}}&lt;br /&gt;
{{Skripta programovanie (zbierka úloh)}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Štruktúra Zlomok==&lt;br /&gt;
'''Úloha:'''&lt;br /&gt;
&lt;br /&gt;
Zostavte program, ktorý pomôže pri práci so zlomkami – bude vedieť zlomok skrátiť a vypísať ho v čo najvhodnejšom tvare. Program načíta dva zlomky, každý hneď po načítaní upravene vypíše, ďalej vypíše ich súčin, súčet a podiel:&lt;br /&gt;
#Zostavte funkciu na načítanie zlomku z klávesnice a funkciu, ktorá vypíše zlomok na obrazovku v tvare „a/b“, napr. „3/4“. Postupne ju zdokonaľujte:&lt;br /&gt;
##V prípade, že zlomok má celú časť, vypíše ho v tvare „a b/c“, napr. namiesto „9/4“ bude písať „2 1/4“.&lt;br /&gt;
##V prípade, že jeho zvyšná časť je nulová, nebude ju vypisovať, napr. namiesto „6/2“ nebude písať „3 0/2“, ale iba „3“ a podobne, namiesto „0/2“ iba „0“.&lt;br /&gt;
#Vytvorte si pomocnú funkciu, ktorá zjednoduší (skráti) zlomok, napr. „36/48“ prevedie na „3/4“ a obohaťte ňou funkciu pre vypísanie zlomku (aby sa zlomok vypisoval už v zjednodušenom tvare). &lt;br /&gt;
#Zostavte funkcie, ktoré vypočítajú súčin, súčet a podiel dvoch zlomkov a použite ich v hlavnom programe.&lt;br /&gt;
&lt;br /&gt;
'''Vzorový vstup:'''&lt;br /&gt;
 5 4&lt;br /&gt;
 1 1/4&lt;br /&gt;
 6 8&lt;br /&gt;
 3/4&lt;br /&gt;
&lt;br /&gt;
'''Vzorový výstup:'''&lt;br /&gt;
 sucin: 15/16&lt;br /&gt;
 sucet: 2&lt;br /&gt;
 podiel: 1 2/3&lt;br /&gt;
&lt;br /&gt;
Cieľom je precvičiť si prácu so štruktúrou – bolo by vhodné ju v programe využiť.&lt;br /&gt;
Funkcia na načítanie zlomku môže využiť referenciu alebo štruktúru ako návratovú hodnotu. Pre krátenie zlomku môžeme využiť referenciu a pre matematické operácie so zlomkami zase návratovú hodnotu.&lt;br /&gt;
&lt;br /&gt;
Pre krátenie zlomku treba funkciu na najväčší spoločný deliteľ – použijeme Euklidov algoritmus postupného odpočítavania menšieho čísla od väčšieho a jeho zdokonalenie cez operáciu modulo.&lt;br /&gt;
Pri matematických funkciách môžeme využiť akýsi „akoby konštruktor“ na vytvorenie zlomku, no nie je to nutné.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct TZlomok { int citatel, menovatel; };&lt;br /&gt;
void CitajZlomok(TZlomok &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
   cin &amp;gt;&amp;gt; z.citatel;&lt;br /&gt;
   cin &amp;gt;&amp;gt; z.menovatel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int NSD(int a, int b)&lt;br /&gt;
{&lt;br /&gt;
   while (b)&lt;br /&gt;
   {&lt;br /&gt;
      int c = a % b;&lt;br /&gt;
      a = b;&lt;br /&gt;
      b = c;&lt;br /&gt;
   }&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SkratZlomok(TZlomok &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
   int nsd = NSD(z.citatel, z.menovatel);&lt;br /&gt;
   z.citatel /= nsd;&lt;br /&gt;
   z.menovatel /= nsd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VypisZlomok(TZlomok z)&lt;br /&gt;
{&lt;br /&gt;
   SkratZlomok(z);&lt;br /&gt;
   int cela_cast = z.citatel / z.menovatel;&lt;br /&gt;
   if (cela_cast)&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; cela_cast;&lt;br /&gt;
      int zvysok = z.citatel % z.menovatel;&lt;br /&gt;
      if (zvysok) cout &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; zvysok &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; z.menovatel;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; z.citatel;&lt;br /&gt;
      if (z.citatel) // ak je nula, napise len ju a nie napr. 0/1&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; z.menovatel;&lt;br /&gt;
   }&lt;br /&gt;
   cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok Zlomok(int cit, int men)&lt;br /&gt;
{&lt;br /&gt;
   TZlomok z;&lt;br /&gt;
   z.citatel = cit;&lt;br /&gt;
   z.menovatel = men;&lt;br /&gt;
   SkratZlomok(z);&lt;br /&gt;
   return z;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok SucinZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.citatel, z1.menovatel * z2.menovatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok SucetZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.menovatel + z2.citatel * z1.menovatel,&lt;br /&gt;
   z1.menovatel * z2.menovatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok PodielZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.menovatel, z1.menovatel * z2.citatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
   TZlomok z1, z2;&lt;br /&gt;
   CitajZlomok(z1); VypisZlomok(z1);&lt;br /&gt;
   CitajZlomok(z2); VypisZlomok(z2);&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;sucin: &amp;quot;; VypisZlomok(SucinZlomkov(z1, z2));&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;sucet: &amp;quot;; VypisZlomok(SucetZlomkov(z1, z2));&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;podiel: &amp;quot;; VypisZlomok(PodielZlomkov(z1, z2));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zásobník - pamäť typu LIFO==&lt;br /&gt;
===Intepreter postfixových aritmetických výrazov===&lt;br /&gt;
'''Zadanie:'''&lt;br /&gt;
&lt;br /&gt;
Vytvorte program v jazyku C, ktorý po spustení načíta od používateľa postfixový aritmetický výraz, vyhodnotí ho, vypíše jeho hodnotu do konzoly (na monitor) a skončí. &lt;br /&gt;
&lt;br /&gt;
'''Analýza:'''&lt;br /&gt;
&lt;br /&gt;
V postfixovom aritmetickom výraze sa operátor zapisuje vždy po svojich dvoch operandoch, ako to môžeme vidieť v nasledujúcom takomto výraze&lt;br /&gt;
 5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
ktorý má  hodnotu 2075.&lt;br /&gt;
Každý infixový  aritmetický výraz, môže byť prepísaný na postfixový. Infixová verzia uvedeného postfixového výrazu je nasledovná:&lt;br /&gt;
 5 * ( ( (9 + 8) * (4 * 6) ) + 7)&lt;br /&gt;
a tá má samozrejme po vyhodnotení rovnakú hodnotu 2075.&lt;br /&gt;
&lt;br /&gt;
Pomocou abstraktného dátového typu (ADT) zásobníka sa dajú veľmi dobre vyhodnocovať  práve postfixové aritmetické výrazy. Každý operátor si z vrcholu zásobníka načíta svoje dva operandy a po vykonaní operácie na nich vráti jej výsledok namiesto týchto dvoch operandov na vrchol zásobníka (využitie princípu dátovej štruktúry typu LIFO). Nasledujúci obrázok demonštruje tento jednoduchý princíp na vyhodnocovaní vyššie uvedeného postfixového aritmetického výrazu.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=wikitable&lt;br /&gt;
|+ Spracovanie postfixového výrazu 5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
|-&lt;br /&gt;
!index v pamati zásobníka&amp;lt;hr/&amp;gt;číslo kroku&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
! 4&lt;br /&gt;
! operácia&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 5&lt;br /&gt;
| 9&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 5&lt;br /&gt;
| 9&lt;br /&gt;
| 8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 8+9&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 4&lt;br /&gt;
| 6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 6 * 4&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 24&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 24*17&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 5&lt;br /&gt;
| 408&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 5&lt;br /&gt;
| 408&lt;br /&gt;
| 7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 408 + 7&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 5&lt;br /&gt;
| 415&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 415 * 5&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2075&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
Tabuľka ukazuje použitie zásobníka reprezentovaného celočíselným poľom (zasobnik.pamat[ ]) pre vyhodnotenie postfixového výrazu 5 9 8 + 4 6 * * 7 + * uloženého v znakovom poli (vyraz[ ]). Tento výraz postupne prechádzame zľava doprava. Ak narazíme na znak reprezentujúci číslo, vložíme ho na vrchol zásobníka (zasobnik.pamat[zasobnik.vrchol]), ak narazíme na znak reprezentujúci operátor, potom vyberieme z vrcholu zásobníka 2 operandy, aplikujeme na ne operátor a namiesto týchto dvoch operandov vložíme na vrchol zásobníka výsledok samotnej operácie. &lt;br /&gt;
Na reprezentáciu zásobníka použijeme štruktúru LIFO. Pre základné operácie so zásobníkom, vloženie položky na vrchol zásobníka a vybratie položky z jeho vrcholu, si vytvoríme dve funkcie:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  stav zasobnika push(LIFO &amp;amp;zasobnik, int x);&lt;br /&gt;
  int pop(LIFO &amp;amp;zasobnik); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Príklad vstupu do programu:'''&lt;br /&gt;
&lt;br /&gt;
5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
&lt;br /&gt;
'''Príklad výstupu z programu:'''&lt;br /&gt;
&lt;br /&gt;
2075 &lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include&amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
#define MAX_PAMAT 40 &lt;br /&gt;
&lt;br /&gt;
enum stav_zasobnika{OK=-1, FULL=INT_MAX, EMPTY=INT_MIN}; &lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    double pamat[ MAX_PAMAT ];&lt;br /&gt;
    int vrchol;&lt;br /&gt;
} LIFO;&lt;br /&gt;
&lt;br /&gt;
/** pre ucely ladenia */&lt;br /&gt;
void show(LIFO &amp;amp;zasobnik){&lt;br /&gt;
    cout&amp;lt;&amp;lt;&amp;quot;|&amp;quot;;&lt;br /&gt;
    for(int i=0; i&amp;lt;zasobnik.vrchol; i++) {&lt;br /&gt;
        cout&amp;lt;&amp;lt;zasobnik.pamat[i]&amp;lt;&amp;lt;&amp;quot;|&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//VLOZI novu polozku 'x' do pola 'zasobnik.pamat' (do zasobnika) a zvacsi indexovu premennu //'zasobnik.vrchol' o 1&lt;br /&gt;
stav_fronty push(LIFO &amp;amp;zasobnik,double x) {&lt;br /&gt;
&lt;br /&gt;
    if(zasobnik.vrchol&amp;lt;MAX_PAMAT)&lt;br /&gt;
        zasobnik.pamat[zasobnik.vrchol++]=x;&lt;br /&gt;
    else&lt;br /&gt;
        return FULL;&lt;br /&gt;
    return OK;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//zmensi indexovu premennu 'zasobnik.vrchol' o 1 a VYBERIE poslednu vlozenu polozku z pola //'zasobnik.pamat' (zo zasobnika)&lt;br /&gt;
double pop(LIFO &amp;amp;zasobnik) {&lt;br /&gt;
    if(zasobnik.vrchol&amp;gt;0)&lt;br /&gt;
        return zasobnik.pamat[--zasobnik.vrchol];&lt;br /&gt;
    else&lt;br /&gt;
        return EMPTY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
      LIFO f; //deklaracia strukturovej premennej typu 'LIFO' reprezentujucej zasobnik&lt;br /&gt;
      f.vrchol=0;&lt;br /&gt;
      int i,j,N;&lt;br /&gt;
      char vyraz[40];&lt;br /&gt;
&lt;br /&gt;
      //cout&amp;lt;&amp;lt;&amp;quot;Vlozte postfixovy vyraz na vyhodnotenie:\n&amp;quot;;&lt;br /&gt;
      cin.getline(vyraz,39)&lt;br /&gt;
&lt;br /&gt;
      N=(int)strlen(vyraz); //v 'X' je dlzka nacitaneho retazca zo standardneho vstupu &lt;br /&gt;
&lt;br /&gt;
      // v cykle 'for' prechadzame vstupny vyraz ulozeny v poli 'vyraz' zlava doprava. &lt;br /&gt;
      // Ak narazime na znak reprezentujuci cislo, vlozime ho na vrchol &lt;br /&gt;
      // zasobnika ('f.pamat[f.vrchol]'), ak narazime na znak&lt;br /&gt;
      // reprezentujuci operator, potom vyberieme z vrcholu zasobnika 2 operandy, aplikujeme na ne&lt;br /&gt;
      // operator a namiesto tychto dvoch operandov vlozime na vrchol zasobnika vysledok samotnej&lt;br /&gt;
      // operacie&lt;br /&gt;
&lt;br /&gt;
      for(i=0; i&amp;lt;N; i++)&lt;br /&gt;
      {&lt;br /&gt;
        if (vyraz[i]==' ') {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (vyraz[i]=='+') {&lt;br /&gt;
            push(f, (pop(f) + pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (vyraz[i]=='*') {&lt;br /&gt;
            push(f, (pop(f) * pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (vyraz[i]=='/') {&lt;br /&gt;
            push(f, (pop(f) / pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (vyraz[i]=='-') {&lt;br /&gt;
            push(f, (pop(f) - pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        j=0;&lt;br /&gt;
        while((vyraz[i]&amp;gt;='0' &amp;amp;&amp;amp; vyraz[i]&amp;lt;='9') || vyraz[i]=='.') {&lt;br /&gt;
            buffer[j] = vyraz[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
        buffer[j]=0;&lt;br /&gt;
        x = atof (buffer);&lt;br /&gt;
        if(FULL == push(f,x)){&lt;br /&gt;
            cout&amp;lt;&amp;lt;&amp;quot;LIFO overflow&amp;quot;;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
     }&lt;br /&gt;
      //na vrchole zasobnika je uz vysledok vyhodnoteneho postfixoveho aritmetickeho vyrazu, takze ho&lt;br /&gt;
      //vypiseme&lt;br /&gt;
      cout&amp;lt;&amp;lt;pop(f); &lt;br /&gt;
      return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Jazyk_C_-_re%C5%A5azce&amp;diff=12905</id>
		<title>Jazyk C - reťazce</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Jazyk_C_-_re%C5%A5azce&amp;diff=12905"/>
		<updated>2020-11-14T18:27:36Z</updated>

		<summary type="html">&lt;p&gt;Juraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Skripta_ZI}}&lt;br /&gt;
__TOC__&lt;br /&gt;
Reťazce sú vlastne jednorozmerné pole znakov ukončené nulovým znakom '\0'. Reťazec teda obsahuje znaky a ako posledný znak je nulový znak '\0'.&lt;br /&gt;
&lt;br /&gt;
Nasledujúce deklarácia a inicializácia vytvoria reťazec pozostávajúci zo slova „Ahoj“. Každý reťazec musí byť ukončený nulovým znakom '\0', preto veľkosť poľa znakov obsahujúceho reťazec je vždy o +1 väčší ako je počet písmen vo výraze.&lt;br /&gt;
&lt;br /&gt;
'''Iniciálizácia'''&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
char slovo[5] = {'A', 'h', 'o', 'j','\0'};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ak budete postupovať podľa pravidla inicializácie poľa, môžete vyššie uvedený príkaz napísať nasledovne.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
char slovo[5] = &amp;quot;Ahoj&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prezentácia pamäte vyššie definovaného reťazca v C.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&lt;br /&gt;
|-&lt;br /&gt;
| Index || 0 || 1 || 2 || 3 || 4 &lt;br /&gt;
|-&lt;br /&gt;
| Premenná || A || h || o || j || \0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
V skutočnosti neukladáte nulový znak na koniec reťazcovej konštanty. Keď inicializuje pole, kompilátor C ho automaticky umiestni '\ 0' na koniec reťazca. Pokúsme sa vypísať vyššie uvedený reťazec.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char slovo[5] = {'A', 'h', 'o', 'j','\0'};&lt;br /&gt;
   /*poprípade môžme pole inicializovať takto:&lt;br /&gt;
   char slovo[5] = &amp;quot;Ahoj&amp;quot;;&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Vypisane slovo: %s\n&amp;quot;, slovo);&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vystup.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Vypisane slovo: Ahoj&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C podporuje širokú škálu funkcií, ktoré manipulujú s reťazcami ukončenými nulovou hodnotou.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&lt;br /&gt;
|-&lt;br /&gt;
! !! Funkcia  !! Účel&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[Strcpy (jazyk C)|strcpy (s1);]] || Skopíruje reťazec s2 do reťazca s1.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[Strcat(jazyk C)|strcat (s1);]]  || Pripojí reťazec s2 na koniec reťazca s1.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [[Strlen (jazyk C)|strlen (s1);]] || Vráti dĺžku reťazca s1.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [[Strcmp (jazyk C)|strcmp (s1);]]  || Vráti 0, ak sú s1 a s2 rovnaké; menej ako 0, ak s1 &amp;lt;s2; väčšie ako 0, ak s1&amp;gt; s2.&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [[Strchr (jazyk C)|strchr (s1);]] || Vracia ukazovateľ na prvý výskyt znaku ch v reťazci s1.&lt;br /&gt;
|-&lt;br /&gt;
| 6 || [[Strstr (jazyk C)|strstr (s1);]] || Vráti ukazovateľ na prvý výskyt reťazca s2 v reťazci s1.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nasledujúci príklad používa niektoré z vyššie uvedených funkcií.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char retazec1[12] = &amp;quot;Ahoj&amp;quot;;&lt;br /&gt;
   char retazec2[12] = &amp;quot;svet&amp;quot;;&lt;br /&gt;
   char retazec3[12];&lt;br /&gt;
   int  dlzka;&lt;br /&gt;
&lt;br /&gt;
   /* Skopírovanie reťazca 1 do reťazca 3 */&lt;br /&gt;
   strcpy(retazec3, retazec1);&lt;br /&gt;
   printf(&amp;quot;strcpy( retazec3, retazec1) :  %s\n&amp;quot;, retazec3);&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Prilepenie&amp;quot; retazec2 za  retazec1*/&lt;br /&gt;
   strcat( retazec1, retazec2);&lt;br /&gt;
   printf(&amp;quot;strcat( retazec1, retazec2):   %s\n&amp;quot;, retazec1);&lt;br /&gt;
&lt;br /&gt;
   /* Celková dĺžka reťazca 1 po pripojení reťazca 2*/&lt;br /&gt;
   dlzka = strlen(retazec1);&lt;br /&gt;
   printf(&amp;quot;strlen(retazec1):  %d\n&amp;quot;, dlzka);&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vystup.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
strcpy( retazec3, retazec1):  Hello&lt;br /&gt;
strcat(retazec1, retazec2):   HelloWorld&lt;br /&gt;
strlen(retazec1):  10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Uvedenie_aplik%C3%A1cie_eAurela_do_produkcie&amp;diff=12904</id>
		<title>Uvedenie aplikácie eAurela do produkcie</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Uvedenie_aplik%C3%A1cie_eAurela_do_produkcie&amp;diff=12904"/>
		<updated>2020-10-19T19:33:52Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Zamkol stránku „Uvedenie aplikácie eAurela do produkcie“ ([Úprava=Povoliť iba správcom] (na neurčito) [Presun=Povoliť iba správcom] (na neurčito))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]][[Kategória:Bakalárske práce]][[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
{{Praca_uvod|5|Klientská aplikácia pre zobrazenie dát ako súčasť senzorického informačného systému|Informačný systém Sensorical|Analýza požiadaviek a štruktúra klientskej aplikácie|Nástroje použité na vývoj aplikácie eAurela|Implementácia aplikácie eAurela|Uvedenie aplikácie eAurela do produkcie}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aby bola aplikácia dostupná a spustiteľná pre bežného používateľa, je potrebné vykonať build aplikácie. Tento proces slúži pre transformáciu zdrojových kódov v spustiteľnú aplikáciu. Keďže na vývoj aplikácie boli použité dva frameworky, build sa musí vykonať pre každý framework zvlášť. V tejto kapitole sú opísané postupy a nástroje použité pri vytváraní spustiteľnej aplikácie pre jednotlivé platformy. Všetky uvedené zmeny v zdrojovom kóde sa týkajú súboru ''package.json''.&lt;br /&gt;
&lt;br /&gt;
== Buildovanie reactovej aplikácie ==&lt;br /&gt;
&lt;br /&gt;
Keďže electron má zobrazovať reactovú časť aplikácie, je potrebné vykonať build reactovej časti ako prvý. React má zabudovaný skript pre vykonanie buildu, takže nie je potrebné pridať ďalšiu knižnicu (viď kód [[#lst:package|[lst:package]]]). Najdôležitejšia vec pri vykonaní buildu reactovej aplikácie je nastavenie vlastnosti ''homepage''. Táto vlastnosť je kľúčová pre React. Vďaka nej presne vie, kde sa spustiteľná aplikácia nachádza. V prípade, že by sa táto vlastnosť neuviedla, nebolo by možné vidieť reactovú časť aplikácie vo vnútri electronovej aplikácie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;homepage&amp;quot;: &amp;quot;./&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 5.1: Definovanie vlastnosti homepage v aplikácii eAurela&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zadefinovaní vlastnosti ''homepage'' je všetko pripravené na spustenie buildovacieho skriptu. Úspešné ukončenie skriptu je zobrazené na obrázku obr. [[#fig:reactBuild|5.1]].&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_reactBuild.png|thumb|500px|Obr 5.1 Úspešné použitie buildovacieho skriptu pre React&amp;lt;span label=&amp;quot;fig:reactBuild&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Po úspešnom prebehnutí tohoto skriptu sa v adresári aplikácie eAurela vytvorí nový priečinok s názvom ''build''. Tento priečinok obsahuje všetky statické súbory aplikácie, ktoré sú pripravené na prácu s electronovou časťou aplikácie.&lt;br /&gt;
&lt;br /&gt;
== Buildovanie electronovej aplikácie ==&lt;br /&gt;
&lt;br /&gt;
Po úspešnom prebehnutí buildu v reactovej časti treba vykonať aj build electronovej časti, čo bude mať za výsledok spustiteľnú aplikáciu. Nakoľko Electron neobsahuje žiadny skript určený na buildovanie, bolo nutné použiť externú knižnicu. Použitá bola knižnica ''electron-packager'' (https://github.com/electron/electron-packager). Po nainštalovaní knižnice je potrebné pridať buildovacie skripty do súboru ''package.json'' pre každý operačný systém.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// buildovací skript pre Mac OS&lt;br /&gt;
&amp;quot;package-mac&amp;quot;: &amp;quot;electron-packager . --platform=darwin --arch=x64&amp;quot;,&lt;br /&gt;
// buildovací skript pre Windows&lt;br /&gt;
&amp;quot;package-win&amp;quot;: &amp;quot;electron-packager . --platform=win32 --arch=x64&amp;quot;,&lt;br /&gt;
// buildovací skript pre Linux&lt;br /&gt;
&amp;quot;package-lin&amp;quot;: &amp;quot;electron-packager . --platform=linux --arch=x64&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 5.2: Skripty pre použitie knižnice electron-packager&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pre zjednodušenie kódu boli uvedené iba povinné parametre jednotlivých skriptov.Prvý parameter (''electron-packager'') hovorí, aby sa spustil práve ''electron-packager''. Druhý parameter (''.'') hovorí, kde sa nachádza zdrojový kód na zverejnenie. Nasledujúce dva parametre označujú práve cieľovú platformu (''–platfrom'') a typ architektúry (''–arch''). Ďalšie voliteľné parametre by mohli byť názov aplikácie (ak nie je uvedený, použije sa názov uvedený pod vlastnosťou ''name'' v súbore ''package.json''), ikona aplikácie a podobne. Úspešný priebeh skriptu ''package-win'' je vyobrazený na obrázku obr. [[#fig:electronBuild|5.2]].&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_electronBuild.png|thumb|500px|Obr 5.2 Buildovanie aplikácie eAurela pre platformu Windows&amp;lt;span label=&amp;quot;fig:electronBuild&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Po úspešnom ukončení skriptu sa opäť vytvorí nový priečinok, ktorý obsahuje spustiteľnú aplikáciu, ako aj zdrojový kód.&lt;br /&gt;
&lt;br /&gt;
= Záver =&lt;br /&gt;
&lt;br /&gt;
Výsledkom práce je softvérový produkt s názvom eAurela. Tento softvérový produkt slúži na zobrazenie environmentálnych dát a spravovanie senzorického informačného systému Sensorical.&lt;br /&gt;
&lt;br /&gt;
Aplikácia eAurela je naprogramovaná pomocou moderných internetových technológií. Na vývoj boli použité javascriptové frameworky React.js a Electron.js. Aplikácia je dostupná na operačných systémoch Windows, Linux a Mac OS ako desktopová aplikácia. Po nasadení bude aplikácia dostupná aj ako internetová aplikácia.&lt;br /&gt;
&lt;br /&gt;
Celá aplikácia eAurela pracuje na princípe volania existujúceho API a je určená výhradne používateľom systému Sensorical. Používatelia majú po prihlásení možnosť zvoliť si aplikáciu, respektíve inštaláciu, z ktorej si chcú prezerať namerané senzorické dáta, alebo si administrátori môžu zvoliť aj možnosť spravovania systému. Po vybraní aplikácie si používatelia môžu prezerať buď poslednú dostupnú nameranú hodnotu, alebo si môžu prezrieť grafické vyobrazenie nameraných hodnôt za nimi vybrané obdobie. Zobrazované dáta sú vždy aktuálne, zo servera sa získavajú pri voľbe aplikácie, alebo pri zmenení formy zobrazenia. Administrátori systému môžu spravovať a upravovať údaje uložené na serveri, môžu meniť používateľom prístupové práva v systéme, poprípade heslo. Administrátori majú možnosť spravovať údaje aj v rámci konkrétnej aplikácie. Tam majú možnosť registrovať do systému nových používateľov, alebo z aplikácie nejakého odobrať. Taktiež môžu upravovať prístupové práva v rámci aplikácie, alebo môžu meniť informácie o senzoroch, ako napríklad názov senzora a podobne.&lt;br /&gt;
&lt;br /&gt;
Vzhľadom na vyššie uvedené funkcionality aplikácie eAurela je možné tvrdiť, že aplikácia spĺňa požiadavky, ktoré jej boli určené. V budúcnosti bude aplikácia rozšírená o rôzne funkcie, napríklad budú doplnené funkcionality v časti spravovania systému, ktoré počas vývoja neboli dostupné na strane servera ako napríklad zmenenie rozmiestnenia senzorov v oblasti, vytvorenie novej spoločnosti alebo aplikácie, novej oblasti, sektora alebo senzora. Taktiež, ak to bude vyžadované, bude možné rozšíriť podporu aplikácie eAurela pre ďalšie jazykové mutácie.&lt;br /&gt;
&lt;br /&gt;
=Zoznam použitej literatúry=&lt;br /&gt;
[1] G. Gašpar a M. Skovajsa. “WOOD BIOMASS WIRELESS TEMPERATURE MONITORING SYSTEM”. In: Proceedings of INTERNATIONAL MASARYK CONFERENCE FOR PH.D. STUDENTS AND YOUNG RESEARCHERS. 2015, s. 2028–2034. isbn: 978-80-87952-12-2. doi: null.&lt;br /&gt;
&lt;br /&gt;
[2] J. Ďuďák, M. Skovajsa a I. Sládek. “UTILIZATION OF NSORIC SYSTEM FOR MONITORING OF ECOLOGICAL BUILDING INSULATIONS”. In: Proceedings of INTERNATIONAL MASARYK CONFERENCE FOR PH.D. STUDENTS AND YOUNG RESEARCHERS. 2015, s. 2028–2034. isbn: 978-80-87952-12-2. doi: null.&lt;br /&gt;
&lt;br /&gt;
[3] Electronjs. Electron Documentation. url: https://electronjs.org/docs/tutorial/support. (cit: 28.12.2019).&lt;br /&gt;
&lt;br /&gt;
[4] Reactjs. JavaScript Environment Requirements. url: https://reactjs.org/docs/javascript-environment-requirements.html. (cit: 28.12.2019).&lt;br /&gt;
&lt;br /&gt;
[5] David Čápka. Lekce 2 - UML - Use Case Diagram. url: https://www.itnetwork.cz/navrh/uml/uml-use-case-diagram. (cit: 28.12.2019).&lt;br /&gt;
&lt;br /&gt;
[6] Reactjs. Primary Components. url: https://reactjs.org/docs/introducing-jsx.html. (cit: 31.12.2019).&lt;br /&gt;
&lt;br /&gt;
[7] Jindřich Máca. Lekce 1 - Úvod do React. url: https://www.itnetwork.cz/javascript/react/uvod-do-react. (cit: 27.12.2019).&lt;br /&gt;
&lt;br /&gt;
[8] Reactjs. Components and Props. url: https://reactjs.org/docs/components-and-props.html. (cit: 21.05.2020).&lt;br /&gt;
&lt;br /&gt;
[9] Reactjs. JSX In Depth. url: https://reactjs.org/docs/jsx-in-depth.html. (cit: 21.05.2020).&lt;br /&gt;
&lt;br /&gt;
[10] Reactjs. State and Lifecycle. url: https://reactjs.org/docs/state-and-lifecycle.html. (cit: 21.05.2020).&lt;br /&gt;
&lt;br /&gt;
[11] Electronjs. Electron Application Architecture. url: https://electronjs.org/docs/tutorial/application-architecture. (cit: 29.12.2019).&lt;br /&gt;
&lt;br /&gt;
[12] Electronjs. Writing Your First Electron App. url: https://electronjs.org/docs/tutorial/first-app. (cit: 30.12.2019).&lt;br /&gt;
&lt;br /&gt;
[13] React Training. Introducing JSX. url: https://reacttraining.com/react-router/web/guides/primary-components. (cit: 16.05.2020).&lt;br /&gt;
&lt;br /&gt;
[14] MDN. Promise. url: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise. (cit: 17.05.2020).&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_aplik%C3%A1cie_eAurela&amp;diff=12903</id>
		<title>Implementácia aplikácie eAurela</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_aplik%C3%A1cie_eAurela&amp;diff=12903"/>
		<updated>2020-10-19T19:33:39Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Zamkol stránku „Implementácia aplikácie eAurela“ ([Úprava=Povoliť iba správcom] (na neurčito) [Presun=Povoliť iba správcom] (na neurčito))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]][[Kategória:Bakalárske práce]][[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
{{Praca_uvod|4|Klientská aplikácia pre zobrazenie dát ako súčasť senzorického informačného systému|Informačný systém Sensorical|Analýza požiadaviek a štruktúra klientskej aplikácie|Nástroje použité na vývoj aplikácie eAurela|Implementácia aplikácie eAurela|Uvedenie aplikácie eAurela do produkcie}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= =&lt;br /&gt;
&lt;br /&gt;
Celková implementácia všetkých častí aplikácie eAurela vychádza zo špecifikácie požiadaviek a návrhu štruktúry. Sú tu popísané jednotlivé časti aplikácie, ich funkcionalita a implementácia. Prvá časť tejto kapitoly sa bude venovať používateľskému rozhraniu, následne bude vysvetlené, ako funguje navigácia v aplikácií. Ďalšia časť popisuje komunikáciu so serverom, získavanie a uchovávanie dát. Na záver je v kapitole popísaný dizajn aplikácie a zobrazenie dát pomocou dizajnových prvkov a pomocou grafov z knižnice ''recharts''.&lt;br /&gt;
&lt;br /&gt;
== Používateľské rozhranie ==&lt;br /&gt;
&lt;br /&gt;
Všetky časti aplikácie, ktoré spolu vytvárajú používateľské rozhranie (UI), sú implementované v súlade s navrhnutou štruktúrou v časti [[#structure|[structure]]]. Pomocou týchto častí používateľ pracuje a komunikuje s aplikáciou. Každá časť aplikácie je samostatný reactový komponent, ktorý sa môže skladať aj z viacerých komponentov. V princípe rozdeľujú tieto komponenty aplikáciu na tri časti:&lt;br /&gt;
&lt;br /&gt;
* prístup k dátam,&lt;br /&gt;
* prezentácia dát používateľovi,&lt;br /&gt;
* spravovanie systému (iba pre administrátorov).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Prístup k dátam'''&lt;br /&gt;
&lt;br /&gt;
Pre prístup k dátam slúžia komponenty ''Home'' a ''Appilist''. Komponent ''Home'' je prvý vykreslený komponent po spustení aplikácie eAurela. Po prihlásení do systému sa zobrazí komponent ''Applist'' (viď obr. [[#fig:HomeUI|1.1]] a obr. [[#fig:ApplistUI|1.2]]).&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_HomeUI.png|thumb|500px|Obr 4.1 Prihlasovacia obrazovka (komponent ''Home'')&amp;lt;span label=&amp;quot;fig:HomeUI&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_ApplistUI.png|thumb|500px|Obr 4.2 Obrazovka pre výber aplikácie (komponent ''Applist'')&amp;lt;span label=&amp;quot;fig:ApplistUI&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Prezentácia dát používateľovi'''&lt;br /&gt;
&lt;br /&gt;
Po výbere aplikácie zo spoločnosti v komponente ''Applist'' sa vykresľuje komponent ''Sectors''. V tomto komponente si používateľ môže prezerať poslednú nameranú hodnotu zo senzorov v danom sektore, alebo si môže zvoliť vykreslenie grafu, ktorý zobrazuje krivky zo všetkých senzorov za určité obdobie. Tieto dve časti komponentu ''Sectors'' je možné vidieť na obrázkoch obr. [[#fig:SectorsUI|1.3]]. a obr. [[#fig:GraphsUI|1.4]].&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_SectorsUI.png|thumb|500px|Obr 4.3 Posledné namerané hodnoty v oblasti ''Letné sídlo'' (komponent ''Sectors'')&amp;lt;span label=&amp;quot;fig:SectorsUI&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_GraphsUI.png|thumb|500px|Obr 4.4 Vykreslenie grafu z oblasti ''Letné sídlo'' (komponent ''Sectors'')&amp;lt;span label=&amp;quot;fig:GraphsUI&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Spravovanie systému'''&lt;br /&gt;
&lt;br /&gt;
Z funkčých požiadaviek R02 a R04 vyplýva, že administrátori systému budú mať možnosť spravovať systém cez aplikáciu eAurela. V prípade, že je používateľ na serveri pre autorizáciu uvedený ako administrátor, v komponente ''Applist'' po kliknutí na ''Možnosti'' sa mu zobrazí možnosť prejsť do časti spravovania tohto serveru. Podobne aj v komponente ''Sectors'' sa používateľovi zobrazí možnosť spravovania danej aplikácie v prípade, že má na serveri aplikácie uvedené administrátorské oprávnenia.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_AuthAdminUI.png|thumb|500px|Obr 4.5 Spravovanie serveru pre autorizáciu (komponent ''AuthAdministration'')&amp;lt;span label=&amp;quot;fig:AuthAdminUI&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_ManageAdminUI.png|thumb|500px|Obr 4.6 Spravovanie konkrétnej aplikácie (komponent ''ManageAdministration'')&amp;lt;span label=&amp;quot;fig:ManageAdminUI&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== Navigácia v aplikácií ==&lt;br /&gt;
&lt;br /&gt;
Jadrom celej aplikácie je knižnica React Router (https://github.com/ReactTraining/react-router). Tá zabezpečuje navigáciu medzi oknami (komponentami) v aplikácii eAurela. Táto knižnica slúži pre vytvorenie navigácie v aplikáciách naprogramovaných vo frameworku React. V jedno-oknových aplikáciach existuje iba jedna HTML stránka. Táto stránka je znovu použitá pri vykreslení rôznych komponentov v závislosti od navigácie. V knižnici React router sú tri primárne kategórie komponentov:&lt;br /&gt;
&lt;br /&gt;
* smerovače (routers), ako &amp;amp;lt;BrowserRouter&amp;amp;gt; a &amp;amp;lt;HashRouter&amp;amp;gt;,&lt;br /&gt;
* porovnávače (route matchers), ako &amp;amp;lt;Route&amp;amp;gt; a &amp;amp;lt;Switch&amp;amp;gt;,&lt;br /&gt;
* samotná navigácia (navigation), ako &amp;amp;lt;Link&amp;amp;gt;, &amp;amp;lt;NavLink&amp;amp;gt; a &amp;amp;lt;Redirect&amp;amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Smerovače'''&lt;br /&gt;
&lt;br /&gt;
Sada ''react-router-dom'' sa používa v internetových projektoch a poskytuje komponenty ''BrowserRouter'' a ''HashRouter''. V aplikácií eAurela je použitá práve sada react-router-dom. Hlavný rozdiel medzi komponentami ''BrowserRouter'' a ''HashRouter'' je spôsob ako pracujú s URL adresou a ako komunikujú s internetovým serverom (Nodejs serverom). ''BrowserRouter'' používa regulárny tvar URL adresy (tak ako ho je možné vidieť v prehliadači). Tento spôsob práce s URL adresou by bol dostačujúci v prípade, že by bola aplikácia zobrazovaná iba v prehliadači. Vzhľadom na to, že aplikácia bude slúžiť aj ako desktopová aplikácia, bolo výhodnejšie použiť práve ''HashRouter''. Ten aktuálnu URL adresu ukladá ako mriežkovú časť (hash portion), teda URL adresa môže vyzerať napríklad '''http://priklad.com/#/hladana/stranka'''. Nakoľko mriežka nie je nikdy posielaná na server, netreba server špeciálne konfigurovať a navigácia bude fungovať v internetovom prehliadači a aj v desktopovej aplikácií. Pre správne použitie smerovača, je potrebné, aby bol umiestnený v jadre komponentovej hierarchie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Porovnávače'''&lt;br /&gt;
&lt;br /&gt;
Existujú dva komponenty pre porovnávanie: ''Switch'' a ''Route''. Keď je vykreslený ''Switch'', prehľadá všetkých potomkov ''Route'', kým nenájde jedného, ktorého adresa sa zhoduje s aktuálnou URL adresou. Ak ho nájde, vykreslí ho a všetky ostatné komponenty ignoruje. Ak nenájde žiadnu zhodu, nevykreslí nič (null).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Navigácia'''&lt;br /&gt;
&lt;br /&gt;
React Router poskytuje ''Link'' komponent na vytváranie odkazov v aplikácií. Kedykoľvek je vykreslený ''Link'', vykreslí sa vlastne HTML tag &amp;amp;lt;a&amp;amp;gt;. Komponent ''NavLink'' je špeciálny druh ''Link'' komponentu, ktorému sa môže nastaviť vlastnosť ''active'' v prípade, že sa cesta zhoduje s URL adresou. Kedykoľvek treba vynútiť navigáciu, môže sa použiť komponent ''Redirect''. Keď sa vykreslí, bude navigovať podľa jeho vlastnosti '''to''' . Použitie komponentu ''Redirect'' je ukázané a popísané v kóde [[#lst:ProtectedRoute|[lst:ProtectedRoute]]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HashRouter&amp;gt;&lt;br /&gt;
    &amp;lt;div className=&amp;quot;App&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Switch&amp;gt;&lt;br /&gt;
            &amp;lt;Route exact path={&amp;quot;/&amp;quot;} component={Home} /&amp;gt;&lt;br /&gt;
            &amp;lt;ProtectedRoute exact path={&amp;quot;/applist&amp;quot;}&lt;br /&gt;
                component={AppList}&lt;br /&gt;
             /&amp;gt;  &lt;br /&gt;
            &amp;lt;ProtectedAppRoute exact path={&amp;quot;/sectors&amp;quot;}&lt;br /&gt;
                component={Sectors}&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
        &amp;lt;/Switch&amp;gt;&lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/HashRouter&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.1: Zjednodušená ukážka použitia react-router-dom komponentov v aplikácií&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vytvorenie chránenej cesty'''&lt;br /&gt;
&lt;br /&gt;
Ak nastane situácia, kedy je ku komponentu možné pristúpiť iba v určitom prípade (napríklad používateľ musí byť prihlásený, aby získal prístup k určitým častiam aplikácie), treba použiť tzv. chránenú cestu (''ProtectedRoute''). Keďže React Router taký komponent neposkytuje a do aplikácie majú prístup iba prihlásený používatelia, je potrebné chránenú cestu vytvoriť. Chránená cesta sa vytvorí modifikovaním už existujúceho komponentu ''Route''. Vytváranie chránenej cesty je ukázané v kóde [[#lst:ProtectedRoute|[lst:ProtectedRoute]]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import React from 'react';&lt;br /&gt;
import { Route, Redirect } from 'react-router-dom';&lt;br /&gt;
export const ProtectedRoute = ({ component: Component,&lt;br /&gt;
                                            path, ...rest }) =&amp;gt; {&lt;br /&gt;
    // v premennej sa uchováva stav, či je používateľ prihlásený&lt;br /&gt;
    const isAuth = sessionStorage.getItem('isLoggedIn'); &lt;br /&gt;
    return (&lt;br /&gt;
        &amp;lt;Route    // vykreslenie klasického komponentu &amp;lt;Route&amp;gt;&lt;br /&gt;
            path={path}&lt;br /&gt;
            {...rest}&lt;br /&gt;
            render={props =&amp;gt; {&lt;br /&gt;
                return isAuth ?&lt;br /&gt;
                    &amp;lt;Component {...props} {...rest} /&amp;gt; &lt;br /&gt;
    /* ak používateľ nie je prihlásený, vykreslí sa &amp;lt;Redirect&amp;gt;,&lt;br /&gt;
    ktorý používateľa presmeruje na obrazovku Home */&lt;br /&gt;
                    : &amp;lt;Redirect to=&amp;quot;/&amp;quot; /&amp;gt;&lt;br /&gt;
            }} /&amp;gt;&lt;br /&gt;
    )&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.2: Vytvorenie chránenej cesty z komponentu &amp;lt;nowiki&amp;gt;&amp;lt;Route&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Získavanie a uchovávanie dát zo servera ==&lt;br /&gt;
&lt;br /&gt;
Všetky dáta, ktoré aplikácia eAurela získava a prezentuje používateľovi, získava zo vzdialeného servera. Prístup k údajom na serveri zabezpečuje REST API (časť [[#API|[API]]]). Aplikácia neponúka ukladanie dát pre neskoršie zobrazenie, ale vždy zobrazuje aktuálne dáta (funkčné požiadavky R06 a R08).&lt;br /&gt;
&lt;br /&gt;
=== Získavanie dát zo servera ===&lt;br /&gt;
&lt;br /&gt;
Existuje viacero spôsobov, ako komunikovať so vzdialeným serverom v React aplikácií. Väčšina vyžaduje dodatočnú inštaláciu knižnice určenej pre túto komunikáciu. V aplikácii eAurela však bol použitý spôsob priamo dostupný vo frameworku React, bez nutnosti inštalovať dodatočnú knižnicu. Pre túto komunikáciu slúži metóda ''fetch''. Táto metóda preberá minimálne jeden parameter a to práve URL adresu servera. V aplikácii eAurela sa odovzdávajú tejto metóde vždy 2 parametre. Prvý parameter je textový reťazec a predstavuje URL adresu servera. Druhý parameter je objekt, ktorého povinná vlastnosť je metóda (method). Tu sa určí typ metódy (post, get, put alebo delete). Ďalej sa v tomto objekte môže zadefinovať hlavička (headers) a telo (body) požiadavku. Tieto vlastnosti nie sú povinné a zadávajú sa podľa toho, ako je to zadefinované na strane servera. Obsahujú informácie, ktoré sú nevyhnutné pre správne odoslanie požiadavku. V hlavičke to môžu byť napríklad prihlasovacie údaje používateľa, JWT token pre autorizovanie, alebo aj meno aplikácie, do ktorej sa používateľ snaží prihlásiť. Pri vytváraní alebo upravovaní používateľa, spoločnosti, senzora a podobne, sa v tele požiadavku odošle táto informácia ako JSON objekt konvertovaný na textový reťazec.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
body: JSON.stringify({&lt;br /&gt;
                    login: this.state.login,&lt;br /&gt;
                    password: sha256(this.state.password),&lt;br /&gt;
                    firstname: this.state.firstname,&lt;br /&gt;
                    surname: this.state.surname,&lt;br /&gt;
                    isAdmin: this.state.isAdmin,&lt;br /&gt;
                    enabled: this.state.enabled,&lt;br /&gt;
                    Companies: this.state.Companies&lt;br /&gt;
                })&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.3: Príklad požiadavky pri vytváraní nového používateľa&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch(&amp;quot;http://login.nsoric.com/nsoric/auth/login/&amp;quot;,&lt;br /&gt;
    {&lt;br /&gt;
        method: 'POST',&lt;br /&gt;
        headers: { login: name, password: sha256(password) }&lt;br /&gt;
    }&lt;br /&gt;
)&lt;br /&gt;
    .then(response =&amp;gt; response.json())&lt;br /&gt;
    .then(result =&amp;gt; {&lt;br /&gt;
        if (result.user.enabled) &lt;br /&gt;
            this.props.handleSuccessfulAuth(result.user, result.JWT);&lt;br /&gt;
        else { &lt;br /&gt;
            if (result.message === &amp;quot;user does not exists&amp;quot;) &lt;br /&gt;
                alert(&amp;quot;Zle zadané prihlasovacie údaje!&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.4: Ukážka metódy fetch (zjednodušené prihlásenie používateľa do aplikácie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metóda fetch je asynchrónna a teda vracia dátový typ ''promise''. To znamená, že metóda vráti synchrónne objekt promise ako dočasnú návratovú hodnotu predtým, než bude známa reálna hodnota. Potom, čo sa asynchrónna operácia dokončí, objekt zavolá callbak s výsledkom alebo chybou. Je to z toho dôvodu, aby aplikácia mohla normálne fungovať, kým získa odpoveď zo servera. Promise môže nadobúdať 3 stavy:&lt;br /&gt;
&lt;br /&gt;
* '''Čakajúci (Pending)''' - v tomto stave je zahájená asynchrónna operácia, ale ešte nie je známy výsledok,&lt;br /&gt;
* '''Splnený (Resolved alebo aj Fulfilled)''' - v tomto stave je asynchrónna operácia dokončená úspešne a objekt volá úspešný callback,&lt;br /&gt;
* '''Zamietnutý (Rejected)''' - v tomto stave je asynchónna operácia dokončená neúspešne a objekt volá neúspešný callback. .&lt;br /&gt;
&lt;br /&gt;
Konkrétne príklady dátového typu promise z aplikácie je možné vidieť v časti [[#serverResponses|[serverResponses]]] na obrázku [[#fig:response1|[fig:response1]]] (splnený stav) a na obrázkoch [[#fig:response404|[fig:response404]]] a [[#fig:response500|[fig:response500]]] (zamietnutý stav). Na obrázku [[#fig:response2|[fig:response2]]] je vidieť hodnotu, ktorú vrátila callback funkcia po úspešnom dokončení asynchrónnej funkcie.&lt;br /&gt;
&lt;br /&gt;
V kóde [[#fetchRequest|[fetchRequest]]] sú v premennej ''response'' uložené práve informácie o promise objekte (stav a hodnota). V premennej ''result'' je už uložená finálna hodnota zo serveru vo formáte JSON.&lt;br /&gt;
&lt;br /&gt;
=== Uchovávanie dát ===&lt;br /&gt;
&lt;br /&gt;
Ako bolo spomenuté v časti [[#sec:IntroToReact|[sec:IntroToReact]]], komponenty v React aplikácií majú svoje vlastnosti (props) a spravujú svoj vnútorný stav (state). Na základe stavu a vlastností je postavená komunikácia medzi jednotlivými komponentmi v aplikácií. Vo vnútri jedného komponentu sa definuje stav a ten sa odovzdá druhému komponentu ako jeho vlastnosť. Problém nastáva pri obnovení stránky (okna aplikácie). Pri obnovení stránky sa obnovuje aj stav komponentov (a teda s tým spojené aj vlastnosti). Aby sa zabránilo strate dát uchovaných v stave komponentu, existujú 2 možnosti:&lt;br /&gt;
&lt;br /&gt;
* ukladanie dát do lokálneho úložiska prehliadača (localStorage a sessionStorage),&lt;br /&gt;
* nastavovanie stavu po každom vykreslení komponentu (metóda componentDidMount).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Lokálne úložisko prehliadača'''&lt;br /&gt;
&lt;br /&gt;
Internetové aplikácie môžu ukladať dáta lokálne do úložiska používateľovho prehliadača. Tieto úložiská sú takmer rovnaké, jediným rozdielom je, že dáta uložené v localStorage nemajú žiadnu expiračnú dobu. V aplikácií eAurela je používaný sessionStorage, ktorý je automaticky vymazaný pri zatvorení prehliadača (v tomto prípade aj pri zatvorení Electron aplikácie). Ten v aplikácii uchováva dôležité informácie zo servera, ktoré nemôžu byť počas chodu aplikácie stratené. Jedná sa napríklad o údaje prihláseného používateľa (aplikácia tak vie, kto je prihlásený), JWT token, ktorý je posielaný v každej požiadavke na server. Pri strate týchto údajov po obnovení stránky, by sa aplikácia stala nefunkčnou. Tieto úložiská uchovávajú dáta vo forme textového reťazca. Preto dáta iného dátového typu treba vždy pred uložením konvertovať na textový reťazec.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sessionStorage.setItem('user', JSON.stringify(res1));&lt;br /&gt;
sessionStorage.setItem('JWT', res2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.5: Príklad uloženia hodnôt do sessionStorage&lt;br /&gt;
&lt;br /&gt;
V kóde [[#sessionStorage.setItem|[sessionStorage.setItem]]] sú prvé parametre (’user’ a ’JWT’) názov, pod ktorým budú dáta dostupné a druhé parametre sú samotné dáta, ktoré sa ukladajú. Získanie dát zo sessionStorage je ukázané v kóde [[#sessionStorage.getItem|[sessionStorage.getItem]]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const user = JSON.parse(sessionStorage.getItem('user'));&lt;br /&gt;
const jwt = sessionStorage.getItem('JWT');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.6: Príklad použitia hodnôt zo sessionStorage&lt;br /&gt;
&lt;br /&gt;
Síce sa sessionStorage vymaže automaticky pri zatvorení aplikácie, treba ho manuálne vymazať v prípade, že sa používateľ odhlási zo systému, no aplikáciu eAurela nechá otvorenú. Pre manuálne vymazanie celého obsahu úložiska slúži metóda ''sessionStorage.clear()''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Metóda ''componentDidMount'' '''&lt;br /&gt;
&lt;br /&gt;
Ďalšou možnosťou, ako predísť strate údajov, je posielanie požiadaviek a následné nastavovanie stavu v metóde ''componentDidMount''. Táto metóda prebehne vždy, keď je komponent vykreslený. Posielanie požiadaviek na server (fetch) je doporučené robiť práve v tejto metóde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
componentDidMount() {&lt;br /&gt;
    this.setState({ isLoading: true })&lt;br /&gt;
    const ID = this.props.activeSector.id;&lt;br /&gt;
    fetch(this.state.url + &amp;quot;/manage/sector/&amp;quot; + ID + &amp;quot;/last-values/&amp;quot;,&lt;br /&gt;
        {&lt;br /&gt;
            method: 'GET',&lt;br /&gt;
            headers: {Authorization: &amp;quot;Bearer &amp;quot; + this.state.jwt}&lt;br /&gt;
        }&lt;br /&gt;
    )&lt;br /&gt;
        .then(response =&amp;gt; response.json())&lt;br /&gt;
        .then(result =&amp;gt; {&lt;br /&gt;
            // nastavenie stavu z odpovede zo servera&lt;br /&gt;
            this.setState({ Sensors: result, isLoading: false })&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; console.log(error))&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.7: Odoslanie požiadavku v metóde componentDidMount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keďže namerané hodnoty zo senzorov majú byť vždy aktuálne, získavajú sa v tejto metóde. Komponent tak vždy po obnovení stránky má novú odpoveď zo servera s aktuálnymi nameranými hodnotami. Komponent obsahujúci metódu ''componentDidMount'' sa vždy vykresľuje na dvakrát. Napríklad v komponente ''Sectors'' sa najskôr vykreslia základné informácie o oblastiach a sektoroch a ikona načítavania, ktorá hovorí o tom, že aplikácia komunikuje so serverom (prebieha metóda componentDidMount).&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_componentDidMount.png|thumb|500px|Obr 4.7 Vykreslenie komponentu bez dát zo servera&amp;lt;span label=&amp;quot;fig:DidMount&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Hneď ako aplikácia dostane odpoveď zo servera, ktorá obsahuje aktuálne údaje, na obrazovku sa dodatočne vykreslia tieto údaje bez toho, aby sa ostatné časti komponentu znovu vykresľovali.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_componentDidMount1.png|thumb|500px|Obr 4.8 Vykreslenie komponentu s dátami zo servera&amp;lt;span label=&amp;quot;fig:DidMount1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== Návrh dizajnu aplikácie ==&lt;br /&gt;
&lt;br /&gt;
Komponenty v aplikácií sú základným stavebným blokom používateľského rozhrania. Ich vzhľad tvorí veľkú časť toho, ako bude aplikácia nakoniec vyzerať, ako ju bude vidieť samotný používateľ. Možností, ako upravovať štýl a vzhľad komponentov, je viacero. V aplikácií sú používané dva spôsoby úpravy vzhľadu komponentov: pomocou štylizovaných komponentov a pomocou CSS.&lt;br /&gt;
&lt;br /&gt;
=== Štylizované komponenty ===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob úpravy dizajnu je v aplikácií využívaný najviac. Pre jednoduchosť bola použitá knižnica ''reactstrap'' (http://reactstrap.github.io/), ktorá obsahuje už vytvorené komponenty s hotovým dizajnom. Tie sú jednoducho vložené do vnútra komponentu, kde majú byť použité. Reactstrap je knižnica obsahujúca komponenty z ''React Bootstrap 4''. Knižnica nie je závislá na jQuery alebo na Bootstrap javascript.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Komponenty pre interakciu s používateľom: &amp;amp;lt;Input&amp;amp;gt;, &amp;amp;lt;Table&amp;amp;gt; a &amp;amp;lt;Form&amp;amp;gt; '''&lt;br /&gt;
&lt;br /&gt;
Keďže React používa syntax JSX (časť [[#sec:IntroToReact|[sec:IntroToReact]]]), pre interakciu s používateľom boli použité komponenty Input a Form. Tieto komponenty fungujú na podobnom princípe, ako v jazyku HTML. Input slúži ako vstup, kam používateľ zadáva údaje (text, heslo a podobne). Form je formulár, v ktorom sa nachádza viacero vstupných polí a potvrdením tohto formulára sa odosiela požiadavka na server.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_LoginForm.png|thumb|500px|Obr 4.9 Formulár pre prihlásenie do aplikácie&amp;lt;span label=&amp;quot;fig:LoginForm&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
V časti spravovania systému boli údaje pre ich sprehľadnenie vypísané na obrazovku do tabuľky. Pri upravovaní údajov zo servera bol použitý formulár, ktorý obsahoval tabuľku so vstupnými poľami (viď obrázok [[#fig:Table|1.10]]).&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_Table.png|thumb|500px|Obr 4.10 Formulár s tabuľkou pre vytvorenie používateľa&amp;lt;span label=&amp;quot;fig:Table&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Komponenty pre zobrazenie informácií: &amp;amp;lt;Card&amp;amp;gt;, &amp;amp;lt;ListGroup&amp;amp;gt; '''&lt;br /&gt;
&lt;br /&gt;
Komponent Card (karta) v aplikácií zobrazuje informácie získané zo servera. Karta sa skladá z viacerých ďalších komponentov (potomkov), ktoré slúžia pre presné zadefinovanie miesta, kde bude údaj zobrazený. To slúži pre prehľadné zobrazenie dát. Prvý doplňujúci komponent karty je hlavička karty (CardHeader). V komponente Applist sa do hlavičky vypisuje názov spoločnosti, spolu aj s malým logom. Pri údajoch zo senzorov (obrazovka Sectors) sa do hlavičky vypisuje názov senzora a stav batérie (ak daný senzor batériu má). Ďalší dôležitý komponent pri vykresľovaní karty je jej telo (CardBody). V okne Applist je do tela karty vložený titulok (CardTitle). Ten zobrazuje doplňujúce informácie o spoločnosti, ako adresu a podobne. Najdôležitejší komponent v tele karty je ListGroup. Tento komponent slúži pre vypísanie zoznamu aplikácií v danej spoločnosti, z ktorej si používateľ môže vybrať a prihlásiť sa do nej. V časti ''Sectors'' je telo karty použité na zobrazenie ID senzora, poslednej nameranej hodnoty zo senzora spolu s dátumom a časom, kedy bola táto hodnota nameraná.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_Cards.png|thumb|500px|Obr 4.11 Použitie karty pre výpis údajov&amp;lt;span label=&amp;quot;fig:Cards&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Komponenty pre navigáciu: &amp;amp;lt;Navbar&amp;amp;gt;, &amp;amp;lt;Nav&amp;amp;gt;, &amp;amp;lt;NavLink&amp;amp;gt; '''&lt;br /&gt;
&lt;br /&gt;
Tieto komponenty slúžia pre jednoduchú navigáciu, či už medzi jednotlivými časťami aplikácie, alebo pri prechádzaní informácií. Za zmienku stojí v tejto časti komponent ''NavLink''. Komponent s takým istým názvom je aj v knižnici ''react-router-dom'' (časť [[#navigation|1.2]]). Tieto komponenty vykonávajú v podstate to isté, rozdiel je v dizajne. Nevýhoda tohto komponentu je obnovenie obrazovky po kliknutí na tento odkaz, s čím môžu nastať problémy, ako boli popísané v časti [[#subsec:propsandstate|1.3.2]]. Aby sa odstránilo obnovovanie stránky pri kliknutí na odkaz, priradí sa mu funkcionalita komponentu ''Link'' z knižnice ''react-router-dom'', ktorý presmeruje používateľa bez obnovenia stránky. Takto zapísaný ''NavLink'' sa správa ako ''Link'', pričom mu zostane jeho dizajn. Takisto obsahuje vlastnosť ''active'', ktorá v aplikácií slúži na zvýraznenie časti, v ktorej sa používateľ nachádza (viď obr. [[#fig:navbar|1.12]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;NavLink&lt;br /&gt;
    tag={Link}      // priradenie funkcionality komponentu &amp;lt;Link&amp;gt;&lt;br /&gt;
    to={props.path} // cesta, kam bude používateľ presmerovaný&lt;br /&gt;
    onClick={handleClick} // funkcia vykonaná po kliknutí&lt;br /&gt;
    &amp;gt;  &lt;br /&gt;
    {props.link}    // hodnotu vlastnosti vidí používateľ ako odkaz&lt;br /&gt;
&amp;lt;/NavLink&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.8: Príklad prepojenia komponentov &amp;lt;nowiki&amp;gt;&amp;lt;NavLink&amp;gt; a &amp;lt;Link&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Komponenty ''Nav'' a ''Navbar'' slúžia ako rodičovské komponenty pre zoskupenie viacerých prvkov na navigáciu, alebo zobrazenie rôznych informácií. Rozdiel je v tom, že ''Navbar'' má viacero možností nastavenia vzhľadu (od ktorých sa odvíja aj vzhľad &amp;amp;quot;potomkov&amp;amp;quot;), ale dá sa použiť iba horizontálne, pričom ''Nav'' sa dá použiť aj vertikálne.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_SectorsNavbar.png|thumb|500px|Obr 4.12 Komponenty &amp;amp;lt;NavLink&amp;amp;gt;, &amp;amp;lt;Nav&amp;amp;gt; a &amp;amp;lt;Navbar&amp;amp;gt;&amp;lt;span label=&amp;quot;fig:navbar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Úprava vzhľadu pomocou CSS ===&lt;br /&gt;
&lt;br /&gt;
V aplikácií bol taktiež na úpravu vzhľadu použitý jazyk CSS. Pre nastavenie základných vlastností aplikácie eAurela, ako štýl písma a podobne, bol použitý klasický spôsob vloženia odkazu na externý .css súbor do koreňového komponentu aplikácie. Taktiež aj pre dodatočnú úpravu niektorých komponentov z knižnice ''reactstrap'' bol zvolený tento spôsob. React dovoľuje ale aj používanie CSS priamo vo vnútri komponentov. Tento spôsob bol použitý v aplikácií najmenej a bol použitý hlavne na prvky, ktorých vzhľad bolo treba dynamicky meniť (ako napríklad komponent ''NavLink'' pri nastavení spomenutej vlastnosti ''active'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;NavLink&lt;br /&gt;
    tag={Link}&lt;br /&gt;
    /* štýl sa bude meniť vzhľadom na pravdivostnú&lt;br /&gt;
    hodnotu premennej props.Graphs */&lt;br /&gt;
    style={!props.Graphs ? {&lt;br /&gt;
    color: &amp;quot;black&amp;quot;,&lt;br /&gt;
    backgroundColor: &amp;quot;white&amp;quot;,&lt;br /&gt;
    boxShadow: &amp;quot;0px 0px 0px 1px lightgrey&amp;quot;&lt;br /&gt;
    } : style}&lt;br /&gt;
    to=&amp;quot;sectors&amp;quot;&lt;br /&gt;
    active={!props.Graphs}&lt;br /&gt;
&amp;lt;/NavLink&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.9: Dynamické nastavenie štýlu komponentu &amp;lt;nowiki&amp;gt;&amp;lt;NavLink&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vykreslovanie grafov ==&lt;br /&gt;
&lt;br /&gt;
Vzhľadom na funkčnú požiadavku R08 bolo potrebné v aplikácií eAurela zabezpečiť prácu s grafmi. Pre framework React existuje viacero knižníc pre prácu a zobrazenie grafov. V aplikácii eAurela je použitá knižnica ''recharts'' (http://recharts.org/en-US/) pre jej bezplatnú dostupnosť a veľmi dobre vypracovanú dokumentáciu. Graf sa vykresľuje v samostatnom komponente ''SensorGraphs'', ktorý je následné vykreslený v komponente ''Sectors'' po zvolení možnosti ''&amp;amp;quot;Časový záznam&amp;amp;quot;''. Na nasledujúcom obrázku je zobrazený graf v aplikácii eAurela s hodnotami z časového intervalu tridsať dní.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_SensorGraphs.png|thumb|500px|Obr 4.13 Vykreslenie grafu v komponente &amp;amp;lt;Sectors&amp;amp;gt;&amp;lt;span label=&amp;quot;fig:Graph&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Knžinica recharts ponúka veľké množstvo grafov, či už čiarové, stĺpcové, koláčové a podobne. Keďže má aplikácia vykresľovať zmenu nameraných hodnôt z časového intervalu všetkých senzorov nachádzajúcich sa v sektore, bol použitý základný čiarový graf (LineChart). Vzhľadom na to, že v jednom grafe sa bude nachádzať viacero kriviek (podľa počtu senzorov), z dokumentácie ''recharts'' bol vybraný čiarový graf s názvom ''&amp;amp;quot;LineChartHasMultiSeries&amp;amp;quot;''. Aby boli jednotlivé krivky správne vykreslené, komponent LineChart musí prevzať dáta upravené do správneho formátu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const series = [&lt;br /&gt;
  {&lt;br /&gt;
    name: 'Senzor 1',&lt;br /&gt;
    data: [&lt;br /&gt;
        {&lt;br /&gt;
            date: &amp;quot;&amp;quot;,&lt;br /&gt;
            value: &lt;br /&gt;
        },&lt;br /&gt;
        { ... }, ...&lt;br /&gt;
    ],&lt;br /&gt;
  },&lt;br /&gt;
  { ... }, ...&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.10: Vzor formátu dát pre LineChart&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Konštanta ''series'' je pole, kde každý prvok poľa predstavuje objekt s dvoma vlastnosťami: ''name'' a ''data''. Vlastnosť ''name'' obsahuje názov senzora, ktorý bude vypísaný v legende spolu s odpovedajúcou farbou krivky. Vlastnosť ''data'' obsahuje konkrétne namerané dáta. ''Data'' je taktiež pole objektov, kde jednotlivé objekty obsahujú taktiež dve vlastnosti: ''date'' (dátum, kedy bola hodnota nameraná) a ''value'' (nameraná hodnota). Táto konštanta je zadefinovaná vo funkcii pre vykreslenie komponentu (render).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
render() {&lt;br /&gt;
    const series = this.getChartData(Sensors, Measurements);&lt;br /&gt;
    return ( ... )&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.11: Zadefinovanie konštanty series&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V odpovedi zo servera dostaneme dve polia: ''sensors'', kde sú uložené všeobecné informácie o senzoroch a ''measurements'', kde sú namerané hodnoty za dané obdobie. Takáto odpoveď zo serveru vyzerá podobne ako na obrázku obr. [[#fig:ServerValues|1.14]].&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_ServerValues.png|thumb|500px|Obr 4.14 Odpoveď zo servera pri vykreslovaní grafu&amp;lt;span label=&amp;quot;fig:ServerValues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
O spracovanie údajov zo servera do správneho formátu sa v aplikácií starajú dve metódy. Prvá metóda je ''getChartData'', ktorá ako parametre preberá namerané údaje zo servera (measurements), a taktiež všetky údaje o senzoroch (sensors). Táto metóda prechádza pole všetkých senzorov a pre vyhovujúce senzory (nevyhovujúce sú v tomto prípade senzory snímajúce stav batérie) priradí názov senzora.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
getChartData(sensors, measurements) {&lt;br /&gt;
        let chartData = [];&lt;br /&gt;
            for (let i = 0; i &amp;lt; sensors.length; i++) {&lt;br /&gt;
                if (isNaN(sensors[i].uid) || this.DecToBin(sensors[i].uid).substring(0, 8) !== &amp;quot;00000000&amp;quot;) {&lt;br /&gt;
                    chartData[i] = {&lt;br /&gt;
                        name: sensors[i].name,&lt;br /&gt;
                        data: this.getData(sensors[i].uid, measurements)&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
    return chartData;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.12: Metóda getChartData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pre zjednodušenie ukážky boli z kódu odstránené dodatočné podmienky ošetrujúce výnimočné stavy, ktoré môžu nastať pri komunikovaní so serverom. Práve v týchto podmienkach je použitý parameter ''measurements''. Taktiež je použitý ako vstupný parameter funkcie ''getData'', ktorá vyplní vlastnosť ''data'' konkrétnymi hodnotami (dátumom, časom a konkrétnou hodnotou). Táto metóda preberá ako vstupný parameter aj ID senzora, aby bolo možné prideliť namerané hodnoty k správnemu senzoru. Táto metóda prechádza všetky namerané údaje a hľadá tie, ktoré boli namerané senzorom s príslušným ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
getData(id, measurements) {&lt;br /&gt;
    let data = [];&lt;br /&gt;
    let k = 0;&lt;br /&gt;
    for (let i = (measurements.length - 1); i &amp;gt;= 0; i--) {&lt;br /&gt;
        for (let j = 0; j &amp;lt; measurements[i].values.length; j++) {&lt;br /&gt;
            if (id === measurements[i].values[j].sid) {&lt;br /&gt;
                data[k] = {&lt;br /&gt;
                    date: measurements[i].date.substring(0, 10) + &amp;quot; &amp;quot; + measurements[i].date.substring(11, 19),&lt;br /&gt;
                    value: measurements[i].values[j].value !== null ? measurements[i].values[j].value : null&lt;br /&gt;
                }   &lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        k++;    &lt;br /&gt;
    }&lt;br /&gt;
    return data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.13: Metóda getData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aj v tejto ukážke boli pre zjednodušenie kódu vynechané podmienky ošetrujúce stavy, spôsobujúce chyby v aplikácií.&lt;br /&gt;
&lt;br /&gt;
Samotný komponent ''LineChart'' sa skladá z viacerých ďalších komponentov, ktoré upresňujú rozloženie jednotlivých prvkov grafu a umiestnenie údajov. ''ResponsiveContainer'' definuje šírku a výšku grafu. Komponenty ''XAxis'' a ''YAxis'' určujú, ktoré dáta sú vykreslené na každej z osí, či sa jedná o textové, alebo číselné údaje. Komponent ''Legend'' vykresľuje legendu ku grafu, ''Tooltip'' zobrazí nápovedu o konkrétnom dátume (nápovedu používateľ zobrazí prejdením kurzora do časti grafu, kde si chce prezrieť konkrétne hodnoty). ''Line'' je samotná krivka, ktorej sa definujú dáta, ktoré sa použijú na vykreslenie. Keďže v aplikácií sa vykresľuje viacero kriviek do jedného grafu, bola použitá javascriptová metóda ''map'' pre prechádzanie konštanty ''series'' a pre každý jej prvok sa vykreslí vlastná krivka. Kód [[#LineChart|[LineChart]]] zobrazuje implementáciu grafu v aplikácií aj s popisom jednotlivých častí a výsledný graf je možné vidieť na obrázku [[#fig:TooltipGraph|1.15]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ResponsiveContainer width=&amp;quot;95%&amp;quot; height=&amp;quot;90%&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;LineChart&amp;gt;&lt;br /&gt;
    &amp;lt;CartesianGrid strokeDasharray=&amp;quot;3 3&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;XAxis&lt;br /&gt;
        dataKey=&amp;quot;date&amp;quot;      // dáta zobrazené na osi X&lt;br /&gt;
        type=&amp;quot;category&amp;quot;     // textový údaj (dátum a čas)&lt;br /&gt;
        allowDuplicatedCategory={false} // údaj sa nesmie opakovať&lt;br /&gt;
        minTickGap={10} /&amp;gt;  // medzera medzi údajmi v popise&lt;br /&gt;
    &amp;lt;YAxis dataKey=&amp;quot;value&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Tooltip /&amp;gt;&lt;br /&gt;
    &amp;lt;Legend /&amp;gt;&lt;br /&gt;
    {series.map((s, index) =&amp;gt; (&lt;br /&gt;
        &amp;lt;Line&lt;br /&gt;
            key={index}     &lt;br /&gt;
            dataKey=&amp;quot;value&amp;quot;     // kľúčová hodnota&lt;br /&gt;
            data={s.data}       // pôvod dát&lt;br /&gt;
            name={s.name}       // názov senzoru&lt;br /&gt;
            stroke={this.getRandomColor()}  // farba krivky&lt;br /&gt;
            dot={false} /&amp;gt;&lt;br /&gt;
    ))}&lt;br /&gt;
    &amp;lt;/LineChart&amp;gt;&lt;br /&gt;
&amp;lt;/ResponsiveContainer&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 4.14: Implementácia grafu LineChart&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vzhľadom na to, že ''recharts'' pri vykreslení viacerých kriviek do jedného grafu priradí všetkým základnú (rovnakú) farbu, bola pre lepšie rozlíšenie kriviek implementovaná funkcia ''getRandomColor'', ktorá každej krivke priradí náhodnú farbu.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_TooltipGraph.png|thumb|500px|Obr 4.15 Ukážka grafu s popisom jednotlivých komponentov&amp;lt;span label=&amp;quot;fig:TooltipGraph&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=N%C3%A1stroje_pou%C5%BEit%C3%A9_na_v%C3%BDvoj_aplik%C3%A1cie_eAurela&amp;diff=12902</id>
		<title>Nástroje použité na vývoj aplikácie eAurela</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=N%C3%A1stroje_pou%C5%BEit%C3%A9_na_v%C3%BDvoj_aplik%C3%A1cie_eAurela&amp;diff=12902"/>
		<updated>2020-10-19T19:33:31Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Zamkol stránku „Nástroje použité na vývoj aplikácie eAurela“ ([Úprava=Povoliť iba správcom] (na neurčito) [Presun=Povoliť iba správcom] (na neurčito))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]][[Kategória:Bakalárske práce]][[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
{{Praca_uvod|3|Klientská aplikácia pre zobrazenie dát ako súčasť senzorického informačného systému|Informačný systém Sensorical|Analýza požiadaviek a štruktúra klientskej aplikácie|Nástroje použité na vývoj aplikácie eAurela|Implementácia aplikácie eAurela|Uvedenie aplikácie eAurela do produkcie}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= =&lt;br /&gt;
&lt;br /&gt;
Vo vývoji aplikácie eAurela boli použité viaceré nástroje. Keďže má byť aplikácia eAurela dostupná na platformách Windows, Linux, Mac OS a aj ako internetová aplikácia (nefunkčná požiadavka R01), je naprogramovaná pomocou dvoch javascriptových frameworkov: ''React.js'' a ''Electron.js''. Keďže je Electron postavený na ''Node.js'', bolo počas vývoja potrebné použiť aj toto javascriptové behové prostredie.&lt;br /&gt;
&lt;br /&gt;
== Framework React.js ==&lt;br /&gt;
&lt;br /&gt;
React je javascriptová knižnica s otvoreným zdrojovým kódom (open-source) od spoločnosti Facebook. Slúži na tvorbu používateľského rozhrania (UI). Od rôznych iných javascriptových frameworkov sa React odlišuje tým, že sa sústredí iba na jednu špecifickú oblasť a tvorí iba vrstvu pohľadu (view), ktorá prezentuje dáta používateľovi. Jednou z najväčších výhod Reactu je, že povoluje JSX syntax. Táto syntax je rozšírením javascriptu a umožňuje nám písať HTML kód priamo do javascriptového kódu, čo zjednodušuje celý proces . Základným stavebným prvkom React aplikácie sú tzv. komponenty (components). Komponenty sú rôzne znovu použiteľné JSX elementy so zapuzdrenou funkcionalitou. Ich skladaním vzniká komplexná UI aplikácia. Tieto komponenty majú svoje vlastnosti (props) a spravujú svoj vnútorný stav (state). Tento spôsob práce s dátami vedie k viac predvídateľnému správaniu a aj ľahšiemu ladeniu. React je možné používať aj s ďalšími podobne zameranými knižnicami, ako je napríklad Redux, alebo Electron .&lt;br /&gt;
&lt;br /&gt;
=== Komponenty a vlastnosti ===&lt;br /&gt;
&lt;br /&gt;
Komponenty nám umožňujú rozdeliť používateľské rozhranie na nezávislé, znovu použiteľné časti. Koncepčne sú ako javascriptové funckie. Prijímajú ľubovoľné vstupy (props) a vracajú reactové elementy, popisujúce, čo by sa malo zobraziť na obrazovke. Komponenty môžu byť funkcionálne alebo triedne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Funkcionálne komponenty '''&lt;br /&gt;
&lt;br /&gt;
Najjednoduchší spôsob, ako zadefinovať komponent, je napísať javascriptovú funkciu (viď kód [[#functionalComponent|[functionalComponent]]]).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function Welcome(props) {&lt;br /&gt;
  return &amp;lt;h1&amp;gt;Hello, {props.name}&amp;lt;/h1&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 3.1: Príklad funkcionálneho komponentu [8]&lt;br /&gt;
&lt;br /&gt;
Táto funkcia je plnohodnotný komponent, pretože prijíma vlastnosť (props ako properties) s dátami a vracia reactový element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Triedny komponent'''&lt;br /&gt;
&lt;br /&gt;
Pre zadefinovanie komponentu sa môže taktiež použiť trieda z ES6 (verzia javascriptu ECMAScript 6).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
class Welcome extends React.Component {&lt;br /&gt;
  render() {&lt;br /&gt;
    return &amp;lt;h1&amp;gt;Hello, {this.props.name}&amp;lt;/h1&amp;gt;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 3.2: Príklad triedneho komponentu [8]&lt;br /&gt;
&lt;br /&gt;
Takto zadefinovaný komponent je rovnaký ako uvedený funkcionálny komponent v kóde [[#functionalComponent|[functionalComponent]]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vykreslenie komponentu'''&lt;br /&gt;
&lt;br /&gt;
Spomenuté elementy, popisujúce čo by sa malo na obrazovke vykresliť môžu byť buď reactové elementy, ktoré reprezentujú DOM (Document Object Model) značky (tagy). Každopádne elementy môžu reprezentovať aj používateľom zadefinované komponenty .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// DOM tag&lt;br /&gt;
const element = &amp;lt;div /&amp;gt;; &lt;br /&gt;
// používateľom definovaný komponent&lt;br /&gt;
const element = &amp;lt;Welcome name=&amp;quot;Sara&amp;quot; /&amp;gt;; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 3.3: Dom tag a používateľom definovaný komponent [8]&lt;br /&gt;
&lt;br /&gt;
Keď React uvidí element reprezentujúci používateľom zadefinovaný komponent, podá tomuto komponentu JSX atribúty a všetkých potomkov ako jeden objekt. Tento objekt sa nazýva ''props'' (vlastnosti). React sa ku komponentom začínajúcim malým písmenom správa ako k DOM značkám (napríklad &amp;amp;lt;div /&amp;amp;gt; reprezentuje HTML div tag). Používateľom definovaný komponent musí začínať veľkým písmenom. Je to z toho dôvodu, že React predáva tieto elementy metóde ''React.createElement(parameter)''. V prípade, že sa jedná o element začínajúci malým písmenom, tejto metóde sa ako parameter podá názov elementu ako textový reťazec. Ak element začína veľkým písmenom, tejto metóde sa podá celý komponent ako objekt .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vlastnosti v komponentoch'''&lt;br /&gt;
&lt;br /&gt;
Konfiguráciu a predávanie dát do komponentu majú na starosti vlastnosti (props). Vlastnosti sú dáta určené iba na čítanie (read-only). Či je komponent definovaný ako trieda alebo funkcia, nikdy nesmie modifikovať a meniť hodnotu vlastnostiam. Funkcie, ktoré nikdy neprepisujú svoje vstupné parametre sa nazývajú čisté (pure) funkcie. Takáto funkcia vráti pri rovnakom vstupe vždy ten istý výsledok. Opakom takejto funkcie je funkcia nečistá (impure), ktorá môže meniť svoj vstup. Všetky reactové komponenty sa musia správať ako čisté funkcie vzhľadom na ich vlastnosti .&lt;br /&gt;
&lt;br /&gt;
=== Stav aplikácie ===&lt;br /&gt;
&lt;br /&gt;
Stav (state) je podobný vlastnostiam. Používa sa ale výhradne vo vnútri komponentu pre riadenie toku dát. Sú to teda privátne dáta komponentu. Stav sa deklaruje v konštruktore triedneho komponentu. V konštruktore sa nastaví počiatočný stav, ktorý môže byť počas behu aplikácie menený. Pre zmenu stavu sa používa metóda ''setState()'', a teda stav nikdy nie je menený priamo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Wrong&lt;br /&gt;
this.state.comment = 'Hello';&lt;br /&gt;
// Correct&lt;br /&gt;
this.setState({ comment : 'Hello' }) ;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 3.4: Aktualizovanie stavu [10]&lt;br /&gt;
&lt;br /&gt;
Výraz ''this.state'' môže byť pre nastavenie stavu použitý iba v konštruktore komponentu. Aktualizovanie stavu spolu s vlastnosťami môže byť asynchrónne, a preto by sa nemalo spoliehať na ich hodnoty pre výpočet nového stavu. Aby sa zabránilo tomuto správaniu, používa sa druhý spôsob zápisu metódy ''setState'', ktorý prijíma funkciu a nie objekt. Táto funkcia dostane ako prvý parameter predchádzajúci stav a ako druhý parameter dostane vlastnosť, v čase kedy je vykonaná aktualizácia. V kóde [[#setStateFunction|[setStateFunction]]] je použitá šípková funkcia, každopádne to tiež správne funguje s regulárnou funkciou .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
this.setState((state , props ) =&amp;gt; ({&lt;br /&gt;
counter : state.counter + props.increment&lt;br /&gt;
})) ;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 3.5: Použitie šípkovej funkcie vo vnútri setState [10]&lt;br /&gt;
&lt;br /&gt;
== Framework Electron.js ==&lt;br /&gt;
&lt;br /&gt;
Electron je open-source projekt, ktorý slúži na vývoj a implementáciu multiplatformných desktopových aplikácií. Aplikácie naprogramované pomocou Electronu sú kompatibilné s operačnými systémami Mac, Windows a Linux.&lt;br /&gt;
&lt;br /&gt;
Electron používa Chromium, čo je open-source verzia prehliadača Google Chrome. Ďalej používa Node.js, čo umožňuje vyvíjať desktopové aplikácie pomocou HTML, CSS a javascriptu. V tomto frameworku sú naprogramované populárne aplikácie, ako napríklad Visual Studio Code, Atom editor, Discord a mnoho ďalších.&lt;br /&gt;
&lt;br /&gt;
=== Vývoj Electron aplikácie ===&lt;br /&gt;
&lt;br /&gt;
Pokiaľ ide o vývoj, Electron aplikácia je v podstate Node.js aplikácia. Východiskovým súborom je ''package.json'', ktorý je totožný s východiskovým modulom Node.js. Súbor ''package.json'' obsahuje informácie o hlavnom procese a taktiež všetky závislosti aplikácie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;eaurela&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;0.1.0&amp;quot;,&lt;br /&gt;
  &amp;quot;main&amp;quot;: &amp;quot;./main.js&amp;quot;,&lt;br /&gt;
  &amp;quot;private&amp;quot;: true,&lt;br /&gt;
  &amp;quot;dependencies&amp;quot;: {&lt;br /&gt;
    &amp;quot;react&amp;quot;: &amp;quot;^16.12.0&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;scripts&amp;quot;: {&lt;br /&gt;
    &amp;quot;start&amp;quot;: &amp;quot;react-scripts start&amp;quot;,&lt;br /&gt;
    &amp;quot;build&amp;quot;: &amp;quot;react-scripts build&amp;quot;,&lt;br /&gt;
    &amp;quot;electron-win&amp;quot;: &amp;quot;set ELECTRON_DISABLE_SECURITY_WARNINGS=true &amp;amp;&amp;amp; set ELECTRON_START_URL=http://localhost:3000/ &amp;amp;&amp;amp; electron .&amp;quot;,&lt;br /&gt;
    &amp;quot;dev-win&amp;quot;: &amp;quot;concurrently -k \&amp;quot;npm start\&amp;quot; \&amp;quot;wait-on http://localhost:3000 &amp;amp;&amp;amp; npm run electron-win\&amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;package-win&amp;quot;: &amp;quot;electron-packager . --platform=win32 --arch=x64&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   },&lt;br /&gt;
  &amp;quot;devDependencies&amp;quot;: {&lt;br /&gt;
    &amp;quot;concurrently&amp;quot;: &amp;quot;^5.0.0&amp;quot;,&lt;br /&gt;
    &amp;quot;electron&amp;quot;: &amp;quot;^9.0.0&amp;quot;,&lt;br /&gt;
    &amp;quot;wait-on&amp;quot;: &amp;quot;^3.3.0&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 3.6: Vzor súboru package.json&lt;br /&gt;
&lt;br /&gt;
Súbor ''package.json'' je vlastne javascriptový objekt, pričom jednotlivé vlastnosti musia byť v úvodzovkách. Skladá sa z viacerých častí. Prvok ''&amp;amp;quot;name&amp;amp;quot;'' je názov aplikácie, ''&amp;amp;quot;version&amp;amp;quot;'' hovorí o verzii aplikácie. Jedna z najdôležitejších vlastností je ''&amp;amp;quot;main&amp;amp;quot;''. Tá odkazuje na hlavný proces, ktorý sa spustí pri spustení aplikácie. Ďalšie dôležité prvky sú ''&amp;amp;quot;dependencies&amp;amp;quot;'' a ''&amp;amp;quot;scripts&amp;amp;quot;''. Dependencies hovoria o nainštalovaných knižniciach a ich verziách. Scripts sú skripty dôležité napríklad pre spúšťanie, testovanie alebo buildovanie aplikácie (buildovanie aplikácie je popísané v časti [[#build|[build]]]). Skripty sa spúšťajú z príkazového riadku (respektíve terminálu) pomocou príkazu ''npm'' (node package manager). Vlastnosť ''&amp;amp;quot;devDependencies&amp;amp;quot;'' hovorí o nainštalovaných závislostiach dostupných iba vo fáze vývoja aplikácie.&lt;br /&gt;
&lt;br /&gt;
=== Procesy Electron aplikácie ===&lt;br /&gt;
&lt;br /&gt;
Electron aplikácia má viacero procesov. Hlavný proces (main process) má na starosti prácu so súbormi, komunikáciu s operačným systémom.&lt;br /&gt;
&lt;br /&gt;
Vykreslovacie procesy (renderer processes) vytvárajú obsah aplikácie v oknách prehliadača.&lt;br /&gt;
&lt;br /&gt;
V Electron aplikácií, súbor ''package.json'' spustí hlavný skript nazývaný hlavný proces. V našom prípade sa hlavný proces nazýva ''main.js'' a nachádza sa v rovnakom priečinku ako súbor ''package.json'' (viď kód [[#lst:package|[lst:package]]], vlastnosť ''&amp;amp;quot;main&amp;amp;quot;''). Skript, ktorý beží v hlavnom procese môže zobrazovať grafické programové rozhranie (Graphical User Interface) vytváraním webových stránok. Electron aplikácia má vždy práve jeden hlavný proces.&lt;br /&gt;
&lt;br /&gt;
Nakoľko Electron používa Chromium pre zobrazovanie webových stránok, jeho viac procesová architektúra je tiež použitá. Každá webová stránka v Electron aplikácií spúšťa jej vlastný proces. Tento proces sa nazýva vykresľovací proces.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Modul BrowserWindow a rozdiel medzi hlavným a vykresľovacím procesom'''&lt;br /&gt;
&lt;br /&gt;
Modul BrowserWindow nám umožňuje vytvoriť nové okno prehliadača, alebo spravovať už existujúce okno. Každé okno prehliadača je separátny proces - vykresľovací proces.&lt;br /&gt;
&lt;br /&gt;
Hlavný proces vytvára webové stránky vytváraním ''BrowserWindow'' inštancií. V každej inštancií ''BrowserWindow'' beží webová stránka vo svojom vlastnom vykresľovacom procese.&lt;br /&gt;
&lt;br /&gt;
Hlavný proces spravuje všetky webové stránky a ich korešpondujúce vykresľovacie procesy. Každý vykresľovací proces je izolovaný a stará sa iba o webovú stránku bežiacu v ňom .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const electron = require('electron');&lt;br /&gt;
const { app, BrowserWindow} = electron;&lt;br /&gt;
let mainWindow;&lt;br /&gt;
const createWindow = () =&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  mainWindow = new BrowserWindow({&lt;br /&gt;
    width: 1250,&lt;br /&gt;
    height: 750,&lt;br /&gt;
    title: &amp;quot;eAurela&amp;quot;,&lt;br /&gt;
    resizable: true,&lt;br /&gt;
   });&lt;br /&gt;
app.on('ready', createWindow);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kód 3.7: Vytvorenie inštancie BrowserWindow v hlavnom procese main.js&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hlavný proces ''main.js'' by mal vytvárať všetky okná a mal by obsluhovať všetky systémové udalosti, ktoré sa v aplikácií môžu vyskytnúť, napríklad vytvorenie okna, ak je obsah aplikácie načítaný  (viď kód [[#lst:BrowserWindow|[lst:BrowserWindow]]]).&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Anal%C3%BDza_po%C5%BEiadaviek_a_%C5%A1trukt%C3%BAra_klientskej_aplik%C3%A1cie&amp;diff=12901</id>
		<title>Analýza požiadaviek a štruktúra klientskej aplikácie</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Anal%C3%BDza_po%C5%BEiadaviek_a_%C5%A1trukt%C3%BAra_klientskej_aplik%C3%A1cie&amp;diff=12901"/>
		<updated>2020-10-19T19:23:34Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Zamkol stránku „Analýza požiadaviek a štruktúra klientskej aplikácie“ ([Úprava=Povoliť iba správcom] (na neurčito) [Presun=Povoliť iba správcom] (na neurčito))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]][[Kategória:Bakalárske práce]][[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
{{Praca_uvod|2|Klientská aplikácia pre zobrazenie dát ako súčasť senzorického informačného systému|Informačný systém Sensorical|Analýza požiadaviek a štruktúra klientskej aplikácie|Nástroje použité na vývoj aplikácie eAurela|Implementácia aplikácie eAurela|Uvedenie aplikácie eAurela do produkcie}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= =&lt;br /&gt;
&lt;br /&gt;
Táto kapitola popisuje špecifikáciu funkčných a nefunkčných požiadaviek, z ktorých vyplývajú prípady použitia. Ďalej je v kapitole opísaný návrh štruktúry aplikácie, popis jednotlivých častí a priblíženie, ako aplikácia eAurela funguje, pomocou diagramov aktivít.&lt;br /&gt;
&lt;br /&gt;
== Požiadavky aplikácie ==&lt;br /&gt;
&lt;br /&gt;
Známe sú dva základné typy požiadaviek: funkčné a nefunkčné. Funkčné požiadavky dávajú prehľad o softvérovej funkcionalite, ktorá musí byť implementovaná. Sú to požiadavky na správanie systému. Nefunkčné požiadavky sa môžu tiež nazvať systémové požiadavky. Sú to požiadavky, ktoré sa zaoberajú vlastnosťami systému, výkonom, bezpečnosťou a podobne. Ďalej sú popísané minimálne požiadavky na spustenie aplikácie a požiadavky týkajúce sa bezpečnosti systému.&lt;br /&gt;
&lt;br /&gt;
=== Funkčné požiadavky ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!Funkčné požiadavky&lt;br /&gt;
!Doplňujúce informácie&lt;br /&gt;
|-&lt;br /&gt;
|R01 || Prihlásenie do systému || Každému používateľovi systému Sensorical je vytvorený vlastný login a heslo. Pomocou týchto údajov sa používateľ prihlási.&lt;br /&gt;
|-&lt;br /&gt;
|R02 || Spravovanie systému || Ak má používateľ pridelené administrátorské práva, môže spravovať údaje uložené na serveri.&lt;br /&gt;
|-&lt;br /&gt;
|R03 || Voľba aplikácie zberu dát || Možnosť výberu aplikácie zberu dát, ku ktorému sa eAurela pripojí. Aplikácia eAurela sa pripája k serveru, na ktorom sa vybraná aplikácia nachádza.&lt;br /&gt;
|-&lt;br /&gt;
|R04 || Spravovanie informačného systému || Ak má používateľ pridelené práva na spravovanie aplikácie, môže meniť napríklad nastavenie senzorov, zapnúť alebo vypnúť meranie a podobne.&lt;br /&gt;
|-&lt;br /&gt;
|R05 || Výber z povolených údajov || Používateľ vidí iba údaje, ku ktorým má pridelené oprávnenia. &lt;br /&gt;
|-&lt;br /&gt;
|R06 || Zobrazenie hodnôt || Zobrazenie poslednej nameranej hodnoty na každom senzore vo vybranej oblasti. Hodnoty sú zobrazené spolu s fyzikálnou jednotkou, dátumom a časom.&lt;br /&gt;
|-&lt;br /&gt;
|R07 || Umiestnenie senzorov || Jednotlivé senzory sú zaradené do oblastí a sektorov. &lt;br /&gt;
|-&lt;br /&gt;
|R08 || Zobrazenie grafov || Zobrazenie nameraných hodnôt vo forme grafu časovej závislosti.&lt;br /&gt;
|-&lt;br /&gt;
|R09 || Výber časového intervalu || Výber časového intervalu, v ktorom aplikácia zobrazí namerané hodnoty.&lt;br /&gt;
|-&lt;br /&gt;
|R10 || Odhlásenie z aplikácie. || &lt;br /&gt;
|}&lt;br /&gt;
Tabuľka 2.1 Funkčné požiadavky aplikácie eAurela&lt;br /&gt;
&lt;br /&gt;
=== Nefunkčné požiadavky ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!Nefunkčné požiadavky&lt;br /&gt;
!Doplňujúce informácie&lt;br /&gt;
|-&lt;br /&gt;
|R01 || Aplikácia vo forme desktopovej aplikácie a internetovej aplikácie || Aplikácia eAurela bude dostupná v dvoch formách. Dostupná bude ako desktopová aplikácia podporovaná operačnými systémami Mac, Windows a Linux. Taktiež bude fungovať ako internetová aplikácia dostupná v internetovom prehliadači.&lt;br /&gt;
|-&lt;br /&gt;
|R02 || Implementovaná v jazyku javascript, HTML a CSS || Na implementáciu budú použité dva javascriptové frameworky: Electron.js a React.js.&lt;br /&gt;
|-&lt;br /&gt;
|R03 || Bezpečné overovania || Používateľovi bude po každom prihlásení vygenerovaný JWT token, ktorý sa používa pri každej požiadavke na server a je platný po dobu jednej hodiny. Po odhlásení bude JWT token deaktivovaný a ďalej neplatný.&lt;br /&gt;
|-&lt;br /&gt;
|R04 || Aplikácia sa bude dať vylepšiť || Aplikácia bude implementovaná tak, aby bolo možné v budúcnosti pridať nové, alebo vylepšiť staré funkcie.&lt;br /&gt;
|}&lt;br /&gt;
Tabuľka 2.2 Nefunkčné požiadavky aplikácie eAurela&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Minimálne požiadavky pre spustenie aplikácie ===&lt;br /&gt;
&lt;br /&gt;
Nakoľko je aplikáciu možné spustiť na viacerých operačných systémoch (Windows, Mac OS a Linux) a zároveň je dostupná aj v internetovom prehliadači ako internetová aplikácia, je potrebné definovať minimálne požiadavky pre oba typy.&lt;br /&gt;
&lt;br /&gt;
* '''Podporované operačné systémy'''&lt;br /&gt;
** Minimálna podporovaná verzia operačného systému Windows je '''Windows 7'''. Staršie verzie tohto operačného systému nie sú podporované,&lt;br /&gt;
** Pre operačný systém Mac OS je minimálna podporovaná verzia '''Mac OS 10.10''' (Yosemite). Pre operačný systém Mac OS sú podporované iba 64-bitové verzie,&lt;br /&gt;
** Minimálne podporované verzie operačného systému Linux pre spustenie Electron aplikácie sú '''Ubuntu 12.04''', '''Fedora 21''' a '''Debian 8''' ,&lt;br /&gt;
* '''Internetový prehliadač'''&lt;br /&gt;
** Aplikácia vyvíjaná vo frameworku React závisí od typov javascriptových kolekcií ''Map'' a ''Set''. Niektoré internetové prehliadače tieto kolekcie nemusia poskytovať, napríklad '''Internet Explorer 11''' a staršie verzie tohto prehliadača .&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnosť systému a vplyv na aplikáciu eAurela ===&lt;br /&gt;
&lt;br /&gt;
Bezpečnosť systému zabezpečujú dva prvky. Prvým je, že každý používateľ má priradené meno (login) a heslo (password), pomocou ktorých sa prihlasuje do systému. Po prihlásení sa používateľovi vygeneruje tzv. JWT token, ktorý je platný 1 hodinu. Vygenerovaný JWT token musí byť použitý pre prihlásenie sa do konkrétneho informačného systému, bez neho prihlásenie nie je možné. Po prihlásení do informačného systému sa generuje nový JWT token, ktorý platí iba v danom informačnom systéme a je taktiež platný po dobu jednej hodiny. JWT musí byť odosielaný v každej požiadavke na server, inak je požiadavka neplatná. Po používateľovom odhlásení zo systému, sa JWT token stáva neplatný, tým pádom ho nie je možné znovu použiť.&lt;br /&gt;
&lt;br /&gt;
== Diagram prípadov použitia a návrh štruktúry ==&lt;br /&gt;
&lt;br /&gt;
Táto podkapitola je venovaná diagramu prípadov použitia a ďalej návrhu štruktúry aplikácie, ktoré vyplývajú z funkčných požiadaviek aplikácie. Sú tu popísaní všetci aktéri, ktorí môžu vykonávať v aplikácií rôzne aktivity. Taktiež je tu podrobne popísaná štruktúra aplikácie eAurela.&lt;br /&gt;
&lt;br /&gt;
=== Diagram prípadov použitia ===&lt;br /&gt;
&lt;br /&gt;
Diagram prípadov použitia (Use Case Diagram) zobrazuje správanie systému tak, ako ho vidí používateľ. Účelom je popísať funkcionalitu systému, teda to, čo od neho klient očakáva. Diagram prípadov použitia sa skladá z prípadov použitia (use case), aktérov (actors) a vzťahov medzi nimi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Prípad použitia'''&lt;br /&gt;
&lt;br /&gt;
Prípad použitia je sada niekoľkých akcií, ktoré vedú k dosiahnutiu určitého cieľa. Definuje teda funkcionalitu, ktorú by mal navrhovaný systém obsahovať. Prípady použitia vychádzajú zo zadania systému od zákazníka.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Aktér'''&lt;br /&gt;
&lt;br /&gt;
Aktér je rola, ktorá komunikuje s jednotlivými prípadmi použitia. V tejto roli môže byť používateľ, alebo aj externý systém. Aktérom môže byť napríklad Administrátor alebo dokonca aj Čas .&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_UseCase.png|thumb|500px|Obr. 2.1 Diagram prípadov použitia aplikácie eAurela&amp;lt;span label=&amp;quot;fig:usecase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
'''Popis aktérov a prípadov použitia'''&lt;br /&gt;
&lt;br /&gt;
* Používateľ:&lt;br /&gt;
** každý používateľ, o ktorom sú zaznamenané údaje v databáze na vzdialenom serveri Auth API,&lt;br /&gt;
** sú mu zobrazené iba tie údaje zo systému, ku ktorým má pridelené oprávnenia,&lt;br /&gt;
** môže si vybrať informačný systém, ku ktorému sa aplikácia pripojí,&lt;br /&gt;
** má možnosť si prezerať poslednú nameranú hodnotu zo senzora, prezerať namerané hodnoty vo forme grafu, v časovom intervale, ktorý si zvolí,&lt;br /&gt;
** môže si vybrať oblasť a sektor,&lt;br /&gt;
* Manage API Admin:&lt;br /&gt;
** administrátor konkrétneho informačného systému (Manage API),&lt;br /&gt;
** dedí z aktéra ''Používateľ'', teda môže vykonávať rovnaké aktivity ako on,&lt;br /&gt;
** navyše môže spravovať porty, sektory, senzory,&lt;br /&gt;
** má možnosť zapnúť alebo vypnúť meranie v informačnom systéme,&lt;br /&gt;
** taktiež si môže zobraziť všetkých používateľov, ktorí majú k informačnému systému prístup,&lt;br /&gt;
* Auth API Admin:&lt;br /&gt;
** administrátor serveru slúžiaceho na autorizáciu (Auth API),&lt;br /&gt;
** dedí z aktéra ''Manage API Admin'',&lt;br /&gt;
** okrem vyššie spomenutých aktivít môže pridať a odstrániť používateľov zo systému, alebo im môže meniť údaje,&lt;br /&gt;
** tiež môže spravovať spoločnosti a informačné systémy v nich.&lt;br /&gt;
&lt;br /&gt;
=== Štruktúra aplikácie eAurela ===&lt;br /&gt;
&lt;br /&gt;
Návrh štruktúry aplikácie vychádza z určených funkčných požiadaviek a jednotlivých prípadov použitia. Každý prípad použitia nám určuje samostatnú časť aplikácie. Štruktúra aplikácie eAurela nám popisuje jednotlivé časti a navigáciu medzi nimi. Aplikácie sa skladá z nasledovných častí:&lt;br /&gt;
&lt;br /&gt;
* Home - časť pre prihlasovanie sa do systému,&lt;br /&gt;
* AppList - časť pre výber aplikácie,&lt;br /&gt;
* AuthAdministration - časť pre správu serveru ''Auth API'',&lt;br /&gt;
* ManageAdministration - časť pre správu konkrétnej aplikácie (''Manage API''),&lt;br /&gt;
* ManageAddUser - časť pre vytvorenie nového používateľa v aplikácií,&lt;br /&gt;
* Sectors - časť pre zobrazenie nameraných hodnôt v sektoroch.&lt;br /&gt;
&lt;br /&gt;
=== Funkcionalita častí aplikácie ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Home'''&lt;br /&gt;
&lt;br /&gt;
Predtým, než si používateľ vyberie aplikáciu a získa prístup k dátam, musí sa prihlásiť. Obrazovka Home slúži pre prihlásenie do systému. Obrazovka Home sa vždy zobrazí hneď po spustení aplikácie eAurela. Používateľ uvidí textové polia pre zadanie prihlasovacích údajov (login a heslo). Po zadaní údajov a kliknutí na tlačidlo prihlásiť, sa pošle na server požiadavka o prihlásenie so zadanými údajmi. V prípade, že sú údaje nesprávne, zobrazí sa upozornenie o zle zadaných údajoch. V prípade, že sú zadané údaje správne, používateľ bude prihlásený a bude presmerovaný do časti Applist. V tejto časti aplikácia komunikuje so serverom pre autorizáciu (''Auth API''). Proces prihlasovania je vyobrazený v diagrame aktivít [[#fig:HomeActivity|2.2]].&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_LoginActivity.png|thumb|500px|Obr. 2.2 Diagram aktivít časti Home&amp;lt;span label=&amp;quot;fig:HomeActivity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Applist'''&lt;br /&gt;
&lt;br /&gt;
Táto obrazovka sa zobrazí ako prvá obrazovka ihneď po úspešnom prihlásení. Používateľovi sú zobrazené spoločnosti, ku ktorým má pridelené prístupové práva. V týchto spoločnostiach sa nachádzajú aplikácie, ktoré obsahujú namerané údaje z konkrétnych senzorov, nachádzajúcich sa v danej aplikácii. Po výbere aplikácie bude odoslaná požiadavka o prihlásenie do konkrétnej aplikácie. Údaje zobrazené v tomto okne sú údaje, ktoré sa nachádzajú na serveri pre autorizáciu. Požiadavka o prihlásenie do aplikácie ale smeruje na server konkrétnej aplikácie (''Manage API''). Ak má používateľ pridelené administrátorské práva, môže si taktiež zvoliť možnosť pre prístup do časti AuthAdministration.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_ApplistActivity.png|thumb|500px|Obr. 2.3 Diagram aktivít časti Applist&amp;lt;span label=&amp;quot;fig:ApplistActivity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''AuthAdministration'''&lt;br /&gt;
&lt;br /&gt;
Táto časť aplikácie je sprístupnená výhradne administrátorom systému. Sú tu zobrazené informácie o všetkých používateľoch systému a ich prístupových právach k spoločnostiam, zoznam všetkých spoločností a k nim priradených aplikácií. Administrátor systému môže tieto údaje upravovať, ako napríklad meniť práva používateľom, zmeniť používateľovi heslo, meniť a aktualizovať informácie o spoločnostiach a ich aplikáciách. Taktiež môže zmazať existujúcu, alebo vytvoriť novú spoločnosť, či aplikáciu. Táto časť slúži pre spravovanie serveru ''Auth API'' (kapitola [[#sub:auth|[sub:auth]]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sectors'''&lt;br /&gt;
&lt;br /&gt;
Táto obrazovka je zobrazená po úspešnom prihlásení používateľa do aplikácie. Pri prihlasovaní do aplikácie sa znovu overuje, či má používateľ administrátorské práva (administrátor na serveri ''Manage API'' nemusí byť aj administrátor na serveri ''Auth API''). Používateľovi sú zobrazené oblasti a sektory, ktoré sa nachádzajú v aplikácií, a zároveň k nim má používateľ prístupové práva. Taktiež sú tu zobrazené aj posledné namerané hodnoty zo senzorov nachádzajúcich sa v sektore. Používateľ si bude môcť vybrať oblasť a sektor, ktorého hodnoty si chce prezerať. V prípade, že si bude chcieť pozrieť časový záznam zo všetkých senzorov daného sektora, môže si zvoliť zobrazenie údajov vo forme časového záznamu. V tomto prípade bude zobrazená časová závislosť (graf) všetkých nameraných údajov zo sektora vo vybranom časovom intervale. Používateľ má možnosť zvoliť časový interval, z ktorého budú následne zobrazené namerané hodnoty. Ak má používateľ administrátorské práva v danej aplikácií, môže si tiež zvoliť prechod do časti ManageAdministration.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_SectorsActivity.png|thumb|500px|Obr. 2.4 Diagram aktivít časti Sectors&amp;lt;span label=&amp;quot;fig:SectorsActivity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ManageAdministration'''&lt;br /&gt;
&lt;br /&gt;
Podobne ako v prípade AuthAdministration, aj k tejto časti majú prístup iba administrátori. Sú tu zobrazené informácie o používateľoch aplikácie, oblastiach, sektoroch a senzoroch. Taktiež tu je možné zastaviť, alebo spustiť meranie. Z tejto obrazovky je možné prejsť k obrazovke pre vytvorenie nového používateľa systému. Táto časť slúži pre spravovanie serveru ''Manage API'' (kapitola [[#sub:manage|[sub:manage]]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ManageAddUser'''&lt;br /&gt;
&lt;br /&gt;
V tomto okne môže administrátor systému vytvoriť nového používateľa. Pri otvorení tohto okna je zobrazený formulár obsahujúci polia pre vstup údajov nového používateľa. Po vyplnení údajov a potvrdení formulára sa odošle požiadavka na server o vytvorenie nového používateľa. Server skontroluje, či používateľ existuje. Môžu nastať tri možnosti:&lt;br /&gt;
&lt;br /&gt;
# používateľ neexistuje na žiadnom serveri,&lt;br /&gt;
# používateľ existuje na serveri pre autorizáciu, ale neexistuje na serveri aplikácie,&lt;br /&gt;
# používateľ existuje na obidvoch serveroch.&lt;br /&gt;
&lt;br /&gt;
V prvom prípade sa používateľ vytvorí na obidvoch serveroch. Na oboch serveroch bude mať používateľ priradené najnižšie prístupové práva a bude mať prístup k jednej spoločnosti a jednej aplikácií (tej, z ktorej bol vytváraný). V druhom prípade sa používateľ vytvorí iba na serveri informačného systému, pričom na serveri pre autorizáciu sa používateľovi priradí aplikácia, v ktorej bol vytvorený. Ak používateľ existuje na obidvoch serveroch, ukáže sa informácia, že daný používateľ už existuje. Nakoniec nasleduje presmerovanie do časti ManageAdministration. V nasledujúcom diagrame je zobrazené vytváranie nového používateľa.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_AddUserActivity.png|thumb|500px|Obr. 2.5 Diagram aktivít pre vytvorenie nového používateľa&amp;lt;span label=&amp;quot;fig:AddUserActivity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Klientsk%C3%A1_aplik%C3%A1cia_pre_zobrazenie_d%C3%A1t_ako_s%C3%BA%C4%8Das%C5%A5_senzorick%C3%A9ho_informa%C4%8Dn%C3%A9ho_syst%C3%A9mu&amp;diff=12900</id>
		<title>Klientská aplikácia pre zobrazenie dát ako súčasť senzorického informačného systému</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Klientsk%C3%A1_aplik%C3%A1cia_pre_zobrazenie_d%C3%A1t_ako_s%C3%BA%C4%8Das%C5%A5_senzorick%C3%A9ho_informa%C4%8Dn%C3%A9ho_syst%C3%A9mu&amp;diff=12900"/>
		<updated>2020-10-19T19:23:26Z</updated>

		<summary type="html">&lt;p&gt;Juraj: Zamkol stránku „Klientská aplikácia pre zobrazenie dát ako súčasť senzorického informačného systému“ ([Úprava=Povoliť iba správcom] (na neurčito) [Presun=Povoliť iba správcom] (na neurčito))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Hlavička_MTF|{{PAGENAME}}|Adam Zverbík|Ing. Juraj Ďuďák, PhD.|&lt;br /&gt;
2019/2020&lt;br /&gt;
|Bakalárska práca&lt;br /&gt;
|Aplikovaná informatika a automatizácia v priemysle&lt;br /&gt;
}} &lt;br /&gt;
[[Kategória:Študentské práce]][[Kategória:Bakalárske práce]][[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
{{Praca_uvod|1|Klientská aplikácia pre zobrazenie dát ako súčasť senzorického informačného systému|Informačný systém Sensorical|Analýza požiadaviek a štruktúra klientskej aplikácie|Nástroje použité na vývoj aplikácie eAurela|Implementácia aplikácie eAurela|Uvedenie aplikácie eAurela do produkcie}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|Cieľom záverečnej práce je vyvinúť a implementovať multiplatformnú desktopovú aplikáciu a web aplikáciu. Výsledkom tejto práce je funkčná klientská aplikácia pre zobrazenie dát a spravovanie senzorického informačného systému Sensorical. V prvej kapitole je opísaný systém Sensorical, jeho dátový model a komunikácia so serverom. Druhá kapitola sa venuje analýze požiadaviek a štruktúre aplikácie. V tretej kapitole sú popísané nástroje, ktoré boli použité pri vývoji aplikácie. Štvrtá kapitola pojednáva o implementácií a piata kapitola je venovaná buildovaniu aplikácie.&lt;br /&gt;
&amp;lt;br /&amp;gt;|The aim of the bachelor thesis is to develop and implement multiplatform desktop application and web application. The result of this thesis is functional client application, which shows and manages data of the sensoric information system Sensorical. Data model of sensorical system and communication with server is described in the first chaper. The second chapter is dedicated to analyze requirements and structure of the application. The tools used in development process are described in the third chapter. The fourth chapter is about implementation and the fifth chapter describes building of the final application.&amp;lt;br /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Úvod'''&lt;br /&gt;
&lt;br /&gt;
Internet. Dnes si život bez neho vieme iba ťažko predstaviť. Obrovské množstvo ľudí sa pripojí na internet každý jeden deň. Či už si chcú nájsť nejakú informáciu, objednať niečo z internetového obchodu, pozrieť seriál, film, alebo chcú komunikovať s ďalšími ľuďmi, pripojenými na druhom konci sveta. Internet je stále dostupnejší. Vďaka novým, vyspelejším technológiám sa stáva pripojenie stabilnejšie a rýchlejšie. Práve kvôli tomu sú internetové aplikácie stále populárnejšie. Takáto aplikácia je plnohodnotná aplikácia, ale používateľ si nemusí nič inštalovať do svojho počítača, jednoducho sa pripojí na internet a v pohodlí internetového prehliadača si aplikáciu spustí.&lt;br /&gt;
&lt;br /&gt;
Vzhľadom na neustály pokrok technológií sú stále výkonnejšie a dostupnejšie aj samotné počítače. S rastúcim výkonom počítačov rastie aj popularita jazyka JavaScript a jeho frameworkov, nakoľko moderné počítače si s ním hravo poradia. To umožňuje vývoj moderných, dynamických aplikácií s použitím internetových technológií. Takýmito frameworkami sú aj React a Electron. React umožňuje beh jedno-oknovej (single-page) aplikácie v internetovom prehliadači, Electron zase v okne operačného systému. Kombináciou týchto dvoch frameworkov vznikne multiplatformná desktopová aplikácia dostupná aj z internetového prehliadača.&lt;br /&gt;
&lt;br /&gt;
Senzorický informačný systém Sensorical je systém, ktorý zaznamenáva a analyzuje namerané environmentálne dáta. Dáta sú zaznamenávané meracími zariadeniami, ktoré merajú hodnoty v určitých časových intervaloch a po zaznamenaní tejto hodnoty komunikujú so vzdialeným serverom, kde sa tieto dáta ukladajú. Tento informačný systém obsahuje desktopovú aplikáciu, internetovú aplikáciu a aplikáciu pre operačný systém Android.&lt;br /&gt;
&lt;br /&gt;
Cieľom práce je naprogramovať a implementovať multiplatformnú desktopovú aplikáciu, ktorá dostala názov eAurela. Aplikácia eAurela bude dostupná aj z internetového prehliadača, čo značne zjednoduší spravovanie celého systému Sensorical. Aplikácia bude zobrazovať posledné namerané hodnoty z meracích zariadení a grafické výstupy z vybraných časových intervalov. Administrátori informačného systému budú mať možnosť z aplikácie spravovať celý systém.&lt;br /&gt;
&lt;br /&gt;
= Informačný systém Sensorical =&lt;br /&gt;
&lt;br /&gt;
Informačný systém Sensorical je systém, ktorý bol navrhnutý v spoločnosti TNTech s.r.o. a je to ucelený systém pre zber a analýzu environmentálnych dát. Tento systém sa skladá z hardvérovej a softvérovej časti.&lt;br /&gt;
&lt;br /&gt;
==== Hardvérová časť ====&lt;br /&gt;
&lt;br /&gt;
Skladá sa z meracích zariadení (senzorov), ktoré vysielajú namerané dáta a z jedného alebo viacerých prijímacích modulov, ktoré pokrývajú monitorovanú oblasť.&lt;br /&gt;
&lt;br /&gt;
Meracie zariadenie má za úlohu spracovať namerané hodnoty, pripraviť telemetrické dáta, formátovať dáta podľa určeného kľúča a odoslať spracované údaje prostredníctvom rádiového rozhrania.&lt;br /&gt;
&lt;br /&gt;
Modul prijímača je určený pre bezdrôtový príjem dát odoslaných meracími zariadeniami. Obsahuje tiež modul komunikačného rozhrania RS485, čo umožňuje zaradiť viac prijímacích modulov na jeden káblový rozvod.&lt;br /&gt;
&lt;br /&gt;
==== Softvérová časť ====&lt;br /&gt;
&lt;br /&gt;
Merací systém je určený pre dlhodobé merania. Softvérovú časť môžeme ďalej rozdeliť na dátovú a aplikačnú časť.&lt;br /&gt;
&lt;br /&gt;
Dátová sa skladá z dvoch databázových modelov a z aplikačného programového rozhrania (API).&lt;br /&gt;
&lt;br /&gt;
Prvý databázový model predstavuje databázu, ktorá slúži pre uchovávanie informácií potrebných na autorizáciu, a taktiež informácie o aplikáciach pre zber environmentálnych dát, s ktorými systém pracuje (viď [[#sub:auth|1.1.1]]). Táto databáza je uložená na serveri, ktorý bol pomenovaný ''Auth API''.&lt;br /&gt;
&lt;br /&gt;
Druhý databázový model je reprezentovaný databázou, ktorá uchováva údaje o konkrétnej aplikácii zberu dát (viď [[#sub:manage|1.1.2]]). Pre každú aplikáciu je vytvorená vlastná databáza, ktorá môže byť uložená na serveri ''Auth API'' alebo na ľubovoľnom inom. Pre jasnú identifikáciu sa tieto servery nazývajú ''Manage API''. Informácie o serveroch sa nachádzajú v prvom databázovom modeli.&lt;br /&gt;
&lt;br /&gt;
V aplikačnej časti sa nachádza viacero softvérových produktov. Tieto produkty slúžia na prístup a analýzu nameraných údajov , .&lt;br /&gt;
&lt;br /&gt;
== Dátový model ==&lt;br /&gt;
&lt;br /&gt;
Pre systém Sensorical boli vytvorené dva databázové modely. Prvý model sa týka autorizácie používateľov. Databáza sa delí na časti: časť definujúca používateľov systému, časť definujúca spoločnosti a aplikácie, časť s obmedzeniami používateľov.&lt;br /&gt;
&lt;br /&gt;
Druhý model sa týka konkrétnych aplikácií zberu dát. Aplikácia môže byť spustená na serveri, kde je spustená autorizácia používateľov, ale taktiež môže byť spustená aj na inom serveri. Tento model sa delí na časti: časť rozmiestnenia senzorov, časť s informáciami o senzoroch, časť pre ukladanie nameraných hodnôt.&lt;br /&gt;
&lt;br /&gt;
=== Dátový model pre autorizáciu ===&lt;br /&gt;
&lt;br /&gt;
Tento model definuje všetkých používateľov systému Sensorical. Pri prihlasovaní do systému prebieha porovnávanie údajov s údajmi uloženými v tejto databáze. Štruktúra tabuliek, označenie primárnych kľúčov a dátových typov jednotlivých atribútov je zobrazená na obrázku obr. [[#fig:dblogin|1.1]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Štruktúra dátového modelu pre autorizáciu'''&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_login.png|thumb|500px|Entitno-relačný diagram dátového modelu pre autorizáciu používateľov&amp;lt;span label=&amp;quot;fig:dblogin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Časti dátového modelu pre autorizáciu'''&lt;br /&gt;
&lt;br /&gt;
* časť definujúca všetkých používateľov systému:&lt;br /&gt;
** entitná množina '''Users''',&lt;br /&gt;
* časť definujúca spoločnosti a aplikácie:&lt;br /&gt;
** entitné množiny '''Companies, Apps, Servers''',&lt;br /&gt;
* časť s obmedzeniami používateľov:&lt;br /&gt;
** entitné množiny '''Restrictions, AppRestrictions'''.&lt;br /&gt;
&lt;br /&gt;
=== Časť definujúca používateľov systému ===&lt;br /&gt;
&lt;br /&gt;
Systém Sensorical môže používať viacero používateľov, preto je nevyhnutné zaznamenávať informácie o používateľoch, ich údaje a práva.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Users'''&lt;br /&gt;
&lt;br /&gt;
Každému používateľovi je vytvorené prihlasovacie meno (login) a heslo (password), ktorými sa prihlasuje do systému. Atribút isAdmin hovorí, či má používateľ administrátorské práva.&lt;br /&gt;
&lt;br /&gt;
=== Časť definujúca spoločnosti a aplikácie ===&lt;br /&gt;
&lt;br /&gt;
Entitné množiny v tejto časti obsahujú informácie o spoločnostiach a aplikáciách, ku ktorým sa dá pripojiť, a taktiež o serveroch, na ktorých sa dané aplikácie nachádzajú.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Companies'''&lt;br /&gt;
&lt;br /&gt;
Zoznam všetkých spoločností. Entitná množina ''UserCompanies'' určuje, ktorý používateľ má prístup k spoločnosti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Apps'''&lt;br /&gt;
&lt;br /&gt;
Zoznam všetkých aplikácií zberu dát, ku ktorým sa dá prihlásiť. Vzťah medzi entitnými množinami ''Companies'' a ''Apps'' je 1:N, teda spoločnosť môže mať viacero aplikácií, ale aplikácia sa môže nachádzať iba v jednej spoločnosti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Servers'''&lt;br /&gt;
&lt;br /&gt;
Každá aplikácia sa môže nachádzať na inom serveri. Táto entitná množina definuje práve informácie o serveroch a ich URL adrese.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Časť s obmedzeniami používateľov ===&lt;br /&gt;
&lt;br /&gt;
Tieto entitné množiny nám upresňujú určité obmedzenia práv používateľov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restrictions a AppRestrictions'''&lt;br /&gt;
&lt;br /&gt;
Definujú obmedzenia používateľov do konkrétnych aplikácií.&lt;br /&gt;
&lt;br /&gt;
=== Dátový model aplikácie zberu dát ===&lt;br /&gt;
&lt;br /&gt;
Tento dátový model definuje konkrétnu aplikáciu zberu dát. Daná databáza môže byť spustená na rovnakom serveri, ako je hlavný server systému Sensorical (''Auth API''), alebo na ľubovoľnom inom. Pre jasnú identifikáciu sa tieto servery nazývajú ''Manage API''. Štruktúra tabuliek, označenie primárnych kľúčov a dátových typov jednotlivých atribútov je zobrazená na obrázku obr. [[#fig:dbnsoric|1.2]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Štruktúra dátového modelu informačných systémov'''&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_nsoric.png|thumb|500px|Entitno-relačný diagram dátového modelu aplikácie zberu dát&amp;lt;span label=&amp;quot;fig:dbnsoric&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Časti dátového modelu aplikácie zberu dát'''&lt;br /&gt;
&lt;br /&gt;
* časť definujúca rozmiestnenie senzorov v oblasti:&lt;br /&gt;
** entitné množiny '''Areas, Sectors, Sensors, SensorSectors, GroupViews,'''&lt;br /&gt;
* časť pre ukladanie nameraných hodnôt:&lt;br /&gt;
** entitné množiny '''MeasuredValues, MeasuredDates''',&lt;br /&gt;
* časť s informáciami o senzoroch:&lt;br /&gt;
** entitné množiny '''SensorProperties, Types, TypesGroup1, TypesGroup2''',&lt;br /&gt;
* časť definujúca používateľov informačného systému:&lt;br /&gt;
** entitné množiny '''Users, UserGroups'''.&lt;br /&gt;
&lt;br /&gt;
=== Časť definujúca používateľov systému ===&lt;br /&gt;
&lt;br /&gt;
K danej aplikácií nemusí mať prístup každý používateľ systému Sensorical.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Users'''&lt;br /&gt;
&lt;br /&gt;
V tejto entitnej množine sú informácie o používateľoch, ktorý majú prístup k danej aplikácii. Na serveri je každému používateľovi vygenerovaný dočasný JWT token, ktorý je používaný v ďalších požiadavkách na server ako autorizačný kľúč.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UserGroups'''&lt;br /&gt;
&lt;br /&gt;
Táto entitná množina definuje práva používateľa.&lt;br /&gt;
&lt;br /&gt;
=== Časť rozmiestnenia senzorov ===&lt;br /&gt;
&lt;br /&gt;
Umiestnenie meracích zariadení je zabezpečené hierarchickou štruktúrou. Najvyššia časť tejto štruktúry je oblasť (''Areas''). V oblasti sa nachádzajú sektory (''Sectors''), v ktorých sa nachádzajú dané senzory (''Sensors'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Areas'''&lt;br /&gt;
&lt;br /&gt;
Zoznam všetkých oblastí v konkrétnej aplikácií. Počet oblastí je neobmedzený. Používateľ musí mať definované práva pre prístup k danej oblasti. Tieto práva definuje entitná množina ''GroupViews''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sectors'''&lt;br /&gt;
&lt;br /&gt;
Definuje zoznam všetkých sektorov. Jeden sektor sa môže nachádzať iba v jednej oblasti, ale oblasť môže obsahovať niekoľko sektorov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sensors'''&lt;br /&gt;
&lt;br /&gt;
Táto entitná množina definuje zoznam meracích zariadení v danom informačnom systéme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SensorSectors'''&lt;br /&gt;
&lt;br /&gt;
Upresňuje vzťah medzi entitnými množinami ''Sectors'' a ''Sensors''. Nakoľko do sektoru môže byť umiestnených viacero senzorov a môže sa stať, že jeden senzor je priradený do viacerých sektorov, je tu použitý vzťah M:N.&lt;br /&gt;
&lt;br /&gt;
=== Časť pre ukladanie nameraných hodnôt ===&lt;br /&gt;
&lt;br /&gt;
Táto časť zabezpečuje ukladanie nameraných hodnôt. Okrem nameraných hodnôt sa ukladá aj dátum a čas merania, ktorý je potrebný kvôli zobrazeniu časovej závislosti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MeasuredDates'''&lt;br /&gt;
&lt;br /&gt;
V tejto entitnej množine prebieha ukladanie dátumu a času merania. Vďaka tomu možno vidieť, kedy ktoré meranie prebehlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MeasuredValues'''&lt;br /&gt;
&lt;br /&gt;
V tejto entitnej množine prebieha ukladanie hodnôt nameraných senzormi. Táto množina je prepojená s množinami ''Sensors'' a ''MeasuredDates'', čo zabezpečuje priradenie hodnoty k senzoru a tiež aj k dátumu a času merania.&lt;br /&gt;
&lt;br /&gt;
=== Časť s informáciami o senzoroch ===&lt;br /&gt;
&lt;br /&gt;
V tejto časti modelu je definovaná kategorizácia senzorov, ich vlastnosti a typy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SensorProperties'''&lt;br /&gt;
&lt;br /&gt;
Definícia vlastností meracích zariadení. Každý senzor má svoju maximálnu a minimálnu prípustnú hodnotu. Táto entitná množina slúži pre zobrazenie týchto hodnôt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Types'''&lt;br /&gt;
&lt;br /&gt;
Určuje typ daného senzora.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''TypesGroup1'''&lt;br /&gt;
&lt;br /&gt;
Keďže senzory môžu merať rôzne fyzikálne veličiny, v tejto entitnej množine sú zadefinované všetky fyzikálne jednotky senzorov.&lt;br /&gt;
&lt;br /&gt;
== Komunikácia so serverom ==&lt;br /&gt;
&lt;br /&gt;
Na komunikáciu so serverom bol použitý dátový prenos s architektúrou klient-server. Jedná sa o dvojvrstvovú architektúru, kde klient obsahuje používateľské rozhranie a aplikačnú logiku, pričom na serveri beží relačná databáza.&lt;br /&gt;
&lt;br /&gt;
K prístupu údajov, ktoré sú na serveri uložené, slúži aplikačné programové rozhranie (REST API) a komunikačný protokol definovaný práve nad týmto API.&lt;br /&gt;
&lt;br /&gt;
=== Požiadavky posielané na server ===&lt;br /&gt;
&lt;br /&gt;
Požiadavky, ktoré sú aplikáciou odosielané na server musia byť posielané vo formáte JSON.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Údaje, ktoré môžu byť odosielané pre Auth API'''&lt;br /&gt;
&lt;br /&gt;
* ''login'' - prihlasovacie meno používateľa,&lt;br /&gt;
* ''password'' - prihlasovacie heslo používateľa,&lt;br /&gt;
* ''company ID'' - ID spoločnosti,&lt;br /&gt;
* ''application ID'' - ID aplikácie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Údaje, ktoré môžu byť odosielané pre Manage API'''&lt;br /&gt;
&lt;br /&gt;
* ''Authorization''&lt;br /&gt;
** v tomto parametri je uvedený JWT token vygenerovaný serverom (viac v kapitole [[#bezpecnost|[bezpecnost]]]),&lt;br /&gt;
** povinný údaj, ktorý treba uvádzať v každej požiadavke na Manage API,&lt;br /&gt;
** slúži pre autorizáciu používateľa,&lt;br /&gt;
* ''application''&lt;br /&gt;
** názov aplikácie zberu dát,&lt;br /&gt;
** povinný údaj pri prihlasovaní sa k vybranej aplikácií,&lt;br /&gt;
* ''user-login''&lt;br /&gt;
** prihlasovacie meno používateľa&lt;br /&gt;
* ''area/sector/sensor ID''&lt;br /&gt;
** ID oblasti/sektoru/senzoru&lt;br /&gt;
* ''interval''&lt;br /&gt;
** časový interval pri zobrazovaní nameraných hodnôt vo forme grafu,&lt;br /&gt;
* ''factor''&lt;br /&gt;
** doplnenie parametru interval,&lt;br /&gt;
** je to celé číslo, základná hodnota je 1&lt;br /&gt;
** slúži pri vysokých intervaloch, server bude posielať iba každú n-tú hodnotu, kde n je práve hodnota parametra factor&lt;br /&gt;
&lt;br /&gt;
=== Odpovede zo servera ===&lt;br /&gt;
&lt;br /&gt;
Odpovede, ktoré aplikácia obdrží zo servera sú tiež vo formáte JSON. Odpovede sa delia na dve fázy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Prvá fáza: stav'''&lt;br /&gt;
&lt;br /&gt;
Stav definuje úspešnosť alebo neúspešnosť pripojenia (vlastnosť ''status'') Môžu nastať 3 variácie stavov. Stav 200 hovorí o úspešne spracovanej požiadavke.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_response1.png|thumb|250px|Odpoveď 200 zo servera&amp;lt;span label=&amp;quot;fig:response1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Stav 4XX je chybový stav. Pri tomto type stavu je chyba na strane klienta (nesprávne prihlasovacie údaje, nesprávna URL adresa, chýbajúci JWT token a podobne). Môže nadobúdať hodnoty od 400 do 499 vrátane (Obr. [[#fig:response404|[fig:response404]]]).&lt;br /&gt;
&lt;br /&gt;
Stav 5XX je taktiež chybový stav. V tomto prípade je chyba ale na strane servera a nie u klienta. Môže nadobúdať hodnoty od 500 do 599 vrátane (Obr. [[#fig:response500|[fig:response500]]]).&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_response404.png|thumb|250px|Odpoveď 404&amp;lt;span id=&amp;quot;fig:response404&amp;quot; label=&amp;quot;fig:response404&amp;quot;&amp;gt;[fig:response404]&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_response500.png|thumb|250px|Odpoveď 500&amp;lt;span id=&amp;quot;fig:response500&amp;quot; label=&amp;quot;fig:response404&amp;quot;&amp;gt;[fig:response500]&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Druhá fáza: konkrétne hodnoty'''&lt;br /&gt;
&lt;br /&gt;
Ak bola posielaná požiadavka úspešná (status: 200), potom druhá fáza odpovede zo serveru obsahuje konkrétne hodnoty, ktoré boli v požiadavke zažiadané.&lt;br /&gt;
&lt;br /&gt;
[[File:bpaz_response2.png|700px|alt=Odpoveď obsahujúca konkrétne hodnoty&amp;lt;span label=&amp;quot;fig:response2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;|Odpoveď obsahujúca konkrétne hodnoty&amp;lt;span label=&amp;quot;fig:response2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
</feed>