MicroPython na malém zařízení

Tahle sekce bohužel nejde jednoduše projít z domu.

Využíváme speciální vybavení, které je potřeba nejdřív sehnat. Máš-li možnost se dostat na sraz, nebo aspoň kontaktovat organizátory, doporučujeme shánět spíš tímto způsobem. Případně jde daný hardware objednat přes Internet, typicky z čínských e-shopů.

Materiály byly připraveny pro celodenní workshop; na kratší lekcích může být něco vynecháno.

LoLin NodeMCU v3 – Vývojová deska s čipem ESP8266

Dnes budeme programovat malé zařízení – tak malé, že se ho pohodlně schováš v ruce. Konkrétně budeme používat „chytrou destičku”, modul zvaný NodeMCU Devkit, která by měla ležet před tebou. Než ji vyndáš z obalu, měl/a by ses vybít: dotkni se něčeho kovového, co je spojeno se zemí, třeba radiátoru nebo kovové části schránky nějakého spotřebiče, který je zapojený do zásuvky. Tím se zbavíš statické elektřiny, která by mohla malinké zařízení poškodit. Pak přístroj vyndej z obalu. Snaž se ho držet za hrany a příliš se nedotýkat elektroniky a kovových částí.

Obal bude nejspíš roztržený, protože organizátoři na destičku před začátkem kurzu nainstalovali MicroPython.

Obal je vodivý a nesmí přijít do styku se zapojenou destičkou, protože by mohl zkratovat její vývody a tím ji zničit. Proto obal raději hned schovej a používej ho jen k transportu destičky.

Teď, když destičku držíš v ruce, si pojďme projít její základní součásti.


Obrázek desky NodeMCU DevKit

Nejdůležitější část vývojové desky je v oplechované krabičce s logem "Wi-Fi" a "FCC": mikroprocesor ESP8266. To je „mozek” celého zařízení, který – když je správně naprogramován – umí provádět pythonní příkazy a programy. Procesor sedí na malé destičce, na které je ještě anténa, kterou přístroj může komunikovat s okolím.

Tahle malá destička se dá použít i samostatně; všechno ostatní, co kolem ní zabírá tolik místa, nám jen ulehčí hraní a umožní se zařízením jednoduše komunikovat a krmit ho elektřinou.

Komunikace a „krmení” se děje přes mikro-USB konektor, do kterého zapojíš kabel ze svého počítače. Když je modul naprogramovaný, stačí ho místo do počítače zapojit do nabíječky či externího zdroje (powerbanky) a bude fungovat samostatně.

Kolem USB konektoru jsou dvě tlačítka: RST, kterým se destička restartuje (skoro jako kdybys ho odpojila a zase zapojila, což se hodí, když něco uděláš špatně a modul „zamrzne”), a FLASH, o kterém si povíme později.

Po stranách modulu jsou dvě řady „nožiček”, na které se dá napojit celá řada nejrůznějších hraček. Zkontroluj si, jestli jsou všechny nožičky rovné; kdyby byla některá ohnutá, tak ji (nejlépe s pomocí kouče) narovnej nebo si vezmi jinou destičku.


Instalace

Bohužel se dnes neobejdeme bez instalace. Musíš naučit svůj počítač, aby si s destičkou povídal.

Nejdřív si do virtuálního prostředí nainstaluj program Ampy od Adafruitu. Ten budeme později používat na nahrávání kódu:

(env)$ python -m pip install adafruit-ampy

Pak propoj modul s počítačem přes USB kabel, jako kdybys připojoval/a třeba mobil.

Je potřeba použít kvalitní datový kabel. Nekvalitní kabely (např. spousta kabelů k nabíječkám) jsou často nepoužitelné.

Dál postupuj podle operačního systému na svém počítači. Kdyby něco nefungovalo, poraď se s koučem. Původní (anglický) návod k této části je na stránkách MicroPythonu.

Linux

Na správně nastaveném počítači stačí zadat:

$ picocom -b 115200 --flow n /dev/ttyUSB0

Pokud příkaz neskončí s chybou, stiskni tlačítko RST na modulu. Měly by se nakonec objevit tři zobáčky, >>>.

Většina počítačů ale na komunikaci s malými zařízeními nastavená není. Skončí-li příkaz picocom s chybou, oprav ji podle následujícího návodu a zkus to znova. (Možná bude potřeba vyřešit víc než jednu chybu.)

  • Nemáš-li příkaz picocom nainstalovaný, je potřeba ho nainstalovat (např. sudo dnf install picocom nebo sudo apt-get install picocom).
  • Pokud picocom skončil s chybou No such file or directory, pravděpodobně je potřeba k zařízení přistupovat přes jiný soubor. Použij příkaz dmesg | tail, který vypíše něco jako:

    $ dmesg | tail
    [703169.886296] ch341 1-1.1:1.0: device disconnected
    [703176.972781] usb 1-1.1: new full-speed USB device number 45 using ehci-pci
    [703177.059448] usb 1-1.1: New USB device found, idVendor=1a86, idProduct=7523
    [703177.059454] usb 1-1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
    [703177.059457] usb 1-1.1: Product: USB2.0-Serial
    [703177.060474] ch341 1-1.1:1.0: ch341-uart converter detected
    [703177.062781] usb 1-1.1: ch341-uart converter now attached to ttyUSB0
    

    Máš-li místo ttyUSB0 něco jiného, v příkazu picocom to použij místo ttyUSB0.

  • Pokud picocom skončil s chybou Permission denied, potřebuješ získat přístup k souboru zařízení. To znamená přidat se do příslušné skupiny:

    $ sudo usermod -a -G dialout $(whoami)
    

    Poté je potřeba se znovu přihlásit, třeba příkazem:

    $ su - $(whoami)
    

    Pro ověření spusť příkaz groups; v jeho výstupu by mělo být dialout. Například:

    $ groups
    kristyna lp wheel dialout mock
    

    Kdyby to nefungovalo, na srazu ti může pomoci nějaký kouč. Jestli procházíš materiály z domu a nepovedlo se ti přidat do skupiny, dá se to obejít tak, že místo picocom použiješ sudo picocom.

Windows

MicroPython se přihlásí jako COM port. Otevři správce zařízení a zjisti, který COM port to je (kouč s tím pomůže).

Nebylo-li zařízení nalezeno, je potřeba nainstalovat driver, který je ke stažení třeba z tohoto blogu.

Pak si nainstaluj program PuTTY (putty.exe) a spusť ho. V konfiguračním okýnku zaškrtni Connection Type: Serial a do Serial line: zadej svůj COM port. Pak přepni v seznamu vlevo na Serial a nastav Speed na 115200 a Flow Control na None:

Obrázek nastavení PuTTY

Potom zpátky v kategorii Session můžeš nastavení uložit pro příště: do políčka Saved Sessions zadej MicroPython a klikni OK.

Nakonec klikni Open. Mělo by se otevřít okýnko podobné konzoli, kde se, když zmáčkneš na modulu RST, objeví nakonec tři zobáčky: >>>.

macOS

V příkazové řádce zadej:

$ screen /dev/tty.usbmodem* 115200

a stiskni Enter. Pak na modulu zmáčkni RST. Měly by se nakonec objevit tři zobáčky, >>>.

Nejde-li to, je možná potřeba nainstalovat driver. Ten se dá stáhnout z tohoto blogu.

MicroPython – taky Python

Tak jako máš na počítači nainstalovaný operační systém, na vývojové desce je takzvaný firmware, program, který ovládá všechny ty drátky, čipy a světýlka, co v ní jsou. My používáme firmware zvaný MicroPython, který navíc rozumí jazyku Python a umí provádět pythonní příkazy. Zkus si to! Tři zobáčky, které vyskočily v minulém kroku, přišly ze zařízení, které teď netrpělivě čeká na příkaz.

>>> 1+1
2
>>> print('Hello World')
Hello World

Téměř vše, co používáš v Pythonu na počítači, umí MicroPython taky: čísla, řetězce, seznamy, třídy, výjimky, moduly a tak dál. Některé detaily ale jsou trochu osekané, aby se všechno vešlo do extrémně malého prostoru. Zkus si, jak se liší efekt následujících příkazů od „velkého” Pythonu:

>>> print
>>> import math
>>> math.pi

Nejdůležitější věc, která je osekaná, je standardní knihovna – většina modulů, které na počítači můžeš naimportovat, v MicroPythonu chybí. U modulů jako turtle je to pochopitelné, ale v rámci šetření místem chybí i moduly jako random. Většinou to příliš nevadí – malá zařízení se používají na jiné věci než ty velké – ale je potřeba si na to dát pozor.

Některé věci ze standardní knihovny se dají najít ve zjednodušené formě na jiných místech. Například ačkoliv modul random chybí, náhodné číslo od 0 do 255 se dá získat pomocí:

>>> from os import urandom
>>> urandom(1)[0]
61

Ovládání konzole

Při psaní složitějšího kódu si všimneš, že konzole MicroPythonu automaticky odsazuje. To je pro malé programy pohodlné, ale umí to i znepříjemnit život – hlavně když chceme kód do konzole vložit.

Proto má konzole MicroPythonu speciální vkládací mód, který automatické odsazování vypíná. Aktivuje se pomocí Ctrl+E a ukončuje se pomocí Ctrl+D.

Vstup

MicroPython na malé destičce obsahuje některé moduly, které jinde nenajdeš. Ten hlavní se jmenuje machine a zpřístupňuje základní funkce zařízení. Zkus si:

from machine import Pin
pin = Pin(0, Pin.IN)
print(pin.value())

Zmáčkni a drž tlačítko FLASH vedle USB konektoru. Přitom pusť print(pin.value()) znovu. Jak se hodnota změní?

Jak tomuhle kódu rozumět? Třída Pin ti umožňuje ovládat jednotlivé „nožičky”, kterými zařízení komunikuje s vnějším světem: buď na nich nastavovat napětí, nebo zkoumat jestli na nich nějaké napětí je.

Pin(0, Pin.IN) vytvoří objekt třídy Pin, který bude načítat data z „nožičky” číslo 0. (IN znamená načítání – informace jdou do procesoru). Funkce pin.value() změří napětí na dané „nožičce” a vrátí buď 1 nebo 0 podle toho, jestli nějaké naměřila.

No a „nožička” číslo 0 je připojená k tlačítku FLASH, kterým se tak dá ono napětí ovládat. Informace o tom, která nožička je kam připojená, máš na taháku – můžeš si zkontrolovat, že Pin(0) u sebe má poznámku FLASH.

Obvod

Teď na chvíli necháme programování a postavíme si elektrický obvod. Vezmi si modrou svítivou diodu (LED, „světýlko”) a nepájivé pole („hloupou destičku”). Zkusíme světýlko rozsvítit.

LED rozsvítíš tak, že ji připojíš ke zdroji napětí, například k baterce.

Jako zdroj napětí můžeme použít i náš modul. Ten bere elektřinu přes USB a dává nám ji k dispozici na některých svých „nožičkách”: konkrétně plus na nožičce označené 3V a mínus na nožičce označené G. Na tyhle nožičky musíš zapojit diodu.

Připojování diody má jeden háček: musíš ji zapojit správným směrem – plus na plus, mínus na mínus. Opačně dioda svítit nebude. Dobrá zpráva je, že když diodu otočíš špatně, nic se jí nestane.

Základní vlastnost diody je ta, že pustí elektrický proud jen jedním směrem. Svítící dioda – angl. Light Emitting Diode, LED – ještě k tomu navíc svítí.

Je potřeba rozpoznat rozdíl mezi nožičkami diody. Katoda (-) je ta kratší nožička. Pouzdro diody je u katody trochu seříznuté a vevnitř v pouzdře, když se pozorně podíváš, uvidíš u katody větší plíšek. Té druhé nožičce se říká anoda (+).

Tak, teď víš, kam diodu zapojit: katodu (kratší nožičku) na G a anodu na 3V.

Držení nožiček diody u nožiček modulu by ti nejspíš zaměstnalo obě ruce. Aby sis je uvolnila, použij nepájivé pole (angl. breadboard). Je v něm spousta dírek, do kterých se dají strkat dráty. V rámci každé poloviny destičky je každá řada dírek – tedy každá pětice – spojená dohromady. Když zapojíš drátky do stejné řady, spojíš je tím.

Zasuň modul do nepájivého pole. Pak připoj katodu do dírky ve stejné řadě, kde je nožička 3V modulu, a podobně anodu k G. Mělo by to vypadat jako na tomto obrázku:

diagram zapojení

Potom zapoj USB kabel. Dioda by se měla rozsvítit!

Zkus si, co se stane, když obě nožičky diody zapojíš ke G.

diagram zapojení

Aby dioda svítila, musí být připojená na dvě místa, mezi kterými je takzvaný potenciálový rozdíl — napětí. Na nožičce G je 0 voltů; na nožičce 3V jsou 3,3 volty – je tedy mezi nimi rozdíl 3,3 V, přesně tolik, kolik modrá LED potřebuje ke svícení.

Samotná hodnota napětí nedává smysl – například říct, že je na jednom místě 3,3 V je nepřesné. Hodnota ve voltech se vždycky musí k něčemu vztahovat; vyjadřuje rozdíl mezi dvěma místy. V elektronice používáme rozdíl oproti „zemi” – napětí na nožičce G. Stanovíme si, že tam je 0 voltů a ostatní napětí počítáme vzhledem k ní. Na nožičce 3V je tedy napětí 3,3 V vzhledem k zemi.

Výstup

Proč jsme diodu na to, aby se rozsvítila, připojili k modulu a ne jen k baterce? Ten modul je trošku složitější zařízení než baterka a jedna důležitá věc, kterou umí navíc, je nastavovat napětí na různých nožičkách. Umí zařídit, aby se nožička chovala jednou jako 3V a jindy jako G. Když připojíš diodu mezi G a takovou přepínatelnou nožičku, můžeš nastavit, kdy svítí a kdy ne.

Přepoj anodu diody z 3V3 na D5. Katodu nech na G.

Máš-li zapojeno, znovu se připoj k MicroPythonu a zadej následující kód:

from machine import Pin
pin = Pin(14, Pin.OUT)
pin.value(0)
pin.value(1)

Když objekt Pin vytvoříš s Pin.OUT, MicroPython na něm bude nastavovat napětí – buď 3,3 V (value(1)) nebo 0 V (value(0)). A tak se dá s diodou blikat.

Číslování nožiček je bohužel dvojí – nožička označená jako D5 má v procesoru přiřazené číslo 14. Třída Pin v MicroPythonu používá číslování procesoru. Naštěstí máš tahák, kde snadno dohledáš že D5 a Pin(14) jsou dvě jména stejné nožičky.

Zvládneš napsat program, který zařídí, aby dioda svítila pouze když je zmáčknuté tlačítko FLASH a jinak ne?

Nápověda: Můžeš pořád dokola zjišťovat stav tlačítka a nastavovat podle něj stav LED.

Řešení

Pouštění kódu ze souboru

Jak začneš psát trochu složitější programy, mohlo by se stát, že tě konzole MicroPythonu začne trochu štvát. Špatně se v ní opravují chyby a automatické odsazování funguje jen většinou. Pojďme se podívat, jak naštvání předejít.

Doporučuji si větší kousky kódu – a určitě takové, ve kterých je nějaký cyklus, podmínka či funkce – psát v textovém editoru a do modulu pak posílat celý soubor.

Zkus si to. Do souboru blikajici_led.py dej následující kód:

from machine import Pin
from time import sleep
pin_diody = Pin(14, Pin.OUT)
while True:
    pin_diody.value(0)
    sleep(1/2)
    pin_diody.value(1)
    sleep(1/2)

Potom zavři konzoli (picocom, PuTTY nebo screen).

K pouštění programu použijeme ampy, který jsi nainstaloval/a dříve. Ke spuštění budeš potřebovat znát port:

  • Linux: port používáš v příkazu picocom, např. /dev/ttyUSB0
  • Windows: port používáš v PuTTY, např. COM13
  • macOS: port používáš v příkazu screen, např. /dev/tty.usbmodem*

ampy spusť následujícím příkazem, jen za PORT doplň svůj port:

(venv)$ ampy -p PORT run blikajici_led.py

Program by měl blikat diodou. Využívá k tomu funkci time.sleep(), která počká daný počet vteřin – tedy time.sleep(1/2) zastaví program na půl sekundy.

Velice rychle blikat

Jedna z nevýhod „našeho” čipu ESP8266 je, že na svých nožičkách umí nastavovat jen dvě hodnoty – 3,3 V a zem, jedničku a nulu. Dioda tak buď svítí, nebo nesvítí – nedá se nastavit poloviční intenzita, nedá se plynule rozsvěcet nebo zhasínat.

Tuhle nevýhodu ale můžeme obejít s využitím dvou faktů. Ten první je, že diodám – na rozdíl od žárovek nebo zářivek – nevadí časté vypínání a zapínání. Opotřebovávají se spíš svícením a časem. Druhý je, že lidské oko nestačí zaznamenat pohyby a změny, které probíhají rychleji než zhruba za setinu vteřiny.

Pojďme tedy velice rychle blikat – a oblafnout tak naše oči a mozky!

from machine import Pin

pin_diody = Pin(14, Pin.OUT)
while True:
    pin_diody.value(0)  # vypnout LED
    sleep(2/100)  # počkat dvě setiny vteřiny
    pin_diody.value(1)  # zapnout LED
    sleep(1/100)  # počkat jednu setinu vteřiny

Zkus si pohrát s hodnotami pro time.sleep.

Takhle fungují prakticky všechna stmívatelná LED světla – rychlé blikání je ekonomičtější a přesnější než např. nastavování nižšího napětí.

Dokážeš napsat program, který diodu postupně, plynule rozsvítí?

Protože je takovéhle rychlé blikání užitečné ve spoustě různých situací, obsahuje MicroPython speciální funkci: umí blikat samostatně. Nastavíš, jak rychle má blikat a jak dlouho má trvat každé bliknutí, a MicroPython pak bude blikat automaticky, zatímco tvůj program se může věnovat něčemu jinému.

Téhle funkci se říká pulzně šířková modulace – angl. Pulse Width Modulation, neboli PWM. Z MicroPythonu jde tahle funkce ovládat pomocí třídy machine.PWM. Každý objekt téhle třídy umí ovládat jednu nožičku a dají se u něj nastavit dva parametry:

  • freq – frekvence, tedy kolikrát za sekundu se LED rozsvítí a zase zhasne a
  • duty – anglicky duty cycle, česky střída, nastavuje „šířku pulzu”, tedy jak dlouho bude dioda při každém bliknutí svítit. Hodnota duty může být od 0, kdy LED nesvítí vůbec, do 1023, kdy svítí celou dobu. Nastavíš-li duty=512, bude dioda svítit s poloviční intenzitou (512 = 1024/2).

Nastavíš-li PWM(freq=50, duty=512), dioda bude blikat 50× za sekundu. Vždycky jednu setinu vteřiny bude svítit a na jednu setinu vteřiny zhasne.

from machine import Pin, PWM

pin_diody = Pin(14, Pin.OUT)
pwm = PWM(pin_diody, freq=50, duty=512)

Zkus nastavit i nižší frekvenci, třeba 3 nebo 1, ať blikání vidíš přímo!

PWM se dá zrušit metodou pwm.deinit(). Jako s otvíráním souborů, je dobré po sobě uklidit – i když zatím můžeš jednoduše restartovat celé zařízení.

Tóny a melodie

Vezmi si další součástku – piezobudič, neboli „bzučítko”.

Tahle malá věc obsahuje speciální materiál, který se, když ho připojíš ke zdroji napětí, trošku roztáhne. Roztažením zatlačí na okolní vzduch a vytvoří tlakovou vlnu, která může doputovat až k tvým uším.

Zkus si to – když bzučítko připojíš na 3V a G (tentokrát je jedno kterým směrem), uslyšíš tiché lupnutí. A podobné lupnutí uslyšíš když součástku zase odpojíš.

Co se stane, když budeš napětí připojovat a odpojovat, řekněme, 32× za vteřinu?

Nebo 65×?

Nebo některou z těchto frekvencí? Hz – Hertz – je jednotka frekvence; „49 Hz“ znamená „49× za sekundu“.

Nota  Frekvence
C1 32,70 Hz
D 36,71 Hz
E 41,20 Hz
F 43,65 Hz
G 49,00 Hz
A 55,00 Hz
H 61,74 Hz
C2 65,41 Hz

Naprogramuj písničku! Potřebuješ-li víc not, pusť si program, který vypočítá další frekvence.

Další ovládání

Teď si vezmi tlačítko a připoj ho k modulu: GND vždycky na G, VCC vždycky na 3V a OUT na D1.

Tlačítko funguje tak, že OUT spojí buď s VCC (3V) nebo GND, podle toho, jestli je tlačítko stisknuté. (A navíc to taky teda svítí, ale to je teď vedlejší.)

Zkus si, jestli se zvládneš MicroPythonu zeptat, jestli je tlačítko zapnuté. Mělo by to být podobné jako u příkladu s tlačítkem FLASH.

Zvládneš napsat program, který bude bzučet bzučítkem a přitom se bude dát tlačítkem změnit tón?

Program si (na svém počítači) ulož, ať se k němu můžeš vrátit.

Barevná světýlka

Je čas na novou hračku! Tentokrát to bude LED pásek.

Na pásku máš 8 malých čtverečků. Každý z nich obsahuje docela hodně elektroniky: tři barevné LED (červenou, zelenou a modrou) a čip, který je umí ovládat pomocí informací, které dostane přes jediný drátek z modulu.

Takové pásky se prodávají po metrech a dají se nastříhat – mezi jednotlivými světýlky si všimni čárky, která naznačuje, kde máš střihnout. Energie z USB stačí zhruba na osm světýlek, proto jsi jich dostal/a tolik.

Tenhle LED pásek je stavěný na pět voltů. Naštěstí ale potřebuje 5 V jen na napájení; řídící signál s informacemi o barvičkách může mít 3,3 V.

Pojďme pásek zapojit:

  • GND pásku (bílý drátek) připoj na G
  • DI (data in – zelený drátek) připoj na D4
  • +5V (červený drátek) připoj:
    • na VU, má-li tvoje destička tuhle nožičku,
    • jinak na VIN.

Nožička VU/VIN poskytuje 5 voltů. Pozor na ni: nepřipojuj na ni zařízení, které se s pěti volty nevyrovnají.

Máš-li zapojeno, můžeš začít programovat. „Jazyk”, kterým „mluví” tenhle LED pásek je trošku složitější než signál PWM, ale MicroPython obsahuje speciální knihovnu, která s páskem komunikovat umí. Vypadá to nějak takhle:

from machine import Pin
from neopixel import NeoPixel

POCET_LED = 8
pin = Pin(2, Pin.OUT)
np = NeoPixel(pin, POCET_LED)
np[0] = (255, 255, 255)
np.write()

Co znamenají ta čísla (0 a 255), na to už jistě přijdeš sám/sama. Jen při experimentování nezapomeň zavolat np.write(), tím se informace pošlou do LED pásku.

Zvládneš naprogramovat semafor?

Teploměr

Poslední součástkou, kterou si dnes ukážeme, bude jednoduchý teploměr DS18B20. Tento teploměr se vyrábí v několika provedeních a je velmi populární především pro jednoduchost použití a velmi nízkou cenu.

Stejně jako si MicroPython pomocí speciálního „jazyka” rozumí s LED páskem, ovládá i „jazyk” pro komunikaci s teploměrem a řadou dalších zařízení. 1-wire sběrnice má navíc tu výhodu, že se na jednu nožičku naší destičky dá připojit hned několik teploměrů a číst teploty z každého z nich.

Otoč teploměr tak, aby jeho „břicho” směřovalo směrem od tebe a takto jej zapoj do nevyužité části nepájivého pole. Následně propoj nožičky teploměru s destičkou takto:

  • Levou nožičku propoj s G
  • Prostřední nožičku propoj s D2
  • Pravou nožičku propoj s 3V

