2021年6月20日日曜日

M5StickCとGrove光センサーで、明るさのデータをREST API経由で送信する

M5StickCとGrove光センサーで、明るさのデータをREST API経由で送信するには、以下の手順を実行します。
構成としてはM5StickCに接続したGrove光センサーで明るさを取得します。M5StickCからWiFi経由でPC側のFlaskのRESTサービスにアクセスしデータを送信します。

〇M5StickCとGrove光センサーを接続した写真

開発手順

1. PC側:pipenvのインストール
sudo apt-get -y install python3-pip python3-distutils python3-dev python3-testresources

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. PC側:flaskのインストール
以下のコマンドで、flaskをインストールした仮想環境を作成します。
mkdir -p ./m5stickc_lightness

cd ./m5stickc_lightness

pipenv --python 3

pipenv install flask

pipenv shell

3. PC側:REST APIでデータを受け取り、データを表示するFlaskアプリケーションの構築 以下のコードをapp.pyとして保存します。

app.py
from flask import Flask, jsonify, request
import time

app = Flask(__name__)

@app.route('/lightness', methods=["POST"])
def m5stick_lighetness():
    lightness = int(request.json['lightness'])
    print("lightness:{}".format((lightness)))
    return {"status":"ok"}

app.run(debug=True, host='0.0.0.0', port=5010, threaded=True)

4. PC側:実行
Flaskを実行するには、以下のコマンドを実行します。
python app.py
※Ctrl+Cで停止します

4. M5StickC側:M5StickC上にlibフォルダを作成しurequestsモジュールをアップロード
以下のページのRAWボタン上で右クリックメニューから「名前を付けてリンク先を保存」を選択して、ダウンロードします。
https://github.com/micropython/micropython-lib/blob/master/python-ecosys/urequests/urequests.py

/libフォルダがない場合はThonnyのファイルペインのデバイスから右クリックしてNew directory...を選択して、フォルダ名libを入力して作成します。次にlibフォルダに移動後、PC側のrequests.py上で右クリックメニューからUpload to /libを選択します。

5. M5StickC側:以下のコードのWiFiのSSID/パスワード/REST APIの接続先を設定して、main.pyとして保存します。実行後、2秒おきにPC側に光センサーの値が表示されることを確認します。

import machine
import time
import urequests
import ujson
import network

# WiFiのssid
ssid = "WiFiのSSID"
# WiFiのパスワード
password = "WiFiのパスワード"

# REST APIの接続先
url = "http://192.168.1.xxx:5010/lightness"
header = {'Content-Type':'application/json'}


def connect_wifi():
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print("connecting to network...")
        sta_if.active(True)
        sta_if.connect(ssid, password)
        while not sta_if.isconnected():
            pass
    print("network config:", sta_if.ifconfig())

# Grove光センサーの初期化
pin33 = machine.ADC(machine.Pin(33))
pin33.atten(machine.ADC.ATTN_11DB)

time.sleep(1)
while True:
    # WiFi接続
    connect_wifi()

    # 光センサー測定
    lightness = pin33.read()

    # REST APIに通知
    data = ujson.dumps({"lightness":str(lightness)})
    try:
        resp = urequests.post(url, data=data.encode("utf-8"), headers = header)
        print(resp.json())
        resp.close()
    except OSError as err:
        print(err)
        print("----")
    
    time.sleep(2)
    # deepsleep
    #machine.deepsleep(60*60*1000) # 3600sec=1時間

関連情報

・使用したMicroPython firmware: esp32-20210418-v1.15.bin
https://micropython.org/download/esp32/

ADC (アナログ/デジタル変換)
※MicroPythonのDocumentation

Groveデバイスまとめ

0 件のコメント:

コメントを投稿