MicroPython
&
IoT
Marek Mansell
MicroPython
Čo je to?
MicroPython je implementácia Python3 optimalizovaná pre mikroprocesory
Čo robí?
Prepája jednoduchosť a krásy Pythonu
s "komplikovaným" svetom hardvéru
Prečo je zrazu všade?
Prináša jednoduchý no pritom rýchly vývoj elektronických komponentov. Vhodný aj pre začiatočníkov.
Silná komunita.
Počiatky MicroPythonu
KickStarter - December 2013
Damien George
BBC Micro:bit
1 milión vyrobených kusov
pre britských žiakov
Rozdaných ZADARMO
MU Editor
Bezdrátová komunikácia
ESP8266
- 32-bit Tensica LX106
- 80 MHz (160MHz)
- Flash 4 MB
- RAM 96MB
- IEEE 802.11 b/g/n Wi-Fi
- +20 dBm @ 802.11b
- WPA/WPA2
- 16 GPIO pinov, PWM
- 1x 10-bitový ADC
- SPI, I²C, UART
- Sleep mód <10uA
- Wake up and transmit packets in < 2ms
Witty Board
NodeMCU
Firmvér
REPL
$ picocom -b 115200 --flow n /dev/ttyUSB0
picocom v1.7
port is : /dev/ttyUSB0
flowcontrol : none
baudrate is : 115200
parity is : none
databits are : 8
escape is : C-a
local echo is : no
noinit is : no
noreset is : no
nolock is : no
send_cmd is : sz -vv
receive_cmd is : rz -vv
imap is :
omap is :
emap is : crcrlf,delbs,
Terminal ready
>>>
MicroPython vs. Python
>>> 1+1
2
>>> print('Ahoj Svet!')
Ahoj Svet!
>>> print
>>> import math
>>> math.pi
3.141592
>>> from os import urandom
>>> urandom(1)[0]
61
Digitálny Výstup
from machine import Pin
# Pin Mód
moj_pin = Pin(2, Pin.OUT)
# Vráti hodnotu
moj_pin.value()
# Nastaví hodnotu
moj_pin.high()
moj_pin.low()
moj.pin.value(1)
moj.pin.value(0)
Digitálny Vstup
from machine import Pin
# Pin Mód
moj_pin = Pin(0, Pin.IN)
# Vráti hodnotu
moj_pin.value()
while True:
print(moj_pin.value())
from time import sleep
from machine import Pin
moj_pin = Pin(0, Pin.IN)
while True:
print(moj_pin.value())
sleep(.2)
WiFi
import network
# Klient
wlan = network.WLAN(network.STA_IF) # vytvorí interface
wlan.active(True) # aktivuje interface
wlan.scan() # vráti nájdené WiFi siete (ssid, bssid, security, channel, rssi)
wlan.isconnected() # vráti True, ak sme pripojený k nejakej WiFi sieti
wlan.connect('nazov_siete', 'heslo') # pripojí sa k sieti
wlan.config('mac') # vráti MAC adresu
wlan.ifconfig() # vráti IP adresu/masku/gateway/DNS adresu
# Access Point
ap = network.WLAN(network.AP_IF) # vytvorí WiFi access point
ap.active(True) # aktivuje interface
ap.config(essid='ESP-AP') # nastaví názov siete na 'ESP-AP'
Web REPL
import webrepl_setup
import webrepl
webrepl.start()
>>> import os
>>> os.listdir()
['boot.py', 'port_config.py', 'data.txt']
>>> os.mkdir('dir')
>>> os.remove('data.txt')
AMPY
# Spustiť kód
ampy --port /dev/ttyUSB0 run --no-output test.py
# Nahrať súbor
ampy --port /dev/ttyUSB0 put test.py
ampy --port /dev/ttyUSB0 put test.py /foo/bar.py
# Stiahnuť súbor
ampy --port /dev/ttyUSB0 get boot.py
ampy --port /dev/ttyUSB0 get boot.py board_boot.py
# Operácie s file systémom
ampy --port /dev/ttyUSB0 mkdir foo
ampy --port /dev/ttyUSB0 ls
ampy --port /dev/ttyUSB0 ls /foo
ampy --port /dev/ttyUSB0 rm test.py
NeoPixel
from machine import Pin
from neopixel import NeoPixel
import time
def demo():
pin = Pin(4, Pin.OUT) # nastaví pin ako digitálny výstup
np = NeoPixel(pin, 8) # Vytvorí NeoPixel driver pre 8 pixelov
n = np.n
# cycle
for i in range(4 * n):
for j in range(n):
np[j] = (0, 0, 0)
np[i % n] = (255, 255, 255)
np.write()
time.sleep_ms(25)
# bounce
for i in range(4 * n):
for j in range(n):
np[j] = (0, 0, 128)
if (i // n) % 2 == 0:
np[i % n] = (0, 0, 0)
else:
np[n - 1 - (i % n)] = (0, 0, 0)
np.write()
time.sleep_ms(60)
# fade in/out
for i in range(0, 4 * 256, 8):
for j in range(n):
if (i // 256) % 2 == 0:
val = i & 0xff
else:
val = 255 - (i & 0xff)
np[j] = (val, 0, 0)
np.write()
# clear
for i in range(n):
np[i] = (0, 0, 0)
np.write()
NeoPixel
from machine import Pin
from neopixel import NeoPixel
pin = Pin(0, Pin.OUT) # nastaví pin ako digitálny výstup
np = NeoPixel(pin, 8) # Vytvorí NeoPixel driver pre 8 pixelov
np[0] = (255, 255, 255) # nastaví prvý pixel na bielu farbu
np.write() # odošle nastavené odnoty, pixely zmenia farby
r, g, b = np[0] # vráti nastevenie prvého pixelu
DS18B20
from onewire import OneWire
from machine import Pin
from ds18x20 import DS18X20
from time import sleep_ms
one_wire_pin = DS18X20(OneWire(Pin(2)))
ds18b20_zariadenia = one_wire_pin.scan() # vráti list pripojených teplomerov
one_wire_pin.convert_temp() # Zavoláme vždy pred novým meraním
sleep_ms(750) # musíme počkať aspoň 750 ms
for adresa in ds18b20_zariadenia:
print(one_wire_pin.read_temp(adresa))
DS18B20 v cykle
from onewire import OneWire
from machine import Pin
from ds18x20 import DS18X20
from time import sleep_ms
one_wire_pin = DS18X20(OneWire(Pin(2)))
# Získame adresy všetkých teplomer pripojených k pinu (funkcia vracia list)
ds18b20_zariadenia = one_wire_pin.scan()
print("Počet nájdených nájdených teplomerov:", len(ds18b20_zariadenia))
while True:
# Zavoláme vždy pred novým meraním
one_wire_pin.convert_temp()
# musíme počkať aspoň 750 ms
sleep_ms(750) # to isté ako time.sleep(.75)
print('Prečítané teploty:', end=' ')
for adresa in ds18b20_zariadenia:
print(one_wire_pin.read_temp(adresa), end = ' ')
print()
HTTP Server
import machine
import network
import socket
from onewire import OneWire
from machine import Pin
from ds18x20 import DS18X20
from time import sleep_ms
def gpio(ssid, password):
pins = [machine.Pin(i, machine.Pin.IN) for i in (0, 2, 4, 5, 12, 13, 14, 15)]
html = """<!DOCTYPE html>
<html>
<head> <title>ESP8266 Pins</title> </head>
<body> <h1>ESP8266 Pins</h1>
<table border="1"> <tr><th>Pin</th><th>Value</th></tr> %s </table>
</body>
</html>
"""
wlan = network.WLAN(network.STA_IF) # vytvorí interface
wlan.active(True) # aktivuje interface
wlan.connect(ssid, password) # pripojí sa k sieti
print(wlan.ifconfig())
addr = socket.getaddrinfo(wlan.ifconfig()[0], 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print('listening on', addr)
while True:
cl, addr = s.accept()
print('client connected from', addr)
cl_file = cl.makefile('rwb', 0)
while True:
line = cl_file.readline()
if not line or line == b'\r\n':
break
rows = ['<tr><td>%s</td><td>%d</td></tr>' % (str(p), p.value()) for p in pins]
response = html % '\n'.join(rows)
cl.send(response)
cl.close()
def temp(ssid, password):
html = """<!DOCTYPE html>
<html>
<head> <title>ESP8266 Teplota</title> </head>
<body> <h1>ESP8266 Teplota</h1>
<p> %s </p>
</body>
</html>
"""
wlan = network.WLAN(network.STA_IF) # vytvorí interface
wlan.active(True) # aktivuje interface
wlan.connect(ssid, password) # pripojí sa k sieti
print(wlan.ifconfig())
addr = socket.getaddrinfo(wlan.ifconfig()[0], 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print('listening on', addr)
while True:
cl, addr = s.accept()
print('client connected from', addr)
cl_file = cl.makefile('rwb', 0)
while True:
line = cl_file.readline()
if not line or line == b'\r\n':
break
one_wire_pin = DS18X20(OneWire(Pin(2)))
ds18b20_zariadenia = one_wire_pin.scan() # vráti list pripojených teplomerov
one_wire_pin.convert_temp() # Zavoláme vždy pred novým meraním
sleep_ms(750) # musíme počkať aspoň 750 ms
response = html % (str(one_wire_pin.read_temp(ds18b20_zariadenia[0])))
cl.send(response)
cl.close()
www.docs.micropython.org/en/latest/esp8266/
MicroPython & IoT
By Marek Mansell
MicroPython & IoT
- 325