Po zapojení drž teploměr na chvíli mezi prsty. Pokud je zapojený špatně začne se velmi rychle zahřívat a v takovém případě jej okamžitě odpoj.

Pokud je vše zapojeno správně, můžeme přistoupit k měření teploty.

from time import sleep
from machine import Pin
import onewire
from ds18x20 import DS18X20


pin = machine.Pin(4, Pin.IN)
ow = DS18X20(onewire.OneWire(pin))

sensory = ow.scan()
ow.convert_temp()
sleep(1)
teplota = ow.read_temp(sensory[0])
print("Teplota je", teplota)

Nejdříve si opět připravíme nožičku (pin) pro komunikaci a následně si na ní připravíme komunikační protokol OneWire. Prvním krokem k teplotě je nalezení všech dostupných teploměrů na dané sběrnici, což nám zajistí metoda ow.scan(), která nám vrátí seznam identifikátorů nalezených teploměrů. Metoda ow.convert_temp() pak pošle všem teploměrům příkaz, aby změřily teplotu. Po tomhle rozkazu musíme alespoň vteřinu počkat a následně můžeme teplotu z našeho čidla přečíst.

WiFi

Jak jsme zmínili na začátku, byl čip ESP8266 primárně určen pro práci s WiFi a tato schopnost mu zůstala. Umí se buď připojit k existující síti, nebo ze sebe udělat hotspot a vytvořit si tak vlastní WiFi síť. Obě tyto možnosti nám umožní spojit se s destičkou bezdrátově a pracovat s ní skrze webový prohlížeč pomocí tzv. WebREPL, nebo použít připojení k síti k odesílání dat z destičky pro další zpracování.

Používání WiFi je ovšem mimo možnosti tohoto workshopu. Vše potřebné k jejímu zprovoznění je k dispozici v této části dokumentace.

Kam dál

Fantazii se meze nekladou a možnosti jsou nepřeberné. Velké množství informací naleznete v dokumentaci.

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2018/micropython-workshop-ostrava:workshop:1",
      "title": "PrĂ¡ce s MicroPythonem",
      "html": "\n          \n    \n\n    <h1>MicroPython na mal&#xE9;m za&#x159;&#xED;zen&#xED;</h1>\n<div class=\"admonition note\"><p class=\"admonition-title\">Tahle sekce bohu&#x17E;el nejde jednodu&#x161;e proj&#xED;t z domu.</p>\n<p>Vyu&#x17E;&#xED;v&#xE1;me speci&#xE1;ln&#xED; vybaven&#xED;, kter&#xE9; je pot&#x159;eba nejd&#x159;&#xED;v\nsehnat. M&#xE1;&#x161;-li mo&#x17E;nost se dostat na sraz, nebo\naspo&#x148; kontaktovat organiz&#xE1;tory, doporu&#x10D;ujeme sh&#xE1;n&#x11B;t\nsp&#xED;&#x161; t&#xED;mto zp&#x16F;sobem.\nP&#x159;&#xED;padn&#x11B; jde dan&#xFD; hardware objednat p&#x159;es Internet,\ntypicky z &#x10D;&#xED;nsk&#xFD;ch e-shop&#x16F;.</p>\n</div><div class=\"admonition note\"><p>Materi&#xE1;ly byly p&#x159;ipraveny pro celodenn&#xED; workshop;\nna krat&#x161;&#xED; lekc&#xED;ch m&#x16F;&#x17E;e b&#xFD;t n&#x11B;co vynech&#xE1;no.</p>\n</div><p><span class=\"figure float-right\"><a href=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/nodemcu-devkit.jpg\"><img src=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/nodemcu-devkit.jpg\" alt=\"LoLin NodeMCU v3 &#x2013; V&#xFD;vojov&#xE1; deska s &#x10D;ipem ESP8266\"></a></span></p>\n<p>Dnes budeme programovat mal&#xE9; za&#x159;&#xED;zen&#xED; &#x2013;\ntak mal&#xE9;, &#x17E;e se ho pohodln&#x11B; schov&#xE1;&#x161; v ruce.\nKonkr&#xE9;tn&#x11B; budeme pou&#x17E;&#xED;vat &#x201E;chytrou desti&#x10D;ku&#x201D;, modul zvan&#xFD;\n<em>NodeMCU Devkit</em>, kter&#xE1; by m&#x11B;la le&#x17E;et p&#x159;ed tebou.\nNe&#x17E; ji vynd&#xE1;&#x161; z obalu, m&#x11B;l/a by ses <em>vyb&#xED;t</em>:\ndotkni se n&#x11B;&#x10D;eho kovov&#xE9;ho, co je spojeno se zem&#xED;,\nt&#x159;eba radi&#xE1;toru nebo kovov&#xE9; &#x10D;&#xE1;sti schr&#xE1;nky n&#x11B;jak&#xE9;ho\nspot&#x159;ebi&#x10D;e, kter&#xFD; je zapojen&#xFD; do z&#xE1;suvky.\nT&#xED;m se zbav&#xED;&#x161; statick&#xE9; elekt&#x159;iny, kter&#xE1; by mohla\nmalink&#xE9; za&#x159;&#xED;zen&#xED; po&#x161;kodit.\nPak p&#x159;&#xED;stroj vyndej z obalu. Sna&#x17E; se ho dr&#x17E;et za\nhrany a p&#x159;&#xED;li&#x161; se nedot&#xFD;kat elektroniky a kovov&#xFD;ch\n&#x10D;&#xE1;st&#xED;.</p>\n<div class=\"admonition note\"><p>Obal bude nejsp&#xED;&#x161; roztr&#x17E;en&#xFD;, proto&#x17E;e organiz&#xE1;to&#x159;i\nna desti&#x10D;ku p&#x159;ed za&#x10D;&#xE1;tkem kurzu nainstalovali\nMicroPython.</p>\n</div><div class=\"admonition warning\"><p>Obal je vodiv&#xFD; a nesm&#xED; p&#x159;ij&#xED;t do styku se zapojenou desti&#x10D;kou,\nproto&#x17E;e by mohl zkratovat jej&#xED; v&#xFD;vody a t&#xED;m ji zni&#x10D;it.\nProto obal rad&#x11B;ji hned schovej a pou&#x17E;&#xED;vej ho jen k transportu desti&#x10D;ky.</p>\n</div><p>Te&#x10F;, kdy&#x17E; desti&#x10D;ku dr&#x17E;&#xED;&#x161; v ruce, si\npoj&#x10F;me proj&#xED;t jej&#xED; z&#xE1;kladn&#xED; sou&#x10D;&#xE1;sti.</p>\n<p><br style=\"clear: both;\"></p>\n<p><span class=\"figure float-left\"><a href=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/nodemcu-popisky.svg\"><img src=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/nodemcu-popisky.svg\" alt=\"Obr&#xE1;zek desky NodeMCU DevKit\"></a></span></p>\n<p>Nejd&#x16F;le&#x17E;it&#x11B;j&#x161;&#xED; &#x10D;&#xE1;st v&#xFD;vojov&#xE9; desky je v oplechovan&#xE9;\nkrabi&#x10D;ce s logem &quot;Wi-Fi&quot; a &quot;FCC&quot;:\n<span class=\"part-green\">mikroprocesor ESP8266</span>.\nTo je &#x201E;mozek&#x201D; cel&#xE9;ho za&#x159;&#xED;zen&#xED;, kter&#xFD; &#x2013; kdy&#x17E; je\nspr&#xE1;vn&#x11B; naprogramov&#xE1;n &#x2013; um&#xED; prov&#xE1;d&#x11B;t pythonn&#xED;\np&#x159;&#xED;kazy a programy.\nProcesor sed&#xED; na mal&#xE9; desti&#x10D;ce, na kter&#xE9; je je&#x161;t&#x11B;\n<span class=\"part-cyan\">ant&#xE9;na</span>, kterou\np&#x159;&#xED;stroj m&#x16F;&#x17E;e komunikovat s okol&#xED;m.</p>\n<p>Tahle mal&#xE1; desti&#x10D;ka se d&#xE1; pou&#x17E;&#xED;t i samostatn&#x11B;;\nv&#x161;echno ostatn&#xED;, co kolem n&#xED; zab&#xED;r&#xE1; tolik m&#xED;sta,\nn&#xE1;m jen uleh&#x10D;&#xED; hran&#xED; a umo&#x17E;n&#xED; se za&#x159;&#xED;zen&#xED;m\njednodu&#x161;e komunikovat a krmit ho elekt&#x159;inou.</p>\n<p>Komunikace a &#x201E;krmen&#xED;&#x201D; se d&#x11B;je p&#x159;es\n<span class=\"part-red\">mikro-USB konektor</span>,\ndo kter&#xE9;ho zapoj&#xED;&#x161; kabel ze sv&#xE9;ho po&#x10D;&#xED;ta&#x10D;e.\nKdy&#x17E; je modul naprogramovan&#xFD;, sta&#x10D;&#xED; ho m&#xED;sto do\npo&#x10D;&#xED;ta&#x10D;e zapojit do nab&#xED;je&#x10D;ky &#x10D;i extern&#xED;ho zdroje\n(powerbanky) a bude fungovat samostatn&#x11B;.</p>\n<p>Kolem USB konektoru jsou dv&#x11B; tla&#x10D;&#xED;tka:\n<code class=\"part-orange\">RST</code>, kter&#xFD;m se desti&#x10D;ka restartuje\n(skoro jako kdybys ho odpojila a zase zapojila, co&#x17E;\nse hod&#xED;, kdy&#x17E; n&#x11B;co ud&#x11B;l&#xE1;&#x161; &#x161;patn&#x11B; a modul &#x201E;zamrzne&#x201D;),\na <code class=\"part-yellow\">FLASH</code>, o kter&#xE9;m si pov&#xED;me pozd&#x11B;ji.</p>\n<p>Po stran&#xE1;ch modulu jsou dv&#x11B; &#x159;ady\n<span class=\"part-blue\">&#x201E;no&#x17E;i&#x10D;ek&#x201D;</span>, na kter&#xE9;\nse d&#xE1; napojit cel&#xE1; &#x159;ada nejr&#x16F;zn&#x11B;j&#x161;&#xED;ch hra&#x10D;ek.\nZkontroluj si, jestli jsou v&#x161;echny no&#x17E;i&#x10D;ky rovn&#xE9;;\nkdyby byla n&#x11B;kter&#xE1; ohnut&#xE1;, tak ji (nejl&#xE9;pe s pomoc&#xED;\nkou&#x10D;e) narovnej nebo si vezmi jinou desti&#x10D;ku.</p>\n<p><br style=\"clear: both;\"></p>\n<h2>Instalace</h2>\n<p>Bohu&#x17E;el se dnes neobejdeme bez instalace. Mus&#xED;&#x161; nau&#x10D;it\nsv&#x16F;j po&#x10D;&#xED;ta&#x10D;, aby si s&#xA0;desti&#x10D;kou pov&#xED;dal.</p>\n<p>Nejd&#x159;&#xED;v si do virtu&#xE1;ln&#xED;ho prost&#x159;ed&#xED; nainstaluj program Ampy od Adafruitu.\nTen budeme pozd&#x11B;ji pou&#x17E;&#xED;vat na nahr&#xE1;v&#xE1;n&#xED; k&#xF3;du:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">(env)$ </span>python -m pip install adafruit-ampy\n</pre></div><p>Pak propoj modul s&#xA0;po&#x10D;&#xED;ta&#x10D;em p&#x159;es USB kabel,\njako kdybys p&#x159;ipojoval/a t&#x159;eba mobil.</p>\n<div class=\"admonition note\"><p>Je pot&#x159;eba pou&#x17E;&#xED;t kvalitn&#xED; datov&#xFD; kabel.\nNekvalitn&#xED; kabely (nap&#x159;. spousta kabel&#x16F; k\nnab&#xED;je&#x10D;k&#xE1;m) jsou &#x10D;asto nepou&#x17E;iteln&#xE9;.</p>\n</div><p>D&#xE1;l postupuj podle opera&#x10D;n&#xED;ho syst&#xE9;mu na sv&#xE9;m po&#x10D;&#xED;ta&#x10D;i.\nKdyby n&#x11B;co nefungovalo, pora&#x10F; se s kou&#x10D;em.\nP&#x16F;vodn&#xED; (anglick&#xFD;) n&#xE1;vod k t&#xE9;to &#x10D;&#xE1;sti je na\n<a href=\"http://docs.micropython.org/en/latest/pyboard/pyboard/tutorial/repl.html\">str&#xE1;nk&#xE1;ch MicroPythonu</a>.</p>\n<h3>Linux</h3>\n<p>Na spr&#xE1;vn&#x11B; nastaven&#xE9;m po&#x10D;&#xED;ta&#x10D;i sta&#x10D;&#xED; zadat:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>picocom -b <span class=\"m\">115200</span> --flow n /dev/ttyUSB0\n</pre></div><p>Pokud p&#x159;&#xED;kaz neskon&#x10D;&#xED; s chybou, stiskni tla&#x10D;&#xED;tko <code>RST</code> na modulu.\nM&#x11B;ly by se nakonec objevit t&#x159;i zob&#xE1;&#x10D;ky, <code>&gt;&gt;&gt;</code>.</p>\n<p>V&#x11B;t&#x161;ina po&#x10D;&#xED;ta&#x10D;&#x16F; ale na komunikaci s mal&#xFD;mi za&#x159;&#xED;zen&#xED;mi nastaven&#xE1; nen&#xED;.\nSkon&#x10D;&#xED;-li p&#x159;&#xED;kaz <code>picocom</code> s&#xA0;chybou,\noprav ji podle n&#xE1;sleduj&#xED;c&#xED;ho n&#xE1;vodu a zkus to znova.\n(Mo&#x17E;n&#xE1; bude pot&#x159;eba vy&#x159;e&#x161;it v&#xED;c ne&#x17E; jednu chybu.)</p>\n<ul>\n<li>Nem&#xE1;&#x161;-li p&#x159;&#xED;kaz <code>picocom</code> nainstalovan&#xFD;,\nje pot&#x159;eba ho nainstalovat (nap&#x159;.\n<code>sudo dnf install picocom</code> nebo\n<code>sudo apt-get install picocom</code>).</li>\n<li><p>Pokud <code>picocom</code> skon&#x10D;il s chybou\n<code>No such file or directory</code>, pravd&#x11B;podobn&#x11B;\nje pot&#x159;eba k za&#x159;&#xED;zen&#xED; p&#x159;istupovat p&#x159;es jin&#xFD; soubor.\nPou&#x17E;ij p&#x159;&#xED;kaz <code>dmesg | tail</code>, kter&#xFD; vyp&#xED;&#x161;e n&#x11B;co jako:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>dmesg <span class=\"p\">|</span> tail\n<span class=\"go\">[703169.886296] ch341 1-1.1:1.0: device disconnected</span>\n<span class=\"go\">[703176.972781] usb 1-1.1: new full-speed USB device number 45 using ehci-pci</span>\n<span class=\"go\">[703177.059448] usb 1-1.1: New USB device found, idVendor=1a86, idProduct=7523</span>\n<span class=\"go\">[703177.059454] usb 1-1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0</span>\n<span class=\"go\">[703177.059457] usb 1-1.1: Product: USB2.0-Serial</span>\n<span class=\"go\">[703177.060474] ch341 1-1.1:1.0: ch341-uart converter detected</span>\n<span class=\"go\">[703177.062781] usb 1-1.1: ch341-uart converter now attached to ttyUSB0</span>\n</pre></div><p>M&#xE1;&#x161;-li m&#xED;sto <code>ttyUSB0</code> n&#x11B;co jin&#xE9;ho, v p&#x159;&#xED;kazu <code>picocom</code> to pou&#x17E;ij m&#xED;sto\n<code>ttyUSB0</code>.</p>\n</li>\n<li><p>Pokud <code>picocom</code> skon&#x10D;il s chybou <code>Permission denied</code>, pot&#x159;ebuje&#x161; z&#xED;skat\np&#x159;&#xED;stup k souboru za&#x159;&#xED;zen&#xED;.\nTo znamen&#xE1; p&#x159;idat se do p&#x159;&#xED;slu&#x161;n&#xE9; skupiny:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>sudo usermod -a -G dialout <span class=\"k\">$(</span>whoami<span class=\"k\">)</span>\n</pre></div><p>Pot&#xE9; je pot&#x159;eba se znovu p&#x159;ihl&#xE1;sit, t&#x159;eba p&#x159;&#xED;kazem:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>su - <span class=\"k\">$(</span>whoami<span class=\"k\">)</span>\n</pre></div><p>Pro ov&#x11B;&#x159;en&#xED; spus&#x165; p&#x159;&#xED;kaz <code>groups</code>; v jeho v&#xFD;stupu by m&#x11B;lo b&#xFD;t <code>dialout</code>.\nNap&#x159;&#xED;klad:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>groups\n<span class=\"go\">kristyna lp wheel dialout mock</span>\n</pre></div><p>Kdyby to nefungovalo, na srazu ti m&#x16F;&#x17E;e pomoci n&#x11B;jak&#xFD; kou&#x10D;.\nJestli proch&#xE1;z&#xED;&#x161; materi&#xE1;ly z domu a nepovedlo\nse ti p&#x159;idat do skupiny, d&#xE1; se to obej&#xED;t tak,\n&#x17E;e m&#xED;sto <code>picocom</code> pou&#x17E;ije&#x161; <code>sudo picocom</code>.</p>\n</li>\n</ul>\n<h3>Windows</h3>\n<p>MicroPython se p&#x159;ihl&#xE1;s&#xED; jako COM port. Otev&#x159;i\nspr&#xE1;vce za&#x159;&#xED;zen&#xED; a zjisti, kter&#xFD; COM port to je (kou&#x10D; s t&#xED;m pom&#x16F;&#x17E;e).</p>\n<p>Nebylo-li za&#x159;&#xED;zen&#xED; nalezeno, je pot&#x159;eba nainstalovat\n<em>driver</em>, kter&#xFD; je ke sta&#x17E;en&#xED; t&#x159;eba\n<a href=\"https://iotta.cz/ovladace-pro-ch340g/\">z tohoto blogu</a>.</p>\n<p>Pak si nainstaluj program\n<a href=\"http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html\">PuTTY</a>\n(<code>putty.exe</code>) a spus&#x165; ho.\nV konfigura&#x10D;n&#xED;m ok&#xFD;nku za&#x161;krtni <em>Connection Type: Serial</em> a\ndo <em>Serial line:</em> zadej sv&#x16F;j COM port.\nPak p&#x159;epni v seznamu vlevo na <em>Serial</em> a nastav <em>Speed</em> na <em>115200</em>\na <em>Flow Control</em> na <em>None</em>:</p>\n<p><span class=\"figure\"><a href=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/putty-config.jpg\"><img src=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/putty-config.jpg\" alt=\"Obr&#xE1;zek nastaven&#xED; PuTTY\"></a></span></p>\n<p>Potom zp&#xE1;tky v kategorii <em>Session</em> m&#x16F;&#x17E;e&#x161; nastaven&#xED; ulo&#x17E;it pro p&#x159;&#xED;&#x161;t&#x11B;:\ndo pol&#xED;&#x10D;ka <em>Saved Sessions</em> zadej <em>MicroPython</em> a klikni OK.</p>\n<p>Nakonec klikni <em>Open</em>. M&#x11B;lo by se otev&#x159;&#xED;t\nok&#xFD;nko podobn&#xE9; konzoli, kde se, kdy&#x17E; zm&#xE1;&#x10D;kne&#x161;\nna modulu <code>RST</code>, objev&#xED; nakonec t&#x159;i zob&#xE1;&#x10D;ky: <code>&gt;&gt;&gt;</code>.</p>\n<h3>macOS</h3>\n<p>V&#xA0;p&#x159;&#xED;kazov&#xE9; &#x159;&#xE1;dce zadej:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>screen /dev/tty.usbmodem* <span class=\"m\">115200</span>\n</pre></div><p>a stiskni Enter.\nPak na modulu zm&#xE1;&#x10D;kni <code>RST</code>.\nM&#x11B;ly by se nakonec objevit t&#x159;i zob&#xE1;&#x10D;ky, <code>&gt;&gt;&gt;</code>.</p>\n<p>Nejde-li to, je mo&#x17E;n&#xE1; pot&#x159;eba nainstalovat driver. Ten se d&#xE1; st&#xE1;hnout\nz&#xA0;<a href=\"https://iotta.cz/ovladace-pro-ch340g/\">tohoto blogu</a>.</p>\n<h2>MicroPython &#x2013; taky Python</h2>\n<p>Tak jako m&#xE1;&#x161; na po&#x10D;&#xED;ta&#x10D;i nainstalovan&#xFD; opera&#x10D;n&#xED;\nsyst&#xE9;m, na v&#xFD;vojov&#xE9; desce je takzvan&#xFD; <em>firmware</em>,\nprogram, kter&#xFD; ovl&#xE1;d&#xE1; v&#x161;echny ty dr&#xE1;tky,\n&#x10D;ipy a sv&#x11B;t&#xFD;lka, co v&#xA0;n&#xED; jsou.\nMy pou&#x17E;&#xED;v&#xE1;me firmware zvan&#xFD; <em>MicroPython</em>,\nkter&#xFD; nav&#xED;c rozum&#xED; jazyku Python a um&#xED; prov&#xE1;d&#x11B;t pythonn&#xED; p&#x159;&#xED;kazy. Zkus si to!\nT&#x159;i zob&#xE1;&#x10D;ky, kter&#xE9; vysko&#x10D;ily v minul&#xE9;m kroku, p&#x159;i&#x161;ly\nze za&#x159;&#xED;zen&#xED;, kter&#xE9; te&#x10F; netrp&#x11B;liv&#x11B; &#x10D;ek&#xE1; na p&#x159;&#xED;kaz.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"mi\">1</span><span class=\"o\">+</span><span class=\"mi\">1</span>\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Hello World&apos;</span><span class=\"p\">)</span>\n<span class=\"go\">Hello World</span>\n</pre></div><p>T&#xE9;m&#x11B;&#x159; v&#x161;e, co pou&#x17E;&#xED;v&#xE1;&#x161; v Pythonu na po&#x10D;&#xED;ta&#x10D;i,\num&#xED; MicroPython taky: &#x10D;&#xED;sla, &#x159;et&#x11B;zce, seznamy, t&#x159;&#xED;dy,\nv&#xFD;jimky, moduly a tak d&#xE1;l.\nN&#x11B;kter&#xE9; detaily ale jsou trochu osekan&#xE9;, aby se v&#x161;echno\nve&#x161;lo do extr&#xE9;mn&#x11B; mal&#xE9;ho prostoru.\nZkus si, jak se li&#x161;&#xED; efekt n&#xE1;sleduj&#xED;c&#xED;ch p&#x159;&#xED;kaz&#x16F;\nod &#x201E;velk&#xE9;ho&#x201D; Pythonu:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">print</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span> <span class=\"nn\">math</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">pi</span>\n</pre></div><p>Nejd&#x16F;le&#x17E;it&#x11B;j&#x161;&#xED; v&#x11B;c, kter&#xE1; je osekan&#xE1;, je <em>standardn&#xED;\nknihovna</em> &#x2013; v&#x11B;t&#x161;ina modul&#x16F;, kter&#xE9; na\npo&#x10D;&#xED;ta&#x10D;i m&#x16F;&#x17E;e&#x161; naimportovat, v MicroPythonu chyb&#xED;.\nU modul&#x16F; jako <code>turtle</code> je to pochopiteln&#xE9;,\nale v r&#xE1;mci &#x161;et&#x159;en&#xED; m&#xED;stem chyb&#xED; i moduly jako <code>random</code>.\nV&#x11B;t&#x161;inou to p&#x159;&#xED;li&#x161; nevad&#xED; &#x2013; mal&#xE1; za&#x159;&#xED;zen&#xED; se pou&#x17E;&#xED;vaj&#xED;\nna jin&#xE9; v&#x11B;ci ne&#x17E; ty velk&#xE9; &#x2013; ale je pot&#x159;eba si na to\nd&#xE1;t pozor.</p>\n<p>N&#x11B;kter&#xE9; v&#x11B;ci ze standardn&#xED; knihovny se daj&#xED; naj&#xED;t\nve zjednodu&#x161;en&#xE9; form&#x11B; na jin&#xFD;ch m&#xED;stech.\nNap&#x159;&#xED;klad a&#x10D;koliv modul <code>random</code> chyb&#xED;,\nn&#xE1;hodn&#xE9; &#x10D;&#xED;slo od 0 do 255 se d&#xE1; z&#xED;skat pomoc&#xED;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">os</span> <span class=\"kn\">import</span> <span class=\"n\">urandom</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">urandom</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"go\">61</span>\n</pre></div><h2>Ovl&#xE1;d&#xE1;n&#xED; konzole</h2>\n<p>P&#x159;i psan&#xED; slo&#x17E;it&#x11B;j&#x161;&#xED;ho k&#xF3;du si v&#x161;imne&#x161;, &#x17E;e konzole MicroPythonu automaticky odsazuje.\nTo je pro mal&#xE9; programy pohodln&#xE9;, ale um&#xED; to i znep&#x159;&#xED;jemnit &#x17E;ivot &#x2013; hlavn&#x11B; kdy&#x17E; chceme k&#xF3;d do konzole vlo&#x17E;it.</p>\n<p>Proto m&#xE1; konzole MicroPythonu speci&#xE1;ln&#xED; vkl&#xE1;dac&#xED; m&#xF3;d, kter&#xFD; automatick&#xE9; odsazov&#xE1;n&#xED; vyp&#xED;n&#xE1;.\nAktivuje se pomoc&#xED; <kbd>Ctrl+E</kbd> a ukon&#x10D;uje se pomoc&#xED; <kbd>Ctrl+D</kbd>.</p>\n<h2>Vstup</h2>\n<p>MicroPython na mal&#xE9; desti&#x10D;ce obsahuje n&#x11B;kter&#xE9;\nmoduly, kter&#xE9; jinde nenajde&#x161;. Ten hlavn&#xED; se jmenuje\n<code>machine</code> a zp&#x159;&#xED;stup&#x148;uje z&#xE1;kladn&#xED; funkce za&#x159;&#xED;zen&#xED;. Zkus si:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">machine</span> <span class=\"kn\">import</span> <span class=\"n\">Pin</span>\n<span class=\"n\">pin</span> <span class=\"o\">=</span> <span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">IN</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">pin</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">())</span>\n</pre></div><p>Zm&#xE1;&#x10D;kni a dr&#x17E; tla&#x10D;&#xED;tko <code>FLASH</code> vedle USB konektoru.\nP&#x159;itom pus&#x165; <code>print(pin.value())</code> znovu.\nJak se hodnota zm&#x11B;n&#xED;?</p>\n<p>Jak tomuhle k&#xF3;du rozum&#x11B;t?\nT&#x159;&#xED;da <code>Pin</code> ti umo&#x17E;&#x148;uje ovl&#xE1;dat jednotliv&#xE9;\n&#x201E;no&#x17E;i&#x10D;ky&#x201D;, kter&#xFD;mi za&#x159;&#xED;zen&#xED; komunikuje s vn&#x11B;j&#x161;&#xED;m\nsv&#x11B;tem: bu&#x10F; na nich nastavovat nap&#x11B;t&#xED;, nebo zkoumat\njestli na nich n&#x11B;jak&#xE9; nap&#x11B;t&#xED; je.</p>\n<p><code>Pin(0, Pin.IN)</code> vytvo&#x159;&#xED; objekt t&#x159;&#xED;dy Pin,\nkter&#xFD; bude na&#x10D;&#xED;tat data z &#x201E;no&#x17E;i&#x10D;ky&#x201D; &#x10D;&#xED;slo 0.\n(<code>IN</code> znamen&#xE1; na&#x10D;&#xED;t&#xE1;n&#xED; &#x2013; informace jdou <em>do</em> procesoru).\nFunkce <code>pin.value()</code> zm&#x11B;&#x159;&#xED; nap&#x11B;t&#xED; na dan&#xE9;\n&#x201E;no&#x17E;i&#x10D;ce&#x201D; a vr&#xE1;t&#xED; bu&#x10F; 1 nebo 0 podle toho, jestli n&#x11B;jak&#xE9; nam&#x11B;&#x159;ila.</p>\n<p>No a &#x201E;no&#x17E;i&#x10D;ka&#x201D; &#x10D;&#xED;slo 0 je p&#x159;ipojen&#xE1; k tla&#x10D;&#xED;tku <code>FLASH</code>,\nkter&#xFD;m se tak d&#xE1; ono nap&#x11B;t&#xED; ovl&#xE1;dat.\nInformace o tom, kter&#xE1; no&#x17E;i&#x10D;ka je kam p&#x159;ipojen&#xE1;,\nm&#xE1;&#x161; na <a href=\"https://pyvec.github.io/cheatsheets/micropython/nodemcu-cs.pdf\">tah&#xE1;ku</a> &#x2013;\nm&#x16F;&#x17E;e&#x161; si zkontrolovat, &#x17E;e Pin(0) u sebe m&#xE1; pozn&#xE1;mku FLASH.</p>\n<h2>Obvod</h2>\n<p>Te&#x10F; na chv&#xED;li nech&#xE1;me programov&#xE1;n&#xED; a postav&#xED;me si elektrick&#xFD; obvod.\nVezmi si modrou sv&#xED;tivou diodu (LED, &#x201E;sv&#x11B;t&#xFD;lko&#x201D;) a\nnep&#xE1;jiv&#xE9; pole (&#x201E;hloupou desti&#x10D;ku&#x201D;).\nZkus&#xED;me sv&#x11B;t&#xFD;lko rozsv&#xED;tit.</p>\n<p>LED rozsv&#xED;t&#xED;&#x161; tak, &#x17E;e ji p&#x159;ipoj&#xED;&#x161; ke <em>zdroji nap&#x11B;t&#xED;</em>, nap&#x159;&#xED;klad k baterce.</p>\n<p>Jako zdroj nap&#x11B;t&#xED; m&#x16F;&#x17E;eme pou&#x17E;&#xED;t i n&#xE1;&#x161; modul.\nTen bere elekt&#x159;inu p&#x159;es USB a d&#xE1;v&#xE1; n&#xE1;m ji k dispozici\nna n&#x11B;kter&#xFD;ch sv&#xFD;ch &#x201E;no&#x17E;i&#x10D;k&#xE1;ch&#x201D;:\nkonkr&#xE9;tn&#x11B; plus na no&#x17E;i&#x10D;ce ozna&#x10D;en&#xE9; <code>3V</code>\na m&#xED;nus na no&#x17E;i&#x10D;ce ozna&#x10D;en&#xE9; <code>G</code>.\nNa tyhle no&#x17E;i&#x10D;ky mus&#xED;&#x161; zapojit diodu.</p>\n<p>P&#x159;ipojov&#xE1;n&#xED; diody m&#xE1; jeden h&#xE1;&#x10D;ek:\nmus&#xED;&#x161; ji zapojit spr&#xE1;vn&#xFD;m sm&#x11B;rem &#x2013; plus na plus, m&#xED;nus na m&#xED;nus.\nOpa&#x10D;n&#x11B; dioda sv&#xED;tit nebude. Dobr&#xE1; zpr&#xE1;va je, &#x17E;e\nkdy&#x17E; diodu oto&#x10D;&#xED;&#x161; &#x161;patn&#x11B;, nic se j&#xED; nestane.</p>\n<div class=\"admonition note\"><p>Z&#xE1;kladn&#xED; vlastnost <em>diody</em> je ta, &#x17E;e pust&#xED;\nelektrick&#xFD; proud jen jedn&#xED;m sm&#x11B;rem. Sv&#xED;t&#xED;c&#xED; dioda\n&#x2013; <em>angl. Light Emitting Diode, LED</em> &#x2013; je&#x161;t&#x11B; k\ntomu nav&#xED;c sv&#xED;t&#xED;.</p>\n</div><p>Je pot&#x159;eba rozpoznat rozd&#xED;l mezi no&#x17E;i&#x10D;kami diody.\n<em>Katoda</em> (<code>-</code>) je ta krat&#x161;&#xED; no&#x17E;i&#x10D;ka.\nPouzdro diody je u katody trochu se&#x159;&#xED;znut&#xE9;\na vevnit&#x159; v pouzd&#x159;e, kdy&#x17E; se pozorn&#x11B; pod&#xED;v&#xE1;&#x161;, uvid&#xED;&#x161;\nu katody v&#x11B;t&#x161;&#xED; pl&#xED;&#x161;ek.\nT&#xE9; druh&#xE9; no&#x17E;i&#x10D;ce se &#x159;&#xED;k&#xE1; anoda (<code>+</code>).</p>\n<p>Tak, te&#x10F; v&#xED;&#x161;, kam diodu zapojit: katodu (krat&#x161;&#xED; no&#x17E;i&#x10D;ku)\nna <code>G</code> a anodu na <code>3V</code>.</p>\n<p>Dr&#x17E;en&#xED; no&#x17E;i&#x10D;ek diody u no&#x17E;i&#x10D;ek modulu by ti nejsp&#xED;&#x161;\nzam&#x11B;stnalo ob&#x11B; ruce. Aby sis je uvolnila, pou&#x17E;ij\n<em>nep&#xE1;jiv&#xE9; pole</em> (angl. <em>breadboard</em>).\nJe v n&#x11B;m spousta d&#xED;rek, do kter&#xFD;ch se daj&#xED; strkat dr&#xE1;ty.\nV r&#xE1;mci ka&#x17E;d&#xE9; poloviny desti&#x10D;ky je ka&#x17E;d&#xE1; &#x159;ada d&#xED;rek &#x2013;\ntedy ka&#x17E;d&#xE1; p&#x11B;tice &#x2013; spojen&#xE1; dohromady.\nKdy&#x17E; zapoj&#xED;&#x161; dr&#xE1;tky do stejn&#xE9; &#x159;ady, spoj&#xED;&#x161; je t&#xED;m.</p>\n<p>Zasu&#x148; modul do nep&#xE1;jiv&#xE9;ho pole. Pak p&#x159;ipoj katodu\ndo d&#xED;rky ve stejn&#xE9; &#x159;ad&#x11B;, kde je no&#x17E;i&#x10D;ka\n<code>3V</code> modulu, a podobn&#x11B; anodu k&#xA0;<code>G</code>.\nM&#x11B;lo by to vypadat jako na tomto obr&#xE1;zku:</p>\n<p><span class=\"figure\"><a href=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/circuits/led_bb.svg\"><img src=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/circuits/led_bb.svg\" alt=\"diagram zapojen&#xED;\"></a></span></p>\n<p>Potom zapoj USB kabel. Dioda by se m&#x11B;la rozsv&#xED;tit!</p>\n<p>Zkus si, co se stane, kdy&#x17E; ob&#x11B; no&#x17E;i&#x10D;ky diody zapoj&#xED;&#x161; ke <code>G</code>.</p>\n<p><span class=\"figure\"><a href=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/circuits/led_bb_off.svg\"><img src=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/circuits/led_bb_off.svg\" alt=\"diagram zapojen&#xED;\"></a></span></p>\n<p>Aby dioda sv&#xED;tila, mus&#xED; b&#xFD;t p&#x159;ipojen&#xE1; na dv&#x11B; m&#xED;sta,\nmezi kter&#xFD;mi je takzvan&#xFD; <em>potenci&#xE1;lov&#xFD; rozd&#xED;l</em> &#x2014; nap&#x11B;t&#xED;.\nNa no&#x17E;i&#x10D;ce <code>G</code> je 0 volt&#x16F;; na no&#x17E;i&#x10D;ce\n<code>3V</code> jsou 3,3 volty &#x2013; je tedy mezi nimi rozd&#xED;l 3,3 V, p&#x159;esn&#x11B; tolik,\nkolik modr&#xE1; LED pot&#x159;ebuje ke sv&#xED;cen&#xED;.</p>\n<div class=\"admonition note\"><p>Samotn&#xE1; hodnota nap&#x11B;t&#xED; ned&#xE1;v&#xE1; smysl &#x2013; nap&#x159;&#xED;klad\n&#x159;&#xED;ct, &#x17E;e je na jednom m&#xED;st&#x11B; 3,3 V je nep&#x159;esn&#xE9;.\nHodnota ve voltech se v&#x17E;dycky mus&#xED; k n&#x11B;&#x10D;emu vztahovat;\nvyjad&#x159;uje rozd&#xED;l mezi dv&#x11B;ma m&#xED;sty.\nV elektronice pou&#x17E;&#xED;v&#xE1;me rozd&#xED;l oproti &#x201E;zemi&#x201D; &#x2013; nap&#x11B;t&#xED;\nna no&#x17E;i&#x10D;ce <code>G</code>. Stanov&#xED;me si, &#x17E;e tam je\n0 volt&#x16F; a ostatn&#xED; nap&#x11B;t&#xED; po&#x10D;&#xED;t&#xE1;me vzhledem k n&#xED;.\nNa no&#x17E;i&#x10D;ce <code>3V</code> je tedy nap&#x11B;t&#xED; 3,3 V vzhledem k zemi.</p>\n</div><h2>V&#xFD;stup</h2>\n<p>Pro&#x10D; jsme diodu na to, aby se rozsv&#xED;tila,\np&#x159;ipojili k&#xA0;modulu a ne jen k&#xA0;baterce?\nTen modul je tro&#x161;ku slo&#x17E;it&#x11B;j&#x161;&#xED; za&#x159;&#xED;zen&#xED; ne&#x17E; baterka a jedna d&#x16F;le&#x17E;it&#xE1; v&#x11B;c,\nkterou um&#xED; nav&#xED;c, je nastavovat nap&#x11B;t&#xED; na r&#x16F;zn&#xFD;ch no&#x17E;i&#x10D;k&#xE1;ch.\nUm&#xED; za&#x159;&#xED;dit, aby se no&#x17E;i&#x10D;ka chovala jednou jako <code>3V</code> a jindy jako <code>G</code>.\nKdy&#x17E; p&#x159;ipoj&#xED;&#x161; diodu mezi <code>G</code> a takovou\np&#x159;ep&#xED;natelnou no&#x17E;i&#x10D;ku, m&#x16F;&#x17E;e&#x161; nastavit, kdy sv&#xED;t&#xED; a kdy ne.</p>\n<p>P&#x159;epoj anodu diody z&#xA0;<code>3V3</code> na <code>D5</code>. Katodu nech na <code>G</code>.</p>\n<p>M&#xE1;&#x161;-li zapojeno, znovu se p&#x159;ipoj k MicroPythonu a zadej n&#xE1;sleduj&#xED;c&#xED; k&#xF3;d:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">machine</span> <span class=\"kn\">import</span> <span class=\"n\">Pin</span>\n<span class=\"n\">pin</span> <span class=\"o\">=</span> <span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">OUT</span><span class=\"p\">)</span>\n<span class=\"n\">pin</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"n\">pin</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</pre></div><p>Kdy&#x17E; objekt Pin vytvo&#x159;&#xED;&#x161; s <code>Pin.OUT</code>, MicroPython na n&#x11B;m bude nastavovat\nnap&#x11B;t&#xED; &#x2013; bu&#x10F; 3,3 V (<code>value(1)</code>) nebo 0 V (<code>value(0)</code>).\nA tak se d&#xE1; s diodou blikat.</p>\n<div class=\"admonition note\"><p>&#x10C;&#xED;slov&#xE1;n&#xED; no&#x17E;i&#x10D;ek je bohu&#x17E;el dvoj&#xED; &#x2013; no&#x17E;i&#x10D;ka\nozna&#x10D;en&#xE1; jako <code>D5</code> m&#xE1; v procesoru p&#x159;i&#x159;azen&#xE9; &#x10D;&#xED;slo 14.\nT&#x159;&#xED;da <code>Pin</code> v MicroPythonu pou&#x17E;&#xED;v&#xE1; &#x10D;&#xED;slov&#xE1;n&#xED; procesoru.\nNa&#x161;t&#x11B;st&#xED; m&#xE1;&#x161; <a href=\"https://pyvec.github.io/cheatsheets/micropython/nodemcu-cs.pdf\">tah&#xE1;k</a>,\nkde snadno dohled&#xE1;&#x161; &#x17E;e <code>D5</code> a <code>Pin(14)</code> jsou dv&#x11B; jm&#xE9;na stejn&#xE9; no&#x17E;i&#x10D;ky.</p>\n</div><p>Zvl&#xE1;dne&#x161; napsat program, kter&#xFD; za&#x159;&#xED;d&#xED;, aby dioda\nsv&#xED;tila pouze kdy&#x17E; je zm&#xE1;&#x10D;knut&#xE9; tla&#x10D;&#xED;tko <code>FLASH</code> a jinak ne?</p>\n<div class=\"admonition note\"><p>N&#xE1;pov&#x11B;da: M&#x16F;&#x17E;e&#x161; po&#x159;&#xE1;d dokola zji&#x161;&#x165;ovat stav tla&#x10D;&#xED;tka\na nastavovat podle n&#x11B;j stav LED.</p>\n</div><div class=\"solution\" id=\"solution-0\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/index/solutions/0/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">machine</span> <span class=\"kn\">import</span> <span class=\"n\">Pin</span>\n<span class=\"n\">pin_diody</span> <span class=\"o\">=</span> <span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">OUT</span><span class=\"p\">)</span>\n<span class=\"n\">pin_tlacitka</span> <span class=\"o\">=</span> <span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">IN</span><span class=\"p\">)</span>\n<span class=\"k\">while</span> <span class=\"bp\">True</span><span class=\"p\">:</span>\n    <span class=\"n\">pin_diody</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"n\">pin_tlacitka</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">())</span>\n</pre></div>\n    </div>\n</div><h2>Pou&#x161;t&#x11B;n&#xED; k&#xF3;du ze souboru</h2>\n<p>Jak za&#x10D;ne&#x161; ps&#xE1;t trochu slo&#x17E;it&#x11B;j&#x161;&#xED; programy,\nmohlo by se st&#xE1;t, &#x17E;e t&#x11B; konzole MicroPythonu za&#x10D;ne trochu &#x161;tv&#xE1;t.\n&#x160;patn&#x11B; se v n&#xED; opravuj&#xED; chyby a automatick&#xE9; odsazov&#xE1;n&#xED; funguje jen v&#x11B;t&#x161;inou.\nPoj&#x10F;me se pod&#xED;vat, jak na&#x161;tv&#xE1;n&#xED; p&#x159;edej&#xED;t.</p>\n<p>Doporu&#x10D;uji si v&#x11B;t&#x161;&#xED; kousky k&#xF3;du &#x2013; a ur&#x10D;it&#x11B; takov&#xE9;,\nve kter&#xFD;ch je n&#x11B;jak&#xFD; cyklus, podm&#xED;nka &#x10D;i funkce &#x2013;\nps&#xE1;t v textov&#xE9;m editoru a do modulu pak pos&#xED;lat cel&#xFD; soubor.</p>\n<p>Zkus si to. Do souboru <code>blikajici_led.py</code> dej n&#xE1;sleduj&#xED;c&#xED; k&#xF3;d:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">machine</span> <span class=\"kn\">import</span> <span class=\"n\">Pin</span>\n<span class=\"kn\">from</span> <span class=\"nn\">time</span> <span class=\"kn\">import</span> <span class=\"n\">sleep</span>\n<span class=\"n\">pin_diody</span> <span class=\"o\">=</span> <span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">OUT</span><span class=\"p\">)</span>\n<span class=\"k\">while</span> <span class=\"bp\">True</span><span class=\"p\">:</span>\n    <span class=\"n\">pin_diody</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    <span class=\"n\">pin_diody</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</pre></div><p>Potom zav&#x159;i konzoli (<code>picocom</code>, PuTTY nebo <code>screen</code>).</p>\n<p>K&#xA0;pou&#x161;t&#x11B;n&#xED; programu pou&#x17E;ijeme <code>ampy</code>, kter&#xFD; jsi nainstaloval/a d&#x159;&#xED;ve.\nKe spu&#x161;t&#x11B;n&#xED; bude&#x161; pot&#x159;ebovat zn&#xE1;t port:</p>\n<ul>\n<li>Linux: port pou&#x17E;&#xED;v&#xE1;&#x161; v&#xA0;p&#x159;&#xED;kazu <code>picocom</code>, nap&#x159;. <code>/dev/ttyUSB0</code></li>\n<li>Windows: port pou&#x17E;&#xED;v&#xE1;&#x161; v&#xA0;PuTTY, nap&#x159;. <code>COM13</code></li>\n<li>macOS: port pou&#x17E;&#xED;v&#xE1;&#x161; v&#xA0;p&#x159;&#xED;kazu <code>screen</code>, nap&#x159;. <code>/dev/tty.usbmodem*</code></li>\n</ul>\n<p><code>ampy</code> spus&#x165; n&#xE1;sleduj&#xED;c&#xED;m p&#x159;&#xED;kazem, jen za <code>PORT</code> dopl&#x148; sv&#x16F;j port:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">(venv)$ </span>ampy -p PORT run blikajici_led.py\n</pre></div><p>Program by m&#x11B;l blikat diodou.\nVyu&#x17E;&#xED;v&#xE1; k&#xA0;tomu funkci <code>time.sleep()</code>, kter&#xE1; po&#x10D;k&#xE1; dan&#xFD; po&#x10D;et vte&#x159;in &#x2013;\ntedy <code>time.sleep(1/2)</code> zastav&#xED; program na p&#x16F;l sekundy.</p>\n<h2>Velice rychle blikat</h2>\n<p>Jedna z nev&#xFD;hod &#x201E;na&#x161;eho&#x201D; &#x10D;ipu ESP8266 je, &#x17E;e na sv&#xFD;ch\nno&#x17E;i&#x10D;k&#xE1;ch um&#xED; nastavovat jen dv&#x11B; hodnoty &#x2013; 3,3 V a zem, jedni&#x10D;ku a nulu.\nDioda tak bu&#x10F; sv&#xED;t&#xED;, nebo nesv&#xED;t&#xED; &#x2013; ned&#xE1; se\nnastavit polovi&#x10D;n&#xED; intenzita, ned&#xE1; se plynule rozsv&#x11B;cet nebo zhas&#xED;nat.</p>\n<p>Tuhle nev&#xFD;hodu ale m&#x16F;&#x17E;eme obej&#xED;t s vyu&#x17E;it&#xED;m dvou fakt&#x16F;.\nTen prvn&#xED; je, &#x17E;e diod&#xE1;m &#x2013; na rozd&#xED;l od &#x17E;&#xE1;rovek nebo\nz&#xE1;&#x159;ivek &#x2013; nevad&#xED; &#x10D;ast&#xE9; vyp&#xED;n&#xE1;n&#xED; a zap&#xED;n&#xE1;n&#xED;.\nOpot&#x159;ebov&#xE1;vaj&#xED; se sp&#xED;&#x161; sv&#xED;cen&#xED;m a &#x10D;asem.\nDruh&#xFD; je, &#x17E;e lidsk&#xE9; oko nesta&#x10D;&#xED; zaznamenat pohyby a\nzm&#x11B;ny, kter&#xE9; prob&#xED;haj&#xED; rychleji ne&#x17E; zhruba za\nsetinu vte&#x159;iny.</p>\n<p>Poj&#x10F;me tedy velice rychle blikat &#x2013; a oblafnout tak na&#x161;e o&#x10D;i a mozky!</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">machine</span> <span class=\"kn\">import</span> <span class=\"n\">Pin</span>\n\n<span class=\"n\">pin_diody</span> <span class=\"o\">=</span> <span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">OUT</span><span class=\"p\">)</span>\n<span class=\"k\">while</span> <span class=\"bp\">True</span><span class=\"p\">:</span>\n    <span class=\"n\">pin_diody</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>  <span class=\"c1\"># vypnout LED</span>\n    <span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"o\">/</span><span class=\"mi\">100</span><span class=\"p\">)</span>  <span class=\"c1\"># po&#x10D;kat dv&#x11B; setiny vte&#x159;iny</span>\n    <span class=\"n\">pin_diody</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>  <span class=\"c1\"># zapnout LED</span>\n    <span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"o\">/</span><span class=\"mi\">100</span><span class=\"p\">)</span>  <span class=\"c1\"># po&#x10D;kat jednu setinu vte&#x159;iny</span>\n</pre></div><p>Zkus si pohr&#xE1;t s hodnotami pro <code>time.sleep</code>.</p>\n<div class=\"admonition note\"><p>Takhle funguj&#xED; prakticky v&#x161;echna stm&#xED;vateln&#xE1; LED\nsv&#x11B;tla &#x2013; rychl&#xE9; blik&#xE1;n&#xED; je ekonomi&#x10D;t&#x11B;j&#x161;&#xED; a p&#x159;esn&#x11B;j&#x161;&#xED;\nne&#x17E; nap&#x159;. nastavov&#xE1;n&#xED; ni&#x17E;&#x161;&#xED;ho nap&#x11B;t&#xED;.</p>\n</div><p>Dok&#xE1;&#x17E;e&#x161; napsat program, kter&#xFD; diodu postupn&#x11B;, plynule rozsv&#xED;t&#xED;?</p>\n<!-- XXX: Solution? -->\n\n<p>Proto&#x17E;e je takov&#xE9;hle rychl&#xE9; blik&#xE1;n&#xED; u&#x17E;ite&#x10D;n&#xE9; ve spoust&#x11B;\nr&#x16F;zn&#xFD;ch situac&#xED;, obsahuje MicroPython speci&#xE1;ln&#xED; funkci: um&#xED; blikat samostatn&#x11B;.\nNastav&#xED;&#x161;, jak rychle m&#xE1; blikat a jak dlouho m&#xE1; trvat\nka&#x17E;d&#xE9; bliknut&#xED;, a MicroPython pak bude blikat automaticky,\nzat&#xED;mco tv&#x16F;j program se m&#x16F;&#x17E;e v&#x11B;novat n&#x11B;&#x10D;emu jin&#xE9;mu.</p>\n<p>T&#xE9;hle funkci se &#x159;&#xED;k&#xE1; <em>pulzn&#x11B; &#x161;&#xED;&#x159;kov&#xE1; modulace</em> &#x2013;\nangl. <em>Pulse Width Modulation</em>, neboli <em>PWM</em>.\nZ&#xA0;MicroPythonu jde tahle funkce ovl&#xE1;dat pomoc&#xED; t&#x159;&#xED;dy\n<code>machine.PWM</code>.\nKa&#x17E;d&#xFD; objekt t&#xE9;hle t&#x159;&#xED;dy um&#xED; ovl&#xE1;dat jednu no&#x17E;i&#x10D;ku\na daj&#xED; se u n&#x11B;j nastavit dva parametry:</p>\n<ul>\n<li><code>freq</code> &#x2013; frekvence, tedy kolikr&#xE1;t za sekundu se LED rozsv&#xED;t&#xED; a zase zhasne a</li>\n<li><code>duty</code> &#x2013; anglicky <em>duty cycle</em>, &#x10D;esky <em>st&#x159;&#xED;da</em>, nastavuje &#x201E;&#x161;&#xED;&#x159;ku pulzu&#x201D;,\ntedy jak dlouho bude dioda p&#x159;i ka&#x17E;d&#xE9;m bliknut&#xED; sv&#xED;tit.\nHodnota <code>duty</code> m&#x16F;&#x17E;e b&#xFD;t od 0, kdy LED\nnesv&#xED;t&#xED; v&#x16F;bec, do 1023, kdy sv&#xED;t&#xED; celou dobu.\nNastav&#xED;&#x161;-li <code>duty=512</code>, bude dioda\nsv&#xED;tit s polovi&#x10D;n&#xED; intenzitou (512 = 1024/2).</li>\n</ul>\n<p>Nastav&#xED;&#x161;-li <code>PWM(freq=50, duty=512)</code>, dioda bude blikat 50&#xD7; za sekundu.\nV&#x17E;dycky jednu setinu vte&#x159;iny bude sv&#xED;tit a na jednu\nsetinu vte&#x159;iny zhasne.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">machine</span> <span class=\"kn\">import</span> <span class=\"n\">Pin</span><span class=\"p\">,</span> <span class=\"n\">PWM</span>\n\n<span class=\"n\">pin_diody</span> <span class=\"o\">=</span> <span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">OUT</span><span class=\"p\">)</span>\n<span class=\"n\">pwm</span> <span class=\"o\">=</span> <span class=\"n\">PWM</span><span class=\"p\">(</span><span class=\"n\">pin_diody</span><span class=\"p\">,</span> <span class=\"n\">freq</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">,</span> <span class=\"n\">duty</span><span class=\"o\">=</span><span class=\"mi\">512</span><span class=\"p\">)</span>\n</pre></div><p>Zkus nastavit i ni&#x17E;&#x161;&#xED; frekvenci, t&#x159;eba 3 nebo 1, a&#x165; blik&#xE1;n&#xED; vid&#xED;&#x161; p&#x159;&#xED;mo!</p>\n<p>PWM se d&#xE1; zru&#x161;it metodou <code>pwm.deinit()</code>.\nJako s otv&#xED;r&#xE1;n&#xED;m soubor&#x16F;, je dobr&#xE9; po sob&#x11B; uklidit &#x2013;\ni kdy&#x17E; zat&#xED;m m&#x16F;&#x17E;e&#x161; jednodu&#x161;e restartovat cel&#xE9; za&#x159;&#xED;zen&#xED;.</p>\n<h2>T&#xF3;ny a melodie</h2>\n<p>Vezmi si dal&#x161;&#xED; sou&#x10D;&#xE1;stku &#x2013; piezobudi&#x10D;, neboli &#x201E;bzu&#x10D;&#xED;tko&#x201D;.</p>\n<p>Tahle mal&#xE1; v&#x11B;c obsahuje speci&#xE1;ln&#xED; materi&#xE1;l, kter&#xFD; se,\nkdy&#x17E; ho p&#x159;ipoj&#xED;&#x161; ke zdroji nap&#x11B;t&#xED;, tro&#x161;ku rozt&#xE1;hne.\nRozta&#x17E;en&#xED;m zatla&#x10D;&#xED; na okoln&#xED; vzduch a vytvo&#x159;&#xED; tlakovou\nvlnu, kter&#xE1; m&#x16F;&#x17E;e doputovat a&#x17E; k&#xA0;tv&#xFD;m u&#x161;&#xED;m.</p>\n<p>Zkus si to &#x2013; kdy&#x17E; bzu&#x10D;&#xED;tko p&#x159;ipoj&#xED;&#x161; na <code>3V</code>\na <code>G</code> (tentokr&#xE1;t je jedno kter&#xFD;m sm&#x11B;rem), usly&#x161;&#xED;&#x161; tich&#xE9; lupnut&#xED;.\nA podobn&#xE9; lupnut&#xED; usly&#x161;&#xED;&#x161; kdy&#x17E; sou&#x10D;&#xE1;stku zase odpoj&#xED;&#x161;.</p>\n<p>Co se stane, kdy&#x17E; bude&#x161; nap&#x11B;t&#xED; p&#x159;ipojovat a odpojovat, &#x159;ekn&#x11B;me, 32&#xD7; za vte&#x159;inu?</p>\n<p>Nebo 65&#xD7;?</p>\n<p>Nebo n&#x11B;kterou z t&#x11B;chto frekvenc&#xED;?\nHz &#x2013; <a href=\"https://en.wikipedia.org/wiki/Hertz\">Hertz</a> &#x2013; je jednotka frekvence;\n&#x201E;49 Hz&#x201C; znamen&#xE1; &#x201E;49&#xD7; za sekundu&#x201C;.</p>\n<table>\n<thead><tr>\n<th style=\"text-align:left\">Nota&#xA0;</th>\n<th style=\"text-align:right\">Frekvence</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">C1</td>\n<td style=\"text-align:right\">32,70 Hz</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">D</td>\n<td style=\"text-align:right\">36,71 Hz</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">E</td>\n<td style=\"text-align:right\">41,20 Hz</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">F</td>\n<td style=\"text-align:right\">43,65 Hz</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">G</td>\n<td style=\"text-align:right\">49,00 Hz</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">A</td>\n<td style=\"text-align:right\">55,00 Hz</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">H</td>\n<td style=\"text-align:right\">61,74 Hz</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">C2</td>\n<td style=\"text-align:right\">65,41 Hz</td>\n</tr>\n</tbody>\n</table>\n<p>Naprogramuj p&#xED;sni&#x10D;ku! Pot&#x159;ebuje&#x161;-li v&#xED;c not, pus&#x165; si <a href=\"/2018/micropython-workshop-ostrava/micropython/workshop-ostrava/static/noty.py\">program</a>,\nkter&#xFD; vypo&#x10D;&#xED;t&#xE1; dal&#x161;&#xED; frekvence.</p>\n<h2>Dal&#x161;&#xED; ovl&#xE1;d&#xE1;n&#xED;</h2>\n<p>Te&#x10F; si vezmi tla&#x10D;&#xED;tko a p&#x159;ipoj ho k&#xA0;modulu:\n<code>GND</code> v&#x17E;dycky na <code>G</code>, <code>VCC</code> v&#x17E;dycky na <code>3V</code> a\n<code>OUT</code> na <code>D1</code>.</p>\n<p>Tla&#x10D;&#xED;tko funguje tak, &#x17E;e <code>OUT</code> spoj&#xED; bu&#x10F; s <code>VCC</code> (<code>3V</code>)\nnebo <code>GND</code>, podle toho, jestli je tla&#x10D;&#xED;tko stisknut&#xE9;.\n(A nav&#xED;c to taky teda sv&#xED;t&#xED;, ale to je te&#x10F; vedlej&#x161;&#xED;.)</p>\n<p>Zkus si, jestli se zvl&#xE1;dne&#x161; MicroPythonu zeptat, jestli je tla&#x10D;&#xED;tko zapnut&#xE9;.\nM&#x11B;lo by to b&#xFD;t podobn&#xE9; jako u p&#x159;&#xED;kladu s&#xA0;tla&#x10D;&#xED;tkem <code>FLASH</code>.</p>\n<p>Zvl&#xE1;dne&#x161; napsat program, kter&#xFD; bude bzu&#x10D;et bzu&#x10D;&#xED;tkem\na p&#x159;itom se bude d&#xE1;t tla&#x10D;&#xED;tkem zm&#x11B;nit t&#xF3;n?</p>\n<p>Program si (na sv&#xE9;m po&#x10D;&#xED;ta&#x10D;i) ulo&#x17E;, a&#x165; se k&#xA0;n&#x11B;mu m&#x16F;&#x17E;e&#x161; vr&#xE1;tit.</p>\n<h2>Barevn&#xE1; sv&#x11B;t&#xFD;lka</h2>\n<p>Je &#x10D;as na novou hra&#x10D;ku!\nTentokr&#xE1;t to bude LED p&#xE1;sek.</p>\n<p>Na p&#xE1;sku m&#xE1;&#x161; 8 mal&#xFD;ch &#x10D;tvere&#x10D;k&#x16F;.\nKa&#x17E;d&#xFD; z nich obsahuje docela hodn&#x11B; elektroniky:\nt&#x159;i barevn&#xE9; LED (&#x10D;ervenou, zelenou a modrou)\na &#x10D;ip, kter&#xFD; je um&#xED; ovl&#xE1;dat pomoc&#xED; informac&#xED;,\nkter&#xE9; dostane p&#x159;es jedin&#xFD; dr&#xE1;tek z&#xA0;modulu.</p>\n<p>Takov&#xE9; p&#xE1;sky se prod&#xE1;vaj&#xED; po metrech a daj&#xED; se\nnast&#x159;&#xED;hat &#x2013; mezi jednotliv&#xFD;mi sv&#x11B;t&#xFD;lky si v&#x161;imni &#x10D;&#xE1;rky,\nkter&#xE1; nazna&#x10D;uje, kde m&#xE1;&#x161; st&#x159;ihnout.\nEnergie z USB sta&#x10D;&#xED; zhruba na osm sv&#x11B;t&#xFD;lek, proto jsi jich dostal/a tolik.</p>\n<p>Tenhle LED p&#xE1;sek je stav&#x11B;n&#xFD; na p&#x11B;t volt&#x16F;. Na&#x161;t&#x11B;st&#xED; ale pot&#x159;ebuje 5 V jen\nna <em>nap&#xE1;jen&#xED;</em>; &#x159;&#xED;d&#xED;c&#xED; sign&#xE1;l s informacemi o barvi&#x10D;k&#xE1;ch m&#x16F;&#x17E;e m&#xED;t 3,3 V.</p>\n<p>Poj&#x10F;me p&#xE1;sek zapojit:</p>\n<ul>\n<li><code>GND</code> p&#xE1;sku (b&#xED;l&#xFD; dr&#xE1;tek) p&#x159;ipoj na <code>G</code></li>\n<li><code>DI</code> (<em>data in</em> &#x2013; zelen&#xFD; dr&#xE1;tek) p&#x159;ipoj na <code>D4</code></li>\n<li><code>+5V</code> (&#x10D;erven&#xFD; dr&#xE1;tek) p&#x159;ipoj:<ul>\n<li>na <code>VU</code>, m&#xE1;-li tvoje desti&#x10D;ka tuhle no&#x17E;i&#x10D;ku,</li>\n<li>jinak na <code>VIN</code>.</li>\n</ul>\n</li>\n</ul>\n<p>No&#x17E;i&#x10D;ka <code>VU</code>/<code>VIN</code> poskytuje 5 volt&#x16F;.\nPozor na ni: nep&#x159;ipojuj na ni za&#x159;&#xED;zen&#xED;, kter&#xE9; se s&#xA0;p&#x11B;ti volty nevyrovnaj&#xED;.</p>\n<p>M&#xE1;&#x161;-li zapojeno, m&#x16F;&#x17E;e&#x161; za&#x10D;&#xED;t programovat.\n&#x201E;Jazyk&#x201D;, kter&#xFD;m &#x201E;mluv&#xED;&#x201D; tenhle LED p&#xE1;sek je tro&#x161;ku\nslo&#x17E;it&#x11B;j&#x161;&#xED; ne&#x17E; sign&#xE1;l PWM, ale MicroPython obsahuje\nspeci&#xE1;ln&#xED; knihovnu, kter&#xE1; s p&#xE1;skem komunikovat um&#xED;.\nVypad&#xE1; to n&#x11B;jak takhle:</p>\n<pre>from machine import Pin\nfrom neopixel import NeoPixel\n\nPOCET_LED = 8\npin = Pin(2, Pin.OUT)\nnp = NeoPixel(pin, POCET_LED)\nnp<span class=\"highlight-nocolor\">[0]</span> = (<span class=\"highlight-red\">255</span>, <span class=\"highlight-green\">255</span>, <span class=\"highlight-blue\">255</span>)\nnp.write()\n</pre><p>Co znamenaj&#xED; ta &#x10D;&#xED;sla (<code>0</code> a <code>255</code>), na to u&#x17E; jist&#x11B; p&#x159;ijde&#x161; s&#xE1;m/sama.\nJen p&#x159;i experimentov&#xE1;n&#xED; nezapome&#x148; zavolat\n<code>np.write()</code>, t&#xED;m se informace po&#x161;lou do LED p&#xE1;sku.</p>\n<p>Zvl&#xE1;dne&#x161; naprogramovat semafor?</p>\n<h2>Teplom&#x11B;r</h2>\n<p>Posledn&#xED; sou&#x10D;&#xE1;stkou, kterou si dnes uk&#xE1;&#x17E;eme, bude jednoduch&#xFD; teplom&#x11B;r DS18B20.\nTento teplom&#x11B;r se vyr&#xE1;b&#xED; v n&#x11B;kolika proveden&#xED;ch a je velmi popul&#xE1;rn&#xED; p&#x159;edev&#x161;&#xED;m\npro jednoduchost pou&#x17E;it&#xED; a velmi n&#xED;zkou cenu.</p>\n<p>Stejn&#x11B; jako si MicroPython pomoc&#xED; speci&#xE1;ln&#xED;ho &#x201E;jazyka&#x201D; rozum&#xED; s LED p&#xE1;skem, ovl&#xE1;d&#xE1;\ni &#x201E;jazyk&#x201D; pro komunikaci s teplom&#x11B;rem a &#x159;adou dal&#x161;&#xED;ch za&#x159;&#xED;zen&#xED;. 1-wire sb&#x11B;rnice\nm&#xE1; nav&#xED;c tu v&#xFD;hodu, &#x17E;e se na jednu no&#x17E;i&#x10D;ku na&#x161;&#xED; desti&#x10D;ky d&#xE1; p&#x159;ipojit hned\nn&#x11B;kolik teplom&#x11B;r&#x16F; a &#x10D;&#xED;st teploty z ka&#x17E;d&#xE9;ho z nich.</p>\n<p>Oto&#x10D; teplom&#x11B;r tak, aby jeho &#x201E;b&#x159;icho&#x201D; sm&#x11B;&#x159;ovalo sm&#x11B;rem od tebe a takto jej zapoj\ndo nevyu&#x17E;it&#xE9; &#x10D;&#xE1;sti nep&#xE1;jiv&#xE9;ho pole. N&#xE1;sledn&#x11B; propoj no&#x17E;i&#x10D;ky teplom&#x11B;ru\ns desti&#x10D;kou takto:</p>\n<ul>\n<li>Levou no&#x17E;i&#x10D;ku propoj s <code>G</code></li>\n<li>Prost&#x159;edn&#xED; no&#x17E;i&#x10D;ku propoj s <code>D2</code></li>\n<li>Pravou no&#x17E;i&#x10D;ku propoj s <code>3V</code></li>\n</ul>\n<div class=\"admonition note\"><p>Po zapojen&#xED; dr&#x17E; teplom&#x11B;r na chv&#xED;li mezi prsty. Pokud je zapojen&#xFD; &#x161;patn&#x11B; za&#x10D;ne\nse velmi rychle zah&#x159;&#xED;vat a v takov&#xE9;m p&#x159;&#xED;pad&#x11B; jej okam&#x17E;it&#x11B; odpoj.</p>\n</div><p>Pokud je v&#x161;e zapojeno spr&#xE1;vn&#x11B;, m&#x16F;&#x17E;eme p&#x159;istoupit k m&#x11B;&#x159;en&#xED; teploty.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">time</span> <span class=\"kn\">import</span> <span class=\"n\">sleep</span>\n<span class=\"kn\">from</span> <span class=\"nn\">machine</span> <span class=\"kn\">import</span> <span class=\"n\">Pin</span>\n<span class=\"kn\">import</span> <span class=\"nn\">onewire</span>\n<span class=\"kn\">from</span> <span class=\"nn\">ds18x20</span> <span class=\"kn\">import</span> <span class=\"n\">DS18X20</span>\n\n\n<span class=\"n\">pin</span> <span class=\"o\">=</span> <span class=\"n\">machine</span><span class=\"o\">.</span><span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">IN</span><span class=\"p\">)</span>\n<span class=\"n\">ow</span> <span class=\"o\">=</span> <span class=\"n\">DS18X20</span><span class=\"p\">(</span><span class=\"n\">onewire</span><span class=\"o\">.</span><span class=\"n\">OneWire</span><span class=\"p\">(</span><span class=\"n\">pin</span><span class=\"p\">))</span>\n\n<span class=\"n\">sensory</span> <span class=\"o\">=</span> <span class=\"n\">ow</span><span class=\"o\">.</span><span class=\"n\">scan</span><span class=\"p\">()</span>\n<span class=\"n\">ow</span><span class=\"o\">.</span><span class=\"n\">convert_temp</span><span class=\"p\">()</span>\n<span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"n\">teplota</span> <span class=\"o\">=</span> <span class=\"n\">ow</span><span class=\"o\">.</span><span class=\"n\">read_temp</span><span class=\"p\">(</span><span class=\"n\">sensory</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Teplota je&quot;</span><span class=\"p\">,</span> <span class=\"n\">teplota</span><span class=\"p\">)</span>\n</pre></div><p>Nejd&#x159;&#xED;ve si op&#x11B;t p&#x159;iprav&#xED;me no&#x17E;i&#x10D;ku (pin) pro komunikaci a n&#xE1;sledn&#x11B; si na n&#xED;\np&#x159;iprav&#xED;me komunika&#x10D;n&#xED; protokol OneWire. Prvn&#xED;m krokem k teplot&#x11B; je nalezen&#xED;\nv&#x161;ech dostupn&#xFD;ch teplom&#x11B;r&#x16F; na dan&#xE9; sb&#x11B;rnici, co&#x17E; n&#xE1;m zajist&#xED; metoda <code>ow.scan()</code>,\nkter&#xE1; n&#xE1;m vr&#xE1;t&#xED; seznam identifik&#xE1;tor&#x16F; nalezen&#xFD;ch teplom&#x11B;r&#x16F;.\nMetoda <code>ow.convert_temp()</code> pak po&#x161;le v&#x161;em teplom&#x11B;r&#x16F;m p&#x159;&#xED;kaz, aby zm&#x11B;&#x159;ily\nteplotu. Po tomhle rozkazu mus&#xED;me alespo&#x148; vte&#x159;inu po&#x10D;kat a n&#xE1;sledn&#x11B; m&#x16F;&#x17E;eme\nteplotu z na&#x161;eho &#x10D;idla p&#x159;e&#x10D;&#xED;st.</p>\n<h2>WiFi</h2>\n<p>Jak jsme zm&#xED;nili na za&#x10D;&#xE1;tku, byl &#x10D;ip ESP8266 prim&#xE1;rn&#x11B; ur&#x10D;en pro pr&#xE1;ci s WiFi\na tato schopnost mu z&#x16F;stala. Um&#xED; se bu&#x10F; p&#x159;ipojit k existuj&#xED;c&#xED; s&#xED;ti, nebo\nze sebe ud&#x11B;lat hotspot a vytvo&#x159;it si tak vlastn&#xED; WiFi s&#xED;&#x165;. Ob&#x11B; tyto mo&#x17E;nosti\nn&#xE1;m umo&#x17E;n&#xED; spojit se s desti&#x10D;kou bezdr&#xE1;tov&#x11B; a pracovat s n&#xED; skrze\nwebov&#xFD; prohl&#xED;&#x17E;e&#x10D; pomoc&#xED; tzv. WebREPL, nebo pou&#x17E;&#xED;t p&#x159;ipojen&#xED; k s&#xED;ti k odes&#xED;l&#xE1;n&#xED;\ndat z desti&#x10D;ky pro dal&#x161;&#xED; zpracov&#xE1;n&#xED;.</p>\n<p>Pou&#x17E;&#xED;v&#xE1;n&#xED; WiFi je ov&#x161;em mimo mo&#x17E;nosti tohoto workshopu. V&#x161;e pot&#x159;ebn&#xE9; k jej&#xED;mu\nzprovozn&#x11B;n&#xED; je k dispozici <a href=\"https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/repl.html#webrepl-a-prompt-over-wifi\">v t&#xE9;to &#x10D;&#xE1;sti dokumentace</a>.</p>\n<h2>Kam d&#xE1;l</h2>\n<p>Fantazii se meze nekladou a mo&#x17E;nosti jsou nep&#x159;ebern&#xE9;.\nVelk&#xE9; mno&#x17E;stv&#xED; informac&#xED; naleznete v <a href=\"https://docs.micropython.org/en/latest/esp8266/\">dokumentaci</a>.</p>\n\n\n        "
    }
  }
}