LoginSignup
2
1

More than 3 years have passed since last update.

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

Posted at

はじめに

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

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

d004.PNG

開発環境

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

  • ホスト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

結果

d004.PNG

メモリの問題

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

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

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

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

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

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

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

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

import gc

gc.collect()

C言語で実装する

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

デバイスを変更する

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

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1