2021年6月20日日曜日

ESP32-DevkitCとDHT11で計測した温度・湿度をWiFi経由のREST APIで通知する

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

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

開発手順

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_dht11

cd ~/flask_dht11

pipenv --python 3

pipenv install flask

pipenv shell

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

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

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

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

flask run -h 0.0.0.0

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

5. ESP32-DevkitC側:DHT11の準備
以下のようなDHT11温湿度モジュールを準備します。

・DHT11温湿度モジュール(Temperature and Humidity Sensor)
https://akizukidenshi.com/catalog/g/gM-07040/

6. ESP32-DevkitC側:ESP32-DevkitCとDHT11の配線
ESP32-DevkitCとDHT11センサーモジュールを配線します
DHT11のDigitalピン(付属ケーブルの緑) -> ESP32-DevKitCのIO32ピン(USBを手前・ピン足を下にした時、左上から7番目のピン)
DHT11のGND(付属ケーブルの黒) -> ESP32-DevKitCのGNDピン(USBを手前・ピン足を下にした時、右上のピン)
DHT11のV(付属ケーブルの赤) -> ESP32-DevKitCの3V3ピン(USBを手前・ピン足を下にした時、左上のピン)

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

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

9. ESP32-DevkitC側:プログラミングと実行
以下のコードのssid/パスワード/URLを設定してmain.pyとしてESP32-DevkitCに保存します。実行後、温度と湿度がPC側に2秒おきに表示されることを確認します。
import dht
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/dht11"
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())


# DHT11初期化
dht11 = dht.DHT11(machine.Pin(32))
time.sleep(1)
while True:
    # WiFi接続
    connect_wifi()

    # 測定
    dht11.measure()
    temp = dht11.temperature()
    humidity = dht11.humidity()

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

0 件のコメント:

コメントを投稿