$30 off During Our Annual Pro Sale. View Details »

M5StackをMicroPythonで遊ぼう

 M5StackをMicroPythonで遊ぼう

2018 PyCon mini Osaka

mitszo

May 19, 2018
Tweet

Other Decks in Programming

Transcript

  1. M5Stack+MicroPython
    M5StackΛMicroPythonͰ༡΅͏
    2018-05-19 PyCon mini Osaka @mitszo

    View Slide

  2. M5StackΛMicroPythonͰ༡΅͏
    ΞδΣϯμ
    ▸ ࣗݾ঺հ
    ▸ .4UBDLͷ঺հ
    ▸ .JDSP1ZUIPOʹ͍ͭͯ
    ▸ .4UBDLͷ։ൃ؀ڥ
    ▸ .4UBDLͷ.JDSP1ZUIPO؀ڥ

    View Slide

  3. M5StackΛMicroPythonͰ༡΅͏
    ࣗݾ঺հ
    ▸ ࠓ௡ॆਖ਼ʢ͍·ͮΈͭ·͞ʣ!NJUT[P
    ▸ גࣜձࣾεΠοναΠΤϯεʢגࣜձࣾ-BCʣۈ຿
    ▸ ҹ࡮԰Ͱ%51ˠडୗ։ൃձࣾˠ3"%*64ϝʔΧʔˠݱ৬
    ▸ ओʹϚωδϝϯτɺ࣌ʑίʔυ
    ▸ 1ZUIPO͞ΘΓ࢝Ίͨͷ͸͋ͨΓ͔Β
    ▸ ϋʔυ΢ΣΞ͸ڵຯ͋Δ͚Ͳॳ৺ऀϨϕϧ

    View Slide

  4. M5StackΛMicroPythonͰ༡΅͏
    ࠷ۙͷ͓࢓ࣄ

    View Slide

  5. M5StackΛMicroPythonͰ༡΅͏
    ࠷ۙͷ͓࢓ࣄ

    View Slide

  6. M5StackΛMicroPythonͰ༡΅͏
    ࠷ۙͷ͓࢓ࣄ
    https://www.switch-science.com/catalog/3800/

    View Slide

  7. M5Stack

    View Slide

  8. M5Stack
    M5Stack
    ▸ )PNFQBHFIUUQTXXXNTUBDLDPN
    ▸ UXJUUFS!.4UBDL
    ▸ (JU)VCIUUQTHJUIVCDPNNTUBDL

    View Slide

  9. M5Stack
    M5Stack ͷಛ௃

    View Slide

  10. M5Stack
    M5Stack ͷಛ௃
    ▸ σΟεϓϨΠ෇͖
    ▸ ࠷ॳ͔ΒέʔεʹೖͬͯΔ
    ▸ ๛෋ͳ*0ͱωοτϫʔΫ
    ▸ 1ZUIPOΛ஌ͬͯΕ͹ָ͠ΊΔ

    View Slide

  11. M5Stack
    M5Stack ͷಛ௃
    ▸ ແઢ-"/ʢ()[ʣ
    ▸ #MVF5PPUI
    ▸ Y-$%
    ▸ όοςϦʔ
    ▸ Ϙλϯ
    ▸ εϐʔΧʔ
    ▸ *4
    ▸ NJDSP4%
    ▸ (307&ʢ*$ʣ
    ▸ 41*

    View Slide

  12. M5Stack
    M5Stack ͷ੡඼

    View Slide

  13. M5Stack
    ৽੡඼ M5Go
    ▸ IUUQCVZNHPNTUBDLDPN

    View Slide

  14. M5Stack
    εΠοναΠΤϯεͰചͬͯ·͢ʢએ఻ʣ
    ▸ IUUQTXXXTXJUDITDJFODFDPNDBUBMPHMJTU

    View Slide

  15. MicroPython

    View Slide

  16. MicroPython
    MicroPython
    ▸ IUUQNJDSPQZUIPOPSH
    ▸ ϚΠίϯ޲͚ͷ1ZUIPOॲཧܥ
    ▸ ίϯύΠϥɺϥϯλΠϜɺ3&1-ΛؚΉ
    ▸ ϥΠϒϥϦ
    ▸ IUUQEPDTNJDSPQZUIPOPSHFOMBUFTUQZCPBSEMJCSBSZJOEFYIUNM
    ▸ ඪ४ϥΠϒϥϦʢ$1ZUIPOʣͷαϒηοτ
    ▸ lVzϥΠϒϥϦ
    ▸ .JDSP1ZUIPOϥΠϒϥϦ
    ▸ ର৅ϋʔυ΢ΣΞ༻ϥΠϒϥϦ

    View Slide

  17. MicroPython
    ϋʔυ΢ΣΞ
    ▸ QZCPBSE
    ▸ &41
    ▸ &41
    ▸ .JDSPCJU

    View Slide

  18. MicroPython
    CPythonͱͷҧ͍
    ▸ .JDSP1ZUIPOEJ⒎FSFODFTGSPN$1ZUIPO
    ▸ γϯλοΫε
    ▸ ݴޠ࢓༷ʢΫϥεɾؔ਺ɾଞʣ
    ▸ ૊ΈࠐΈܕ
    ▸ Ϟδϡʔϧ

    View Slide

  19. MicroPython
    CPythonͱͷҧ͍ - γϯλοΫε
    ▸ ਺஋ϦςϥϧͱΩʔϫʔυͷؒʹεϖʔε͕ඞਢ
    >>> print(1or 0)
    1
    >>> print(1or 0)
    Traceback (most recent call last):
    File "", line 1
    SyntaxError: invalid syntax for integer with base 10
    MicroPython ʢM5Stack൛ʣ
    Python 3.6.4

    View Slide

  20. MicroPython
    CPythonͱͷҧ͍ - γϯλοΫε
    ▸ 6OJDPEFOBNFFTDBQF͕࢖͑ͳ͍
    >>> print('\N{LATIN SMALL LETTER A}')
    a
    >>> print('\N{LATIN SMALL LETTER A}')
    NotImplementedError: unicode name escapes
    MicroPython ʢM5Stack൛ʣ
    Python 3.6.4

    View Slide

  21. MicroPython
    CPythonͱͷҧ͍ - ྫ֎νΣΠϯ
    ▸ ྫ֎νΣΠϯʢ1&1ʣ͕ະ࣮૷
    ▸ ྫ֎Ϋϥεʹ@@DBVTF@@΍@@DPOUFYU@@͕ͳ͍ɻ

    View Slide

  22. >> try:
    ... try:
    ... a = {}['a']
    ... except KeyError as e1:
    ... raise ValueError() from e1
    ... except ValueError as e2:
    ... print(type(e2.__cause__))
    ...

    MicroPython
    CPythonͱͷҧ͍ - ྫ֎νΣΠϯ
    Python 3.6.4

    View Slide

  23. >>> try:
    ... try:
    ... a = {}['a']
    ... except KeyError as e1:
    ... raise ValueError() from e1
    ... except ValueError as e2:
    ... print(type(e2.__cause__))
    ...
    Warning: exception chaining not supported
    Traceback (most recent call last):
    File "", line 7, in
    File "", line 7, in
    AttributeError: 'ValueError' object has no attribute '__cause__'
    >>> e = Exception()
    >>> dir(e)
    ['__class__', 'args']
    MicroPython
    CPythonͱͷҧ͍ - ྫ֎νΣΠϯ
    MicroPython ʢM5Stack൛ʣ

    View Slide

  24. MicroPython
    CPythonͱͷҧ͍ - ྫ֎ͷϢʔβʔଐੑ
    ▸ ྫ֎ΠϯελϯεʹϢʔβʔଐੑΛੜ΍ͤͳ͍ɻ

    View Slide

  25. >>> try:
    ... try:
    ... a = {}['a']
    ... except KeyError as e1:
    ... e1.user_attribute = 'abc'
    ... raise e1
    ... except Exception as e2:
    ... print(e2.user_attribute)
    ...
    abc
    MicroPython
    CPythonͱͷҧ͍ - ྫ֎ͷϢʔβʔଐੑ
    Python 3.6.4

    View Slide

  26. >>> try:
    ... try:
    ... a = {}['a']
    ... except KeyError as e1:
    ... e1.user_attribute = 'abc'
    ... raise e1
    ... except Exception as e2:
    ... print(e2.user_attribute)
    ...
    Traceback (most recent call last):
    File "", line 8, in
    File "", line 8, in
    AttributeError: 'AttributeError' object has no attribute
    'user_attribute'
    MicroPython
    CPythonͱͷҧ͍ - ྫ֎ͷϢʔβʔଐੑ
    MicroPython ʢM5Stack൛ʣ

    View Slide

  27. MicroPython
    CPythonͱͷҧ͍ - ྫ֎ͦͷଞ
    ▸ XIJMFϧʔϓͷܧଓ৚݅Ͱྫ֎͕ൃੜͨ࣌͠ͷߦ൪߸ද͕ࣔ
    ҟͳΔɻ
    ▸ ϧʔϓϘσΟͷ຤ඌߦ͕Ϩϙʔτ͞ΕΔɻ
    ▸ ྫ֎Ϋϥεʹ͸@@JOJU@@ϝιου͕ͳ͍ɻ
    ▸ ૊ΈࠐΈྫ֎ΫϥεͷαϒΫϥεԽͷαϙʔτ͕ෆ׬શɻ

    View Slide

  28. MicroPython
    CPythonͱͷҧ͍ - จࣈྻ
    ▸ TUSFOETXJUIͰΠϯσοΫεࢦఆ͕࢖͑ͳ͍
    ▸ TUSGPSNBUͰଐੑࢦఆ͕࢖͑ͳ͍
    >>> 'abc'.endswith('c', 2)
    Traceback (most recent call last):
    File "", line 1, in
    NotImplementedError: start/end indices
    >>> '{a[0]}'.format(a=[1, 2])
    Traceback (most recent call last):
    File "", line 1, in
    NotImplementedError: attributes not supported yet

    View Slide

  29. MicroPython
    CPythonͱͷҧ͍ - จࣈྻ
    ▸ TUSؔ਺ͰΩʔϫʔυҾ਺ࢦఆ͕Ͱ͖ͳ͍
    >>> print(str(b'abc', encoding='utf-8'))
    Traceback (most recent call last):
    File "", line 1, in
    NotImplementedError: keyword argument(s) not yet
    implemented - use normal args instead
    >>> print(str(b'abc', 'utf-8'))
    abc

    View Slide

  30. MicroPython
    CPythonͱͷҧ͍ - จࣈྻ
    ▸ SKVTU MKVTU͕ະ࣮૷ɻ
    ▸ STQMJUͷୈҾ਺ʹ/POFΛࢦఆͰ͖ͳ͍ɻ
    ▸ TUSͷαϒΫϥεͱTUSͷൺֱͷڍಈ͕ҟͳΔɻ

    View Slide

  31. MicroPython
    CPythonͱͷҧ͍ - εϥΠε
    ▸ CZUFBSSBZͰࠨลʹεϥΠεΛࢦఆͨ͠୅ೖ͕Ͱ͖ͳ͍
    ▸ CZUFT จࣈྻͷεϥΠεͰTUFQࢦఆ͕Ͱ͖ͳ͍
    ▸ MJTUͷ࡟আͰTUFQࢦఆ͕Ͱ͖ͳ͍
    ▸ MJTUͷεϥΠε୅ೖͰ࢖͑Δͷ͸MJTU͔UVQMF
    >>> ba[0:1] = [1, 2]
    >>> print(b’123’[0:3:2])
    >>> del lst[0:4:2]
    >>> lst[0:1] = range(4)

    View Slide

  32. MicroPython
    CPythonͱͷҧ͍ - jsonϞδϡʔϧ
    ▸ 4FSJBMJ[BCMF͡Όͳ͍ΦϒδΣΫτΛEVNQͯ͠΋5ZQF&SSPS
    ʹͳΒͳ͍ɻ

    View Slide

  33. MicroPython
    CPythonͱͷҧ͍ - jsonϞδϡʔϧ
    >>> import json
    >>> data = bytes(range(10))
    >>> print(json.dumps(data))
    Traceback (most recent call last):

    TypeError: Object of type 'bytes' is not JSON serializable
    Python 3.6.4

    View Slide

  34. MicroPython
    CPythonͱͷҧ͍ - Ϟδϡʔϧ
    >>> import json
    >>> data = bytes(range(10))
    >>> print(json.dumps(data))
    "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\t"
    MicroPython ʢM5Stack൛ʣ

    View Slide

  35. MicroPython
    CPythonͱͷҧ͍
    ▸ ଞʹ΋͍Ζ͍Ζ
    ▸ IUUQEPDTNJDSPQZUIPOPSHFOMBUFTUQZCPBSE
    HFOSTUJOEFYIUNM

    View Slide

  36. MicroPython
    OSͷࢧԉ͕ͳ͍
    ▸ ωοτϫʔΫ
    ▸ ωοτϫʔΫʹ઀ଓ͢Δͱ͜Ζ͔Β࢝·Δ
    ▸ ূ໌ॻ
    ▸ ূ໌ॻετΞ͕ͳ͍
    ▸ ࣌ࠁ
    ▸ ݱࡏ࣌ࠁΛ΋ͬͯͳ͍
    ▸ ϑΝΠϧγεςϜ
    ▸ Ϛ΢ϯτ͢Δͱ͜Ζ͔Β࢝·Δ

    View Slide

  37. ։ൃ؀ڥ
    M5Stack

    View Slide

  38. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ
    ▸ "SEVJOP*%&
    ▸ &41"SEVJOP$PSF
    ▸ .4UBDL$MPVEʢ.JDSP1ZUIPO8FC*%&ʣ
    ▸ .JDSP1ZUIPOʢ0''-*/&ʣ

    View Slide

  39. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ - Arduino IDE
    .4UBDL%PDVNFOUBUJPO
    1.64#υϥΠόΠϯετʔϧ
    2."SEVJOP*%&ΛΠϯετʔϧ
    3.&41"SEVJOP$PSFϥΠϒϥϦΠ
    ϯετʔϧ
    4.ϥΠϒϥϦϚωʔδϟͰ.4UBDL௥
    Ճ

    View Slide

  40. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ - M5Stack Cloud
    IUUQJPNTUBDLDPN
    1.ϑΝʔϜ΢ΣΞΛ.4UBDLʹॻ͖
    ࠐΉ
    2..4UBDLͷ8J'Jઃఆ
    3..4UBDL$MPVEͰσόΠεొ࿥

    View Slide

  41. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ - M5Stack Cloud
    ϑΝʔϜ΢ΣΞͷμ΢ϯϩʔυ
    IUUQTHJUIVCDPNNTUBDL.$MPVEUSFFNBTUFS
    pSNXBSFT

    View Slide

  42. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ - M5Stack Cloud
    ϑΝʔϜ΢ΣΞͷॻ͖ࠐΈ
    IUUQTHJUIVCDPNFTQSFTTJGFTQUPPM
    ‣ FSBTF@qBTI
    ‣ XSJUF@qBTI

    View Slide

  43. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ - M5Stack Cloud
    Wͷը໘දࣔ

    View Slide

  44. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ - MicroPython
    1.ϑΝʔϜ΢ΣΞΛ.4UBDLʹॻ͖ࠐΉ
    • IUUQTHJUIVCDPNNTUBDL.$MPVEUSFFNBTUFSpSNXBSFT0''-*/&
    2.1ZUIPOϑΝΠϧΛ.4UBDLʹॻ͖ࠐΉ

    View Slide

  45. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ - MicroPython
    1ZUIPOϑΝΠϧͷసૹʹBEBGSVJUBNQZΛ࢖͏
    ‣ IUUQTHJUIVCDPNBEBGSVJUBNQZ
    $ pip install adafruit-ampy

    View Slide

  46. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ - MicroPython
    Usage: ampy [OPTIONS] COMMAND [ARGS]...
    ampy - Adafruit MicroPython Tool
    Ampy is a tool to control MicroPython boards over a serial connection.
    Using ampy you can manipulate files on the board's internal filesystem and
    even run scripts.
    Options:
    -p, --port PORT Name of serial port for connected board. [required]
    -b, --baud BAUD Baud rate for the serial connection. (default 115200)
    --help Show this message and exit.
    Commands:
    get Retrieve a file from the board.
    ls List contents of a directory on the board.
    put Put a file on the board.
    rm Remove a file from the board.
    run Run a script and print its output.

    View Slide

  47. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ - MicroPython
    ؀ڥม਺".1:@1035Λࢦఆ͓ͯ͘͠ͱָ
    $ ampy -p /dev/tty.SLAB_USBtoUART ls

    View Slide

  48. ։ൃ؀ڥ
    M5Stackͷ։ൃ؀ڥ - MicroPython
    $ sudo cu -s 115200 -l /dev/tty.SLAB_USBtoUART
    Connected.
    >>> from m5stack import lcd
    >>> lcd.print('Python!')
    >>>
    ΋ͪΖΜ3&1-΋࢖͑·͢
    .4UBDLΛ64#έʔϒϧͰ઀ଓͯ͠ɺ

    View Slide

  49. ϓϩάϥϛϯά
    M5Stack

    View Slide

  50. M5Stackϓϩάϥϛϯά
    ඞཁͳϑΝΠϧͱىಈॱ
    1.CPPUQZ
    2.NBJOQZ
    .JDSP1ZUIPOͷυΩϡϝϯτͰ͸ɺ
    ‣ CPPUQZˠʢ64#DPOpHVSBUJPOʣˠNBJOQZ
    ‣ ʮNJDSP4%͕ͬͯ͞͞Δ࣌͸ɺqBTIͱTEͲͪΒ͔Βىಈ
    ͢Δ͔બ΂Δˠબ΂ͳͦ͞͏

    View Slide

  51. M5Stackϓϩάϥϛϯά
    boot.py ͱ main.py ͷ࢖͍෼͚ྫ
    ‣ CPPUQZ
    ‣ ॳظԽ΍ಈ࡞ঢ়گΛ੔͑Δॲཧ
    ‣ 8J'Jͷ઀ଓ
    ‣ /51
    ‣ NBJOQZ
    ‣ ओཁಈ࡞

    View Slide

  52. M5Stackϓϩάϥϛϯά
    boot.py ͱ main.py ͷ࢖͍෼͚ྫ
    ॱ൪͚֮ͩ͑ͯΕ͹͋Μ·Γؾ
    ʹ͠ͳ͍͍ͯ͘ͱ͓΋͍·͢

    View Slide

  53. M5Stackϓϩάϥϛϯά
    M5Cloud/examples/DigitalClock/

    View Slide

  54. M5Stackϓϩάϥϛϯά
    M5Cloud/examples/DigitalClock/

    View Slide

  55. M5Stackϓϩάϥϛϯά
    M5Cloud/examples/DigitalClock/clock.py
    from m5stack import *
    import time, _thread, machine
    def clock():
    rtc = machine.RTC()
    print("Synchronize time from NTP server ...")
    lcd.println("Synchronize time from NTP server ...")
    rtc.ntp_sync(server="cn.ntp.org.cn")
    lcd.clear()
    lcd.setBrightness(200)
    lcd.font(lcd.FONT_7seg, fixedwidth=True, dist=16, width=2)
    while True:
    d = time.strftime("%Y-%m-%d", time.localtime())
    t = time.strftime("%H:%M:%S", time.localtime())
    lcd.print(d, lcd.CENTER, 50, lcd.ORANGE)
    lcd.print(t, lcd.CENTER, 130, lcd.ORANGE)
    time.sleep(1)
    _thread.start_new_thread('Clock', clock, ())

    View Slide

  56. M5Stackϓϩάϥϛϯά
    M5Cloud/examples/DigitalClock/main.py
    from m5stack import *
    import clock

    View Slide

  57. M5Stackϓϩάϥϛϯά
    Wi-Fi ʹ઀ଓ͢Δ
    ‣ ઀ଓˠCPPUQZ
    ‣ ֬ೝ
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, pwd)
    if wlan.isconnected():

    View Slide

  58. M5Stackϓϩάϥϛϯά
    Wi-Fi AP ΛεΩϟϯ
    ‣ εΩϟϯྫ

    >>> import network
    >>> wlan = network.WLAN(network.STA_IF)
    >>> for ap in wlan.scan():
    ... print(ap)
    ...
    (b'ssid', b’\x10101010', 4, -84, 4, 'WPA_WPA2_PSK', False)

    View Slide

  59. M5Stackϓϩάϥϛϯά
    time(utime)Ϟδϡʔϧ
    >>> import time
    >>> time.localtime()
    (2018, 5, 12, 21, 36, 42, 7, 132)
    >>> time.gmtime()
    (2018, 5, 12, 13, 36, 47, 7, 132)
    >>> time.strftime("%Y-%m-%d %H:%M:%S%z")
    '2018-05-12 13:37:13+0800’
    >>> time.strftime("%Y-%m-%d %H:%M:%S%z", time.gmtime())
    '2018-05-12 13:37:21+0000’
    >>> time.strftime("%Y-%m-%d %H:%M:%S%z", time.localtime())
    '2018-05-12 21:37:25+0000'

    View Slide

  60. λΠϜκʔϯΛࢦఆ
    M5Stackϓϩάϥϛϯά
    NTP
    rtc.ntp_sync("ntp.nict.jp", tz='JST-9')

    View Slide

  61. +45Ͱऔಘ
    M5Stackϓϩάϥϛϯά
    NTP
    >>> import time
    >>> time.localtime()
    (2018, 5, 12, 23, 8, 31, 7, 132)
    >>> time.gmtime()
    (2018, 5, 12, 14, 8, 36, 7, 132)
    >>> time.strftime('%Y-%m-%d %H:%M:%S%z')
    '2018-05-12 14:08:50+0900'
    >>> time.strftime('%Y-%m-%d %H:%M:%S%z', time.gmtime())
    '2018-05-12 14:08:57+0000'
    >>> time.strftime('%Y-%m-%d %H:%M:%S%z', time.localtime())
    '2018-05-12 23:09:01+0000'

    View Slide

  62. M5Stackϓϩάϥϛϯά
    HTTP ΫϥΠΞϯτ

    View Slide

  63. M5Stackϓϩάϥϛϯά
    HTTP ΫϥΠΞϯτ
    ▸ VSFRVFTUT
    ▸ IUUQTHJUIVCDPNNJDSPQZUIPONJDSPQZUIPOMJC
    USFFNBTUFSVSFRVFTUT
    ▸ $1ZUIPOͷSFRVFTUTʹࣅͤͨ"1*ʢۃҰ෦ʣ

    View Slide

  64. M5Stackϓϩάϥϛϯά
    HTTP ΫϥΠΞϯτ - urequests
    ‣ (&5
    >>> res = urequests.get('https://unkobtn.com/')
    >>> print(res.status_code)
    200

    View Slide

  65. M5Stackϓϩάϥϛϯά
    HTTP ΫϥΠΞϯτ - urequests
    ‣ 1045
    URL = ‘https://maker.ifttt.com/trigger/ev/with/key/..’
    r = urequests.post(URL,
    json={'value1': 'M5Stack'},
    headers={'Content-Type': 'application/json'},
    )
    lcd.println(r.text)

    View Slide

  66. M5Stackϓϩάϥϛϯά
    HTTP ΫϥΠΞϯτ - urequests
    ▸ αʔόʔূ໌ॻΛݕূ͠ͳ͍

    View Slide

  67. M5Stackϓϩάϥϛϯά
    HTTP ΫϥΠΞϯτ - urequests
    ‣ $1ZUIPOͷSFRVFTUTͷ৔߹
    >>> requests.get('https://192.168.11.6:4433/hello')
    Traceback (most recent call last):
    ...
    requests.exceptions.SSLError:
    HTTPSConnectionPool(host='localhost', port=4433):
    Max retries exceeded with url: /hello (Caused by
    SSLError(SSLError(1, '[SSL: CER
    TIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:
    777)'),))

    View Slide

  68. M5Stackϓϩάϥϛϯά
    HTTP ΫϥΠΞϯτ - urequests
    ‣ $1ZUIPOͷSFRVFTUTͰWFSJGZ'BMTFΛࢦఆͨ͠৔߹
    >>> requests.get('https://192.168.11.6:4433/hello',
    verify=False)
    /Users/mitszo/.virtualenvs/py3w/lib/python3.6/site-
    packages/urllib3/connectionpo
    ol.py:858: InsecureRequestWarning: Unverified HTTPS request
    is being made. Addin
    g certificate verification is strongly advised. See:
    https://urllib3.readthedocs
    .io/en/latest/advanced-usage.html#ssl-warnings
    InsecureRequestWarning)

    View Slide

  69. M5Stackϓϩάϥϛϯά
    HTTP ΫϥΠΞϯτ - urequests
    ‣ .JDSP1ZUIPOͷ৔߹
    >>> import urequests
    >>> urequests.get('https://192.168.11.6:4433/hello')

    >>> _.text
    'Hello!\n'

    View Slide

  70. M5Stackϓϩάϥϛϯά
    HTTP ΫϥΠΞϯτ - urequests
    ‣ ࢀߟ"SEVJOP*%&ͷ৔߹ʢূ໌ॻͷࢦఆ͕ඞཁʣ
    const char* root_ca = \
    "-----BEGIN CERTIFICATE-----\n"
    “MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMA...”
    void PostMessage() {
    http.begin(URL, root_ca);
    http.addHeader("Content-Type", "application/json;
    charset=utf-8");
    String reqBody = "{\"value1\": \"M5Stack\"}";
    int status_code = http.POST(reqBody);
    String body = http.getString()
    ...

    View Slide

  71. M5Stackϓϩάϥϛϯά
    Թ࣪౓ɾؾѹηϯαʔΛ࢖͏
    ▸ .4UBDLͰηϯαʔσʔλʔΛ
    "NCJFOUʹૹΔ .JDSP1ZUIPOฤ

    ▸ #.&౥ࡌɹԹ࣪౓ɾؾѹ
    ηϯαϞδϡʔϧ

    View Slide

  72. M5Stackϓϩάϥϛϯά
    Թ࣪౓ɾؾѹηϯαʔΛ࢖͏
    def main():
    ntpsync()
    i2c = I2C(scl=Pin(22), sda=Pin(21))
    bme = bme280.BME280(i2c=i2c)
    while True:
    lcd.font(lcd.FONT_DejaVu18)
    lcd.text(30, 30, utime.strftime(
    ‘%Y-%m-%d %H:%M:%S', utime.localtime()))
    lcd.font(lcd.FONT_DejaVu24)
    values = bme.values
    lcd.print(values[0], lcd.RIGHT, 80)
    lcd.print(values[1], lcd.RIGHT, 110)
    lcd.print(values[2], lcd.RIGHT, 140)
    utime.sleep(1)

    View Slide

  73. M5Stackϓϩάϥϛϯά
    λΠϜΧʔυελϯύʔ
    ▸ 8J'J઀ଓ
    ▸ /51ಉظ
    ▸ ࣌ܭදࣔ
    ▸ Ϙλϯԡͨ͠Β1045
    ▸ ௚ۙͷσʔλΛ(&5ͯ͠දࣔ

    View Slide

  74. ςΩετ
    M5Stack ϢʔβʔͷΈͳ͞Μ
    https://m5stack.connpass.com/event/84221/

    View Slide

  75. ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide