Práce se soubory

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.

Nejdřív si do virtuálního prostředí nainstaluj program Ampy od Adafruitu.

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

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).

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.

Podobně je možné na destičku soubory i nahrávat, jen je potřeba místo run použít put.

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

Pokud navíc budeš chtít, aby se program na destičce automaticky spouštěl, musí se soubor s programem na destičce jmenovat main.py. ampy umí soubor při kopírování i přejmenovat, když mu při kopírování zadáš i druhé (nové) jméno.

(venv)$ ampy -p PORT put blikajici_led.py main.py

Po úspěšném kopírování máš na destičce nahraný náš program ze souboru blikajici_led.py do souboru main.py. Teď už bude tvůj program fungovat i bez počítače, takže stačí destičku připojit např. k powerbance a dioda se rozbliká.

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2019/brno-podzim-pondeli:micropython:5",
      "title": "PrĂ¡ce se soubory",
      "html": "\n          \n    \n\n    <h2>Pr&#xE1;ce se soubory</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>Nejd&#x159;&#xED;v si do virtu&#xE1;ln&#xED;ho prost&#x159;ed&#xED; nainstaluj program Ampy od Adafruitu.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">(env)$ </span>python -m pip install adafruit-ampy\n</pre></div><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>Ke 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<p>Podobn&#x11B; je mo&#x17E;n&#xE9; na desti&#x10D;ku soubory i nahr&#xE1;vat, jen je pot&#x159;eba m&#xED;sto\n<code>run</code> pou&#x17E;&#xED;t <code>put</code>.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">(venv)$ </span>ampy -p PORT put blikajici_led.py\n</pre></div><p>Pokud nav&#xED;c bude&#x161; cht&#xED;t, aby se program na desti&#x10D;ce automaticky spou&#x161;t&#x11B;l, mus&#xED;\nse soubor s programem na desti&#x10D;ce jmenovat <code>main.py</code>. <code>ampy</code> um&#xED; soubor p&#x159;i\nkop&#xED;rov&#xE1;n&#xED; i p&#x159;ejmenovat, kdy&#x17E; mu p&#x159;i kop&#xED;rov&#xE1;n&#xED; zad&#xE1;&#x161; i druh&#xE9; (nov&#xE9;) jm&#xE9;no.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">(venv)$ </span>ampy -p PORT put blikajici_led.py main.py\n</pre></div><p>Po &#xFA;sp&#x11B;&#x161;n&#xE9;m kop&#xED;rov&#xE1;n&#xED; m&#xE1;&#x161; na desti&#x10D;ce nahran&#xFD; n&#xE1;&#x161; program ze souboru\n<code>blikajici_led.py</code> do souboru <code>main.py</code>. Te&#x10F; u&#x17E; bude tv&#x16F;j program fungovat\ni bez po&#x10D;&#xED;ta&#x10D;e, tak&#x17E;e sta&#x10D;&#xED; desti&#x10D;ku p&#x159;ipojit nap&#x159;. k powerbance\na dioda se rozblik&#xE1;.</p>\n\n\n        "
    }
  }
}