ESP32 - MicroPythonを使い、Discord-Webhooksへのリクエスト


はじめに

ESP32 - MicroPythonを使い、Discord-Webhooksへのリクエスト方法について記載します。

※Discordの紹介や設定手順は割愛します。

開発環境

以下が確認した環境となります。

  • ホストPC
    • windows10 64bit Home
    • VSCode - 1.48.0
      • Pymakr 1.1.5
    • NodeJS - 12.14.1 LTS
  • ターゲット
    • MicroPython v1.12 on 2019-12-20; ESP32 module with ESP32

※MicroPythonの環境構築は、「ESP32-VSCode-microPythonでの開発環境の構築」を参照願います。

機材

項目 型名 備考
ESP32-WROOM-32 開発ボード [NodeMCU-32S ESP32-WROOM-32]

コード

動作確認したコードは以下となります。

コード 説明 備考
SSID アクセスポイントのSSID -
PASS アクセスポイントのパスワード -
URL  Discord - webhook URL -
discord.py
import network
import time
import urequests as requests

# AP
SSID = "XXXXXXXXXXXXX"
PASS = "YYYYYYYYYYYYY"

# discord webhook url
URL = "https://discord.com/api/webhooks/aaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"

def do_connect():

    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect(SSID, PASS)
        while not wlan.isconnected():
            time.sleep(1)
    print('network config:', wlan.ifconfig())

    return


def main():
    do_connect()
    payload = """content=This message is sent by "ESP32"."""
    response = requests.post(URL, headers={"Content-Type": "application/x-www-form-urlencoded"}, data=payload)
    response.close()


main()

実行方法

>>> import discord

結果

メモリの問題

上記のコード自体は動作しますが、
いろんな機能を入れていくと、OSエラー(MemoryError)が発生します。

HTTPS通信が必要なため、ここにメモリを多く使用するようです。
いろいろと試してみましたが、以下の方法で回避できるかなと思われます。

  • シングルスレッドで作成する
  • 能動的にガベレージコレクションを実施する
  • C言語で実装する
  • デバイスを変更する

シングルスレッドで作成する

各処理をスレッドにするだけでも、メモリをかなり消費します。
また、MicroPythonでは、Queueなどを使うことはできません。
仮に、socket通信でスレッド間の通信を行うとこれもメモリを使います。
全処理をメインループで行うように作ってあげた方がよさそうです。

能動的にガベレージコレクションを実施する

MicroPythonのガベレージコレクションが走る条件は、メモリの空きがある一定値より小さくなった場合です。
※空き容量は設定はできます。

HTTPS通信で、大きなメモリ取得が発生するため、その直前で能動的にガベレージコレクションを実施するほうが無難です。
以下のコードで実施することができます。

import gc

gc.collect()

C言語で実装する

MicroPythonはファイルを読んで実行しているため、フリーズコードにしない限り、メモリ的には不利です。
C言語であれば、もうすこしメモリを抑えれる気がします。
以前、同じデバイスで、FreeRTOSで今回のようなコードを書いたことがありますが、
特に問題は起きなかったと記憶しています。

デバイスを変更する

そもそも512KByte上で、実施することに問題があります。
ESP32-WROVERシリーズであれば、4MByteのRAMがあります。
手軽ですが、値段が上がってしまうため悩ましいところです。

参考