2021年7月11日日曜日

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_temp

cd ./m5stickc_temp

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('/temp', methods=["POST"])
def m5stick_temp():
    temp = float(request.json['temp'])
    print("temp:{}".format((temp)))
    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 math
import urequests
import ujson
import network

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

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


# Wifiの初期化
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())

connect_wifi()

# ADC初期化
pin33 = machine.ADC(machine.Pin(33))
pin33.atten(machine.ADC.ATTN_11DB)
pin33.width(machine.ADC.WIDTH_10BIT)

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

    # 温度センサー測定
    # 5V=1023 -> 3.6V=1023
    value = pin33.read()*(3.6/5.0)
    # refer to https://wiki.seeedstudio.com/Grove-Temperature_Sensor_V1.2/
    r = 100000.0 * (1023.0 / value - 1.0)
    temperature = 1.0 / (math.log10(r / 100000.0) / 4275.0 + 1 / 298.15) - 273.15
    # REST APIに通知
    data = ujson.dumps({"temp":str(temperature)})
    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 件のコメント:

コメントを投稿