workshop-micropython3

  • Změny v Micropythonu si vynucují změnu octopus()
  • Opakování a podrobnější doplnění
  • LED – nejjednodušší knihovna pro testování
  • web_server()
  • Webový editor IDE (integrated development environment)
  • Některé další vychytávky
  • Drobné projekty – examples

V minulých dvou dílech jste si mohli vyzkoušet pár prvních experimentů s ESP32. Hlavní částí byla příprava ESP – podle následujícího odkazu:
https://www.octopuslab.cz/micropython-octopus/


Změny v Micropythonu si vynucují změny v octopus()

Vývoj open-source Micropythonu je nekončící proces – a tak nám například před dokončením toho dílu změnili formát předkompilovaných souborů *.mpy – proto je nutné mít verzi:
MicroPython v1.11-392-…-build-octopusLAB on 2019-10-08
a novější – ke stažení u nás:

https://octopusengine.org/download/micropython/micropython-octopus.bin a pak přejít na verze octopus() od 0.92+ lépe 0.93 stable

Z dalších změn, které jsou aktuální, vybírám opravu chyby, kterou jsme trochu z pohodlnosti využívali:
from octopus import * (kde octopus nebyla class)
https://github.com/micropython/micropython/issues/5121
– v dalších verzím proto dojde k jistým úpravám jádra našeho systému.

Pro účely různých experimentů z terminálu postačí v této poslední nové verzi importovat samostatně „všechny“ dostupné metody (respektive metody se linkují dynamicky podle nastavení setup() > ios, například – když nemáte nastavenou SW RGB diodu, nepřihrají se vám knihovny pro její ovládání a ani předdefinované barvy)

>>> octopus()
>>> from util.octopus import *

v kódu ale "import *" důrazně nedoporučujeme, tam se vždy uvedou jen nutné knihovny, například:
>>> from util.octopus import w, web_server 

Pokud chceme mít některé metody dostupné už po zavolání octopus(), zatím řešíme rozšířením globals() v souboru boot.py:

def octopus():
   ...
   from util.octopus import ls, cat, cp
   globals()["ls"]=ls    # ls("subdir") pro list souborů v adresáři
   globals()["cat"]=cat  # cat nefo f pro výpis obsahu souboru
   globals()["cp"]=cp    # cp nebo file_copy pro kopii obsahu, 
                         # dafaultně do main.py

Máme také rozpracovánu změnu s class Octopus, kterou budeme používat:
>>> from util.octopus import Octopus
>>> o = Octopus()
    

Opakování a podrobnější doplnění

posloupnost pro pro instalaci octopus() do nově nahraného Micropythonu:
>>> octopus_initial.setup() ->  w, a -> cw, sd 
před dalším spuštěním se musí importovat:
>>> from  util import octopus_initial

příkazy pro update a nastavení  : 
>>> setup()  > w, a > cw, sd   > ds, ios
update stable verze stačí:
>>> u()

obecný upgrade z cloudu (musí existovat soubor.tar na url)
>>> from util.octopus import u 
>>> u() 
je zkrácení pro:
>>> from util.setup import deploy
>>> deploy("vaše cesta k url/soubor.tar")
->
>>> deploy("https://octopusengine.org/download/web-ide.tar")

provádí se také ze setup(), kde přibylo samostané nahrávání examples [sde]
   
octopus help:
>>> h()
podrobněji na webu:  
https://www.octopuslab.cz/micropython-octopus-help/  

LED – nejjednodušší knihovna pro testování

Ukázky zdrojových kódů slouží pro vysvětlení, jak to všechno je napsané, ale především pro inspiraci, pokud někdo bude chtít vytvářet vlastní a klidně mnohem složitější projekt – princip zůstává stejný.

Všechny knihovny a další ukázky najdete na githubu. Celý kód pro „util/led“ je zde: https://github.com/octopusengine/octopuslab/blob/master/esp32-micropython/util/led/__init__.py

Základní část zdrojového kódu třídy Led
>>> from util.led import Led 
>>> led = Led(2)  # BUILT_IN_LED    
vytvoření instance objektu Led na pinu 2 (nejčastější "vestavěný")

>>> led.value(1) 
instance objektu "tečka" metoda "( parametry )"
zde: 
hodnota (value) s parametrem  1 znamená, že se LEDka rozsvítí.

. >TAB nabídka metod 

Napište "led" . (tečka) a stiskněte TAB
led.
class       init        module      qualname
value           dict        pin             blink
toggle          state
led. 

zkuste si také:
>>> dir(led)
...

>>> led.pin
> Pin(2)                 
přednastaveno, na ESP32 modulu je BUILT_IN_LED na pinu 2

>>> led.state
False

>>> led.value(1)
>>> led.state
1  
Led: Ukázka z terminálu

Podobným způsobem můžete zkoumat všechny ostatní moduly, metody a funkce v Micropythonu, což se dá využít nejen jako nápověda, ale i pro výuku a hlubší pochopení.


web_server()

Spuštění webového serveru jsme zjednodušili na maximální možnou míru, navíc jsme doplnili pár dalších možností – od nastavení WiFi, nastavení systému a ukázku ovládání (zatím nezabezpečeného) jednoduchých periferií (LED, RGB LED, PWM…)

Máte-li nainstalovaný octopus() verze 0.91+, webový server spustíte následovně:

>>> from util.octopus import w, web_server 
>>> w()
>>> web_server()

Zkuste nejdříve z terminálu, kdy se vám vypíše IP adresa na které web server poběží – nejčastěji 192.168.x.y (Kde x je velmi často 0 nebo 1)
Pokud jste připojeni s počítačem na stejné síti jako ESP, po zadání adresy do prohlížeče byste měli vidět následující stránku (nebo velmi podobnou) generovanou ESPéčkem:

Webový editor – IDE

Hlavní částí webového serveru je webový editor, ve kterém se dá zdrojový kód vytvářet, editovat i spouštět – a v dolní polovině paralelně běžící web-repl.
IDE = integrated development environment.

Ukázka main.py – spuštění web serveru „po startu“
Network setup
AP (access point) a webserver:
>>> from util.octopus import ap_init, web_server
>>> ap = ap_init()
>>> web_server() 
AP se spouští jako nový "poskytovatel lokální WiFi sítě" - ke kterému se lze připojit zpravidla na adrese:  192.168.4.1 
Pokud se připojení AP provede automaticky po startu, můžete potom nastavit připojení k jiné známé WiFi v okolí bez nutnosti připojování k PC.

Některé další vychytávky

pro práci se soubory jsme přímo do octopus() integrovali některé příkazy, které známe z Linuxu (ls, cat, cp) - zde jako metody, proto je nutno používat závorky:

>>> ls()
provede výpis souborů (*.py) a podadresářů (bez přípony) 
je to pouze zkratka - což udělá v základu i:
>>> import os
>>> os.listdir() 

>>> ls("examples") 
> výpis obsahu podardresáře

>>> cat("examples.clock.py")
> výpis obsahu souboru

>>> cp("examples/blink.py")
> zkopírování souboru/programu do main.py dafaultně, nebo do jiného souboru (druhý nepovinný parametr)


vytváření souborů a spustitelných programů lze provádět i v interaktivním řádkovém modu, pokud není jiná možnost - např.: ampy run file, ampy main.py file, wifi webrepl, blockly... 
ale zatím to lze pro jednoduché a krátké pokusy obejít přímo z Micropythonu: 

>>> with open('examples/pokus.py', 'w') as f:   
>>> f.write(".....")

krátký program po spuštění:
>>> with open('main.py', 'w') as f:
...  f.write("octopus()\n")
...  f.write("while True:\n")
...  f.write("   led.blink()\n")
...  f.write("   sleep(1)\n")
...        


máme v plánu lépe využívat i časování - například pomocí timeru:
timer_init() > tim1
tim1.deinit()
Env.timerLed = 0

časovač běhu:
Env.start = ticks_ms() 
start = ticks_diff(ticks_ms(), Env.start)
Env.start = start  > "nulování"

V našich open-source zdrojích je celá řada knihoven pro práci s různými zařízeními a senzory, včetně jednoduchých ukázek:
https://github.com/octopusengine/octopuslab/tree/master/esp32-micropython 
  
 

Dobné projekty – examples

Máme k dispozici pár ukázek – ucelenější ukázkové projekty, na kterých demonstrujeme jednoduchost práce se systémem a základy rapid prototypingu – programy na pár řádků? Například hodiny, budík, teploměr, termostat, tickernátor, messenger, alarm, měřící přístroj, zařízení pro diagnostiku, logování a posílání dat do databáze…
Můžeme vytvářet funkční zařízení nebo jednoduché hry. Vše se snažíme zprovoznit jen za pomoci několika základních řádek kódu.

Sedmisegmentový display – a obyčejná elektroinstalatérská krabička
s krytem z nerezového plechu – zkoušíme i pro teploměr nebo termostat…
jak fungují jednoduché hodiny v našem příkladu:
modul ESP32 s ROBOTboard a 7-mi segment Displejem (8 číslic, obvod MAX) 

from util.octopus import w, time_init, get_hhmm, disp7_init
w()
time_init()

zobrazení času:
get_hhmm()
'11:23'
get_hhmm("-")     > parametrem je "separátor" - defaultně ":" 
'11-23'         

clock.py:
w()                > připojení k internetu - správně nastaveno v setup()  
time_init()        > ze serveru se stáhne aktuální čas (i datum)
d7 = disp7_init()  > inicializace sedmisegmentového displeje

def clock():
…    d7.show(get_hhmm("-"))
…    sleep(0.5)
…    d7.show(get_hhmm(" "))       blikání pomlčky - vidíme, že to žije    
…    sleep(0.5)
…
while True:
…     clock()
Ukázka je v "examples/clock.py" a podobně i pro oled display: "examples/oled_clock.py"
examples/oled_clock.py
opět na vývojové desce octopusLAB: ROBOTboard
https://www.octopuslab.cz/micropython-octopus/ 
https://www.octopuslab.cz/workshop-micropython1/
https://www.octopuslab.cz/workshop-micropython2/
https://www.octopuslab.cz/workshop-micropython3/
https://www.octopuslab.cz/micropython-web-ide/
https://www.octopuslab.cz/micropython-octopus-help/