{"id":37422,"date":"2019-10-31T22:17:33","date_gmt":"2019-10-31T19:17:33","guid":{"rendered":"https:\/\/prohoster.info\/blog\/shiotiny-uzly-svyazi-i-sobytiya-ili-osobennosti-risovaniya-programm\/"},"modified":"2019-10-31T22:17:33","modified_gmt":"2019-10-31T19:17:33","slug":"shiotiny-uzly-svyazi-i-sobytiya-ili-osobennosti-risovaniya-programm","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/shiotiny-uzly-svyazi-i-sobytiya-ili-osobennosti-risovaniya-programm","title":{"rendered":"ShIoTiny: w\u0119z\u0142y, po\u0142\u0105czenia i zdarzenia, czyli cechy rysowania program\u00f3w","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"ShIoTiny: w\u0119z\u0142y, po\u0142\u0105czenia i zdarzenia, czyli cechy rysowania program\u00f3w\" src=\"\/wp-content\/uploads\/2019\/08\/e5d6a9f6ca0fc445f705a645e5319c06.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>G\u0142\u00f3wne tezy lub o czym jest ten artyku\u0142<\/h4>\n<p>\nTematem artyku\u0142u jest wizualne programowanie PLC <b>ShIoTiny<\/b> do inteligentnego domu, opisanego tutaj: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/463107\/\">ShIoTiny: ma\u0142a automatyzacja, Internet rzeczy lub \u201ena sze\u015b\u0107 miesi\u0119cy przed urlopem\u201d<\/a><\/noindex>.<\/p>\n<p><b>Bardzo kr\u00f3tko<\/b> om\u00f3wione s\u0105 takie poj\u0119cia jak <b>w\u0119z\u0142y<\/b>, <b>po\u0142\u0105czenia<\/b>, <b>zdarzenia<\/b>, a tak\u017ce szczeg\u00f3\u0142y \u0142adowania i wykonywania wizualnego programu na <b>ESP8266<\/b>, kt\u00f3ry jest podstaw\u0105 PLC <b>ShIoTiny<\/b>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>Wprowadzenie lub kilka kwestii organizacyjnych<\/h4>\n<p>\nW poprzednim artykule na temat mojego projektu zrobi\u0142em kr\u00f3tki przegl\u0105d mo\u017cliwo\u015bci kontrolera <b>ShIoTiny<\/b>.<\/p>\n<p>Jak nie dziwnie, publiczno\u015b\u0107 okaza\u0142a do\u015b\u0107 silne zainteresowanie i zada\u0142a mi sporo pyta\u0144. Niekt\u00f3rzy nawet od razu zaproponowali, \u017cebym sprzeda\u0142 im kontroler. Nie, nie mam nic przeciwko zarobieniu troch\u0119 pieni\u0119dzy, ale sumienie nie pozwala mi sprzedawa\u0107 bardzo surowej rzeczy pod wzgl\u0119dem programowym.<\/p>\n<p>Dlatego umie\u015bci\u0142em na GitHubie binaria oprogramowania i schemat urz\u0105dzenia: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shiotiny\/ShIoTinyBin\">oprogramowanie + kr\u00f3tka instrukcja + schemat + przyk\u0142ady<\/a><\/noindex>.<\/p>\n<p>Teraz ka\u017cdy mo\u017ce zaprogramowa\u0107 ESP-07 i samodzielnie pobawi\u0107 si\u0119 oprogramowaniem. Je\u015bli kto\u015b bardzo chce mie\u0107 dok\u0142adnie taki uk\u0142ad jak na zdj\u0119ciu \u2014 mam ich kilka sztuk. Prosz\u0119 pisa\u0107 na e-mail <b>shiotiny@yandex.ru<\/b>. Ale, jak m\u00f3wi\u0142 niezapomniany Og\u00f3rk\u00f3w: \u201eNie odpowiadam za nic!\u201d.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0441\u0443\u0442\u0438: \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 &#171;<b>w\u0119ze\u0142<\/b>&#187; (\u043d\u043e\u0434\u0430) \u0438 &#171;<b>zdarzenie<\/b>&#171;? \u041a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430?<\/p>\n<p>Jak zwykle \u2014 zaczniemy od pocz\u0105tku: od \u0142adowania programu.<\/p>\n<h4>Jak \u0142adowany jest program<\/h4>\n<p>\nZacznijmy od tego, co si\u0119 dzieje, kiedy naciskamy przycisk <b>Prze\u015blij<\/b> w edytorze <b>ElDraw<\/b> i nasz schemat-program, sk\u0142adaj\u0105cy si\u0119 z pi\u0119knych kwadrat\u00f3w, leci do urz\u0105dzenia.<\/p>\n<p>Po pierwsze, na podstawie narysowanego przez nas schematu budowana jest jego opis w formie tekstowej.<br \/>\nPo drugie, sprawdzane jest \u2014 czy wszystkie wej\u015bcia w\u0119z\u0142\u00f3w s\u0105 po\u0142\u0105czone z wyj\u015bciami. Nie powinno by\u0107 \u201ewisz\u0105cych\u201d wej\u015b\u0107. Je\u015bli takie wej\u015bcie zostanie odkryte \u2014 schemat w ShIoTiny nie zostanie za\u0142adowany, a edytor wy\u015bwietli odpowiednie ostrze\u017cenie.<\/p>\n<p>Je\u015bli wszystko posz\u0142o pomy\u015blnie, edytor przesy\u0142a do ShIoTiny opis tekstowy schematu po ka\u017cdym w\u0119\u017ale. Oczywi\u015bcie istniej\u0105cy schemat z ShIoTiny jest wcze\u015bniej usuwany. Otrzymany opis tekstowy jest zapisywany w pami\u0119ci FLASH.<\/p>\n<p>Zreszt\u0105, je\u015bli chcesz usun\u0105\u0107 schemat z urz\u0105dzenia, wystarczy za\u0142adowa\u0107 do niego pusty schemat (niezawieraj\u0105cy \u017cadnego elementu-w\u0119z\u0142a).<\/p>\n<p>Gdy tylko ca\u0142y schemat programu zostanie za\u0142adowany do PLC ShIoTiny, zaczyna on \u201edzia\u0142a\u0107\u201d. Co to oznacza?<\/p>\n<p>Warto zauwa\u017cy\u0107, \u017ce procesy \u0142adowania schematu z pami\u0119ci FLASH podczas w\u0142\u0105czania zasilania oraz podczas przesy\u0142ania schematu z edytora s\u0105 identyczne.<\/p>\n<p>Najpierw nast\u0119puje tworzenie obiekt\u00f3w-w\u0119z\u0142\u00f3w na podstawie ich opisu.<br \/>\nNast\u0119pnie ustalane s\u0105 po\u0142\u0105czenia mi\u0119dzy w\u0119z\u0142ami. Oznacza to, \u017ce generowane s\u0105 linki wyj\u015b\u0107 do wej\u015b\u0107 i wej\u015b\u0107 do wyj\u015b\u0107.<\/p>\n<p>Dopiero po wszystkim tym uruchamiany jest g\u0142\u00f3wny cykl wykonania programu.<\/p>\n<p>Pisa\u0142em d\u0142ugo, ale ca\u0142y proces \u2014 od \u201e\u0142adowania\u201d schematu z pami\u0119ci FLASH do uruchomienia g\u0142\u00f3wnego cyklu \u2014 zajmuje u\u0142amki sekund dla schematu sk\u0142adaj\u0105cego si\u0119 z 60-80 w\u0119z\u0142\u00f3w.<\/p>\n<p>Jak dzia\u0142a g\u0142\u00f3wny cykl? To bardzo proste. Najpierw czeka on na wyst\u0105pienie <b>zdarzenia<\/b> w jakimkolwiek w\u0119\u017ale, a nast\u0119pnie przetwarza to zdarzenie. I tak w niesko\u0144czono\u015b\u0107. No, albo do czasu, a\u017c za\u0142aduj\u0105 nowy schemat do ShIoTiny.<\/p>\n<p>Ju\u017c kilkakrotnie wspomnia\u0142em o takich rzeczach jak <b>zdarzenia<\/b>, <b>w\u0119z\u0142y<\/b> i <b>po\u0142\u0105czenia<\/b>. Ale co to takiego z programistycznego punktu widzenia? O tym porozmawiamy dzisiaj.<\/p>\n<h4>W\u0119z\u0142y, po\u0142\u0105czenia i zdarzenia<\/h4>\n<p>\nWystarczy spojrze\u0107 na przyk\u0142ady schemat\u00f3w program\u00f3w dla <b>ShIoTiny<\/b>, aby zrozumie\u0107, \u017ce schemat sk\u0142ada si\u0119 tylko z dw\u00f3ch byt\u00f3w \u2014 w\u0119z\u0142\u00f3w (lub element\u00f3w) i po\u0142\u0105cze\u0144 mi\u0119dzy nimi.<\/p>\n<p><b>W\u0119ze\u0142<\/b>, <b>w\u0119ze\u0142<\/b> lub <b>element schematu<\/b> \u2014 to wirtualna reprezentacja jakiego\u015b <b>dzia\u0142ania<\/b> na danych. Mo\u017ce to by\u0107 operacja arytmetyczna, operacja logiczna lub jakakolwiek inna operacja, kt\u00f3ra przyjdzie nam do g\u0142owy. Wa\u017cne jest, \u017ce w\u0119ze\u0142 ma wej\u015bcie i wyj\u015bcie.<\/p>\n<p><b>Wst\u0119p<\/b> \u2014 to miejsce, gdzie w\u0119ze\u0142 przyjmuje dane. Obrazy wej\u015b\u0107 to punkty, kt\u00f3re zawsze znajduj\u0105 si\u0119 po lewej stronie w\u0119z\u0142a.<\/p>\n<p><b>Wyj\u015bcie<\/b> \u2014 to miejsce, sk\u0105d wydobywany jest wynik dzia\u0142ania w\u0119z\u0142a. Obrazy wyj\u015b\u0107 to punkty, kt\u00f3re zawsze znajduj\u0105 si\u0119 po prawej stronie w\u0119z\u0142a.<\/p>\n<p>Niekt\u00f3re w\u0119z\u0142y nie maj\u0105 wej\u015b\u0107. Takie w\u0119z\u0142y generuj\u0105 wynik wewn\u0119trznie. Na przyk\u0142ad w\u0119ze\u0142-sta\u0142a lub w\u0119ze\u0142-czujnik: nie potrzebuj\u0105 danych z innych w\u0119z\u0142\u00f3w, aby poda\u0107 wynik.<\/p>\n<p>Z kolei inne w\u0119z\u0142y, wr\u0119cz przeciwnie, nie maj\u0105 wyj\u015b\u0107. S\u0105 to w\u0119z\u0142y, kt\u00f3re przedstawiaj\u0105 na przyk\u0142ad urz\u0105dzenia wykonawcze (przeka\u017aniki lub inne podobne). Przyjmuj\u0105 dane, ale nie generuj\u0105 wynik\u00f3w oblicze\u0144, kt\u00f3re s\u0105 dost\u0119pne dla innych w\u0119z\u0142\u00f3w.<\/p>\n<p>Ponadto istnieje jeszcze unikalny w\u0119ze\u0142-komentarz. Nic nie robi, nie ma ani wej\u015b\u0107, ani wyj\u015b\u0107. Jego przeznaczeniem jest by\u0107 obja\u015bnieniem na schemacie.<\/p>\n<p>Co to jest \u201e<b>zdarzenie<\/b>\u00bb? <b>Zdarzenie<\/b> \u2014 to pojawienie si\u0119 nowych danych w jakimkolwiek w\u0119\u017ale. Na przyk\u0142ad do zdarze\u0144 nale\u017cy: zmiana stanu wej\u015bcia (w\u0119ze\u0142 <b>Input<\/b>), przyj\u0119cie danych z innego urz\u0105dzenia (w\u0119z\u0142y <b>MQTT<\/b> i <b>UDP<\/b>), up\u0142yni\u0119cie okre\u015blonego czasu (w\u0119z\u0142y <b>Timer<\/b> i <b>Op\u00f3\u017anienie<\/b>) i tak dalej.<\/p>\n<p>Do czego potrzebne s\u0105 zdarzenia? Ot\u00f3\u017c, aby okre\u015bli\u0107 \u2014 w kt\u00f3rym w\u0119\u017ale wyst\u0105pi\u0142y nowe dane i jakie stany w\u0119z\u0142\u00f3w nale\u017cy zmieni\u0107 w zwi\u0105zku z otrzymaniem nowych danych. Zdarzenie \u201eprzechodzi\u201d przez \u0142a\u0144cuch w\u0119z\u0142\u00f3w, a\u017c obejdzie wszystkie w\u0119z\u0142y, kt\u00f3rych stany musz\u0105 zosta\u0107 sprawdzone i zmienione.<\/p>\n<p>Wszystkie w\u0119z\u0142y mo\u017cna podzieli\u0107 na dwie kategorie. <br \/>\nW\u0119z\u0142y, kt\u00f3re mog\u0105 generowa\u0107 zdarzenia nazywamy \u201e<b>aktywnymi w\u0119z\u0142ami<\/b>\u00bb.<br \/>\nW\u0119z\u0142y, kt\u00f3re nie mog\u0105 generowa\u0107 zdarze\u0144 nazywamy \u201e<b>pasywnymi w\u0119z\u0142ami<\/b>\u00bb.<\/p>\n<p>Gdy w\u0119ze\u0142 generuje zdarzenie (to znaczy, \u017ce na jego wyj\u015bciu pojawiaj\u0105 si\u0119 nowe dane), to w og\u00f3lnym przypadku zmienia si\u0119 stan ca\u0142ego \u0142a\u0144cucha w\u0119z\u0142\u00f3w pod\u0142\u0105czonych do wyj\u015bcia w\u0119z\u0142a-generatora zdarzenia.<\/p>\n<p>Aby by\u0142o to zrozumia\u0142e, rozwa\u017cmy przyk\u0142ad na rysunku.<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: w\u0119z\u0142y, po\u0142\u0105czenia i zdarzenia, czyli cechy rysowania program\u00f3w\" src=\"\/wp-content\/uploads\/2019\/08\/41b53ae925e85c3f272adec876ab3151.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAktywne w\u0119z\u0142y to \u2014 Input1, Input2 i Input3. Pozosta\u0142e w\u0119z\u0142y s\u0105 pasywne. Rozwa\u017cmy, co si\u0119 dzieje, gdy zamykany jest ten czy inny wej\u015bcie. Wyniki zosta\u0142y dla wygody zebrane w tabeli.<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: w\u0119z\u0142y, po\u0142\u0105czenia i zdarzenia, czyli cechy rysowania program\u00f3w\" src=\"\/wp-content\/uploads\/2019\/08\/0a8435184f85e919f763048120e6e780.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJak wida\u0107, w przypadku wyst\u0105pienia zdarzenia, buduje si\u0119 \u0142a\u0144cuch od w\u0119z\u0142a-\u017ar\u00f3d\u0142a zdarzenia do w\u0119z\u0142a ko\u0144cowego. Stan tych w\u0119z\u0142\u00f3w, kt\u00f3re nie znajduj\u0105 si\u0119 w \u0142a\u0144cuchu, nie zmienia si\u0119.<\/p>\n<p>Pojawia si\u0119 zasadne pytanie, co si\u0119 stanie w przypadku wyst\u0105pienia dw\u00f3ch lub wr\u0119cz kilku zdarze\u0144 jednocze\u015bnie?<\/p>\n<p>Jako mi\u0142o\u015bnika tw\u00f3rczo\u015bci Gleb-a Anfilova, czuj\u0119 si\u0119 sk\u0142onny odes\u0142a\u0107 ciekawskiego pytaj\u0105cego do jego ksi\u0105\u017cki \u201eUcieczka od zdziwie\u0144\u201d. To taka \u201eteoria wzgl\u0119dno\u015bci dla najmniejszych\u201d, w kt\u00f3rej dobrze opowiedziano, co to znaczy \u201ejednocze\u015bnie\u201d i jak z tym \u017cy\u0107.<\/p>\n<p>Jednak czysto praktycznie wszystko jest znacznie prostsze: w przypadku wyst\u0105pienia dw\u00f3ch lub wr\u0119cz kilku zdarze\u0144, kolejno budowane i przetwarzane s\u0105 wszystkie \u0142a\u0144cuchy z ka\u017cdego \u017ar\u00f3d\u0142a zdarzenia, po kolei i \u017cadnych cud\u00f3w.<\/p>\n<p>Pytanie, kt\u00f3re mo\u017ce zada\u0107 ciekawy czytelnik, brzmi: co si\u0119 stanie, je\u015bli po\u0142\u0105czymy w\u0119z\u0142y w pier\u015bcie\u0144? Lub, jak to cz\u0119sto m\u00f3wi\u0105 ci m\u0105drzejsi, wprowadzimy sprz\u0119\u017cenie zwrotne. To znaczy, po\u0142\u0105czymy wyj\u015bcie jednego z w\u0119z\u0142\u00f3w z wej\u015bciem poprzedniego w\u0119z\u0142a, tak aby stan wyj\u015bcia tego w\u0119z\u0142a wp\u0142ywa\u0142 na stan jego wej\u015bcia. Bezpo\u015brednie po\u0142\u0105czenie wyj\u015bcia w\u0119z\u0142a z jego wej\u015bciem uniemo\u017cliwi ci edytor. <b>ElDraw<\/b>. Ale po\u015brednio, jak na rysunku poni\u017cej \u2014 jest to mo\u017cliwe.<\/p>\n<p>C\u00f3\u017c, co si\u0119 stanie w tym przypadku? Odpowied\u017a b\u0119dzie bardzo \"konkretna\": w zale\u017cno\u015bci od tego, jakie w\u0119z\u0142y. Rozwa\u017cmy przyk\u0142ad na rysunku.<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: w\u0119z\u0142y, po\u0142\u0105czenia i zdarzenia, czyli cechy rysowania program\u00f3w\" src=\"\/wp-content\/uploads\/2019\/08\/7a640c3abfd4868b87f415bce93e4918.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGdy kontakty wej\u015bcia Input1 s\u0105 otwarte na g\u00f3rnym wej\u015bciu w\u0119z\u0142a A \u2014 0. Na wyj\u015bciu w\u0119z\u0142a A tak\u017ce 0. Na wyj\u015bciu w\u0119z\u0142a B \u2014 1. I w ko\u0144cu, na dolnym wej\u015bciu w\u0119z\u0142a A \u2014 1. Wszystko jasne. A ci, kt\u00f3rzy nie rozumiej\u0105 \u2014 niech spojrz\u0105 poni\u017cej na opis dzia\u0142ania w\u0119z\u0142\u00f3w \"AND\" i \"NOT\".<\/p>\n<p>Teraz zamkniemy kontakty wej\u015bcia Input1, to znaczy podamy na g\u00f3rne wej\u015bcie w\u0119z\u0142a A jedynk\u0119. Ci, kt\u00f3rzy znaj\u0105 si\u0119 na elektronice, wiedz\u0105, \u017ce tak naprawd\u0119 otrzymamy klasyczn\u0105 schemat generatora na elementach logicznych. I w teorii taka schemat powinien niesko\u0144czono\u015b\u0107 wydawa\u0107 na wyj\u015bciu element\u00f3w A i B sekwencje 1-0-1-0-1-0\u2026. i 0-1-0-1-0-1-\u2026. W ko\u0144cu zdarzenie powinno nieustannie zmienia\u0107 stany w\u0119z\u0142\u00f3w A i B, biegaj\u0105c w k\u00f3\u0142ko 2-3-2-3-\u2026!<\/p>\n<p>Jednak w rzeczywisto\u015bci tak si\u0119 nie dzieje. Schemat wpadnie w losowy stan \u2014 albo przeka\u017anik pozostanie w\u0142\u0105czony lub wy\u0142\u0105czony, albo mo\u017ce lekko si\u0119 zabrz\u0119cze\u0107, w\u0142\u0105czaj\u0105c si\u0119 i wy\u0142\u0105czaj\u0105c kilka razy z rz\u0119du. Wszystko zale\u017cy od pogody na po\u0142udniowym biegunie Marsa. A oto dlaczego tak si\u0119 dzieje.<\/p>\n<p>Zdarzenie z w\u0119z\u0142a Input1 zmienia stan w\u0119z\u0142a A, nast\u0119pnie w\u0119z\u0142a B i tak w k\u00f3\u0142ko kilka razy. Program okre\u015bla \u201ecykl\u201d zdarzenia i przymusowo ko\u0144czy ten karnawa\u0142. Po tym zmiana stanu w\u0119z\u0142\u00f3w A i B jest zablokowana do momentu wyst\u0105pienia nowego zdarzenia. Moment, w kt\u00f3rym program zdecyduje \u2014 \u201edo\u015b\u0107 kr\u0119cenia si\u0119 w k\u00f3\u0142ko!\u201d \u2014 w og\u00f3lnym przypadku zale\u017cy od wielu czynnik\u00f3w i mo\u017cna go uzna\u0107 za losowy.<\/p>\n<blockquote><p>Uwa\u017caj, \u0142\u0105cz\u0105c w\u0119z\u0142y w pier\u015bcie\u0144 \u2014 efekty nie zawsze b\u0119d\u0105 oczywiste! Dobrze rozumie\u0107, co i po co robisz!<\/p><\/blockquote>\n<p> Czy mo\u017cna jednak zbudowa\u0107 generator na dost\u0119pnych nam w\u0119z\u0142ach? Tak, mo\u017cna! Ale potrzebny jest w\u0119ze\u0142, kt\u00f3ry potrafi generowa\u0107 zdarzenia. Taki w\u0119ze\u0142 istnieje \u2014 to \u201elinia op\u00f3\u017anienia\u201d. Zobaczmy, jak dzia\u0142a generator z okresem 6 sekund na poni\u017cszym rysunku.<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: w\u0119z\u0142y, po\u0142\u0105czenia i zdarzenia, czyli cechy rysowania program\u00f3w\" src=\"\/wp-content\/uploads\/2019\/08\/7dc1babedec97fb8177b846c760ff44e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKluczowym elementem generatora jest w\u0119ze\u0142 A \u2014 linia op\u00f3\u017anienia. Je\u015bli zmienisz stan wej\u015bcia linii op\u00f3\u017anienia z 0 na 1, to 1 na wyj\u015bciu pojawi si\u0119 nie od razu, lecz dopiero po up\u0142ywie okre\u015blonego czasu. W naszym przypadku to 3 sekundy. Dok\u0142adnie tak samo, je\u015bli zmienisz stan wej\u015bcia linii op\u00f3\u017anienia z 1 na 0, to 0 na wyj\u015bciu pojawi si\u0119 po tych samych 3 sekundach. Czas op\u00f3\u017anienia ustawia si\u0119 w dziesi\u0105tych cz\u0119\u015bciach sekundy. Czyli warto\u015b\u0107 30 oznacza \u2014 3 sekundy.<\/p>\n<p>Cech\u0105 linii op\u00f3\u017anienia jest to, \u017ce generuje zdarzenie po up\u0142ywie czasu op\u00f3\u017anienia.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce pocz\u0105tkowo na wyj\u015bciu linii op\u00f3\u017anienia by\u0142a 0. Po przej\u015bciu przez w\u0119ze\u0142 B \u2014 inwerter \u2014 ta 0 zamienia si\u0119 w 1 i trafia na wej\u015bcie linii op\u00f3\u017anienia. Nic natychmiast si\u0119 nie dzieje. Na wyj\u015bciu linii op\u00f3\u017anienia wci\u0105\u017c jest 0, ale rozpoczyna si\u0119 odliczanie czasu op\u00f3\u017anienia. Mijaj\u0105 3 sekundy. I wtedy linia op\u00f3\u017anienia generuje zdarzenie. Na wyj\u015bciu pojawia si\u0119 1. Ta jedynka po przej\u015bciu przez w\u0119ze\u0142 B \u2014 inwerter \u2014 zamienia si\u0119 w 0 i trafia na wej\u015bcie linii op\u00f3\u017anienia. Mijaj\u0105 kolejne 3 sekundy... i proces powtarza si\u0119. Oznacza to, \u017ce co 3 sekundy stan wyj\u015bcia linii op\u00f3\u017anienia zmienia si\u0119 z 0 na 1, a nast\u0119pnie z 1 na 0. Przeka\u017anik klika. Generator dzia\u0142a. Okres impuls\u00f3w wynosi 6 sekund (3 sekundy na wyj\u015bciu zero i 3 sekundy \u2014 jedynka).<\/p>\n<p>Jednak w rzeczywistych schematach zwykle nie trzeba u\u017cywa\u0107 nawet tego przyk\u0142adu. Istniej\u0105 specjalne w\u0119z\u0142y-timery, kt\u00f3re doskonale i samodzielnie generuj\u0105 sekwencj\u0119 impuls\u00f3w o okre\u015blonym okresie. Czas trwania \u201ezera\u201d i \u201ejedynki\u201d w tych impulsach jest r\u00f3wny po\u0142owie okresu.<\/p>\n<blockquote><p>Aby ustawi\u0107 dzia\u0142ania okresowe, korzystaj z w\u0119z\u0142\u00f3w-timer\u00f3w.<\/p><\/blockquote>\n<p> Zaznaczam, \u017ce takie sygna\u0142y cyfrowe, w kt\u00f3rych czas trwania \u201ezera\u201d i \u201ejedynki\u201d jest r\u00f3wny, nazywane s\u0105 \u201emeandrem\u201d. <\/p>\n<p>Mam nadziej\u0119, \u017ce troch\u0119 wyja\u015bni\u0142em kwesti\u0119 tego, jak zachodzi rozprzestrzenianie zdarze\u0144 mi\u0119dzy w\u0119z\u0142ami i czego nie nale\u017cy robi\u0107?<\/p>\n<h4>Podsumowanie i linki<\/h4>\n<p>\nArtyku\u0142 wyszed\u0142 kr\u00f3tki, ale jest odpowiedzi\u0105 na pojawiaj\u0105ce si\u0119 pytania dotycz\u0105ce w\u0119z\u0142\u00f3w i zdarze\u0144.<\/p>\n<p>W miar\u0119 rozwoju oprogramowania i pojawiania si\u0119 nowych przyk\u0142ad\u00f3w b\u0119d\u0119 pisa\u0142 o tym, jak programowa\u0107 <b>ShIoTiny<\/b> kr\u00f3tkie artyku\u0142y, dop\u00f3ki b\u0119dzie to interesowa\u0107 ludzi.<\/p>\n<p>Jak wcze\u015bniej, schemat, oprogramowanie, przyk\u0142ady, opisy w\u0119z\u0142\u00f3w i wszystko <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shiotiny\/ShIoTinyBin\">inne znajdziesz tutaj<\/a><\/noindex>.<\/p>\n<p>Pytania, \u017cyczenia, krytyka \u2013 tutaj: <b>shiotiny@yandex.ru<\/b><br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/463285\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b \u0438\u043b\u0438 \u043e \u0447\u0435\u043c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0422\u0435\u043c\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u041f\u041b\u041a ShIoTiny \u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0430, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0443\u0442: ShIoTiny: \u043c\u0430\u043b\u0430\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f, \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0432\u0435\u0449\u0435\u0439 \u0438\u043b\u0438 \u00ab\u0437\u0430 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u0434\u043e \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u00bb. \u041e\u0447\u0435\u043d\u044c \u043a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u043a\u0430\u043a \u0443\u0437\u043b\u044b, \u0441\u0432\u044f\u0437\u0438, \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 ESP8266, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u041f\u041b\u041a ShIoTiny. \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28078,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37422","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b \u0438\u043b\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/shiotiny-uzly-svyazi-i-sobytiya-ili-osobennosti-risovaniya-programm\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47ShIoTiny: \u0443\u0437\u043b\u044b, \u0441\u0432\u044f\u0437\u0438 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u043b\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b \u0438\u043b\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/shiotiny-uzly-svyazi-i-sobytiya-ili-osobennosti-risovaniya-programm\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:17:33+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:17:33+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47ShIoTiny: w\u0119z\u0142y, po\u0142\u0105czenia i zdarzenia lub cechy rysowania program\u00f3w | ProHoster","description":"G\u0142\u00f3wne tezy lub.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/shiotiny-uzly-svyazi-i-sobytiya-ili-osobennosti-risovaniya-programm","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47ShIoTiny: \u0443\u0437\u043b\u044b, \u0441\u0432\u044f\u0437\u0438 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u043b\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c | ProHoster","og:description":"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b \u0438\u043b\u0438.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/shiotiny-uzly-svyazi-i-sobytiya-ili-osobennosti-risovaniya-programm","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:17:33+00:00","article:modified_time":"2019-10-31T19:17:33+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37422","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 17:45:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:27:24","updated":"2026-01-23 17:45:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37422","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=37422"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37422\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/28078"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=37422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=37422"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=37422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}