OctopusLab - workshop micropython - 3. díl
- October 14 2019
- OctopusLab
- 1313x Přečteno
- 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,
# defaultně 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
>>> 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()
examples/oled_clock.py
opět na vývojové desce octopusLAB: ROBOTboard