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