2021年6月22日火曜日

ESP32-DevkitCとBME680で計測した温度・湿度・気圧・ガスセンサー値をWiFi経由のREST APIで通知する

ESP32-DevkitCとBME680で計測した温度・湿度・気圧・ガスセンサー値をWiFi経由のREST APIで通知するには、以下の手順を実行します。今回は、ESP32-DevkitCで計測した温度・湿度・気圧・ガスセンサー値の情報をRESTで送信しPC側のFlaskで受信します。

〇ESP32-DevkitCとBME680を接続した写真

開発手順

1. PC側:pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

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

source ~/.bashrc

2. PC側:flaskがインストールされた仮想環境の作成
pipenvを使用する場合は以下のコマンドで、flask用の仮想環境を作成します。
mkdir -p ~/flask_bme680

cd ~/flask_bme680

pipenv --python 3

pipenv install flask

pipenv shell

3. PC側:Flask REST APIアプリケーションの作成
/bme680にPOSTされた温度・湿度・気圧・ガスセンサー値データを取得して表示し、再びJSONで返すコードを実装します。

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/bme680', methods=["POST"])
def receive_bme680_values():
    print(request.get_data())
    temp = request.json['temp']
    humidity = request.json['humidity']
    pressure = request.json['pressure']
    gas = request.json['gas']
    print("temp: {}C".format(temp))
    print("humidity: {}".format(humidity))
    print("pressure: {}".format(pressure))
    print("gas: {}".format(gas))
    return {"temp":str(temp), "humidity":str(humidity), "pressure":str(pressure), "gas":str(gas)}

4. PC側:Flast REST APIアプリケーションの実行
Flaskを実行するには、以下のコマンドを実行します。
export FLASK_APP=app.py

flask run -h 0.0.0.0

実行時に表示されるURLを控えておきます。

5. ESP32-DevkitC側:BME680の準備
BME680は秋月電子さんの「BME680使用 温湿度・気圧・ガスセンサモジュールキット」を使用しました。
https://akizukidenshi.com/catalog/g/gK-14469/

6. ESP32-DevkitC側:ESP32-DevkitCとBME680の配線
ESP32-DevkitCとBME680センサーモジュールを配線します
ESP32-DevkitCの3V3ピン(USBを手前・ピン足を下にした時、左上のピン) -> BME680のVIN
ESP32-DevkitCのIO21ピン(USBを手前・ピン足を下にした時、右上から6番目のピン) -> BME680のSDA
ESP32-DevkitCのIO22ピン(USBを手前・ピン足を下にした時、右上から3番目のピン) -> BME680のSCL
ESP32-DevkitCのGNDピン(USBを手前・ピン足を下にした時、右上のピン) -> BME680のGND

7. ESP32-DevkitC側:ESP32-DevkitCにMicroPythonの導入
PCにインストールしたThonnyなのでMicroPythonファームウェアを書き込みます。
MicroPythonファームウェアは以下のページから「esp32-20210418-v1.15.bin」をダウンロードしておきます。
https://micropython.org/download/esp32/

8. ESP32-DevkitC側:urequests/bme680モジュールのアップロード
以下のページからダウンロードした(RAWボタンでリンク先を保存)urequests.py/bme680.pyをESP32-DevkitCの/libフォルダに配置します(/libフォルダが無い場合はThonnyなどで作成します)
https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py

https://github.com/robert-hh/BME680-Micropython/blob/master/bme680.py

9. ESP32-DevkitC側:プログラミングと実行
以下のコードのssid/パスワード/URLを設定してmain.pyとしてESP32-DevkitCに保存します。実行後、温度と湿度がPC側に2秒おきに表示されることを確認します。
from bme680 import *
import machine 
import time
import urequests
import ujson
import network

# WiFiのssid
ssid = "xxx"
# WiFiのパスワード
password = "xxx"
# REST APIの接続先
url = "http://xxx.xxx.xxx.xxx:5000/bme680"
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())


# BME680初期化
i2c=machine.I2C(0, scl=machine.Pin(22), sda=machine.Pin(21))
#print(i2c.scan())
bme = BME680_I2C(i2c)
time.sleep(1)
while True:
    # WiFi接続
    connect_wifi()

    # 測定&REST APIに通知
    data = ujson.dumps({"temp":str(bme.temperature), "humidity":str(bme.humidity), "pressure":str(bme.pressure), "gas":str(bme.gas)})
    resp = urequests.post(url, data=data.encode("utf-8"), headers = header)
    print(resp.json())
    resp.close()
    
    # deepsleep
    machine.deepsleep(2000)

0 件のコメント:

コメントを投稿