ラベル BME680 の投稿を表示しています。 すべての投稿を表示
ラベル BME680 の投稿を表示しています。 すべての投稿を表示

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)

2021年6月13日日曜日

Raspberry Pi PicoでBME680センサーを使用して温度・湿度・気圧・ガスの値を取得する

Raspberry Pi PicoでBME680センサーを使用して温度・湿度・気圧・ガスの値を取得するには、以下の手順を実行します。

〇Raspberry Pi PicoとBME680センサーを接続した写真

作成手順

1. 部品の用意
以下の部品を用意します。

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

2. Raspberry Pi PicoとBME680センサーモジュールを配線します
BME680のVINピン -> Raspberry Pi Picoの3.3Vピン
BME680のSCLピン -> Raspberry Pi PicoのGP1番ピン
BME680のSDAピン -> Raspberry Pi PicoのGP0番ピン
BME680のGNDピン -> Raspberry Pi PicoのGNDピン

3. MicroPython用「bme680」モジュールの導入
Thonnyを利用する場合、bme680モジュールのインストールは以下の手順を実行します。

3-1.MicroPython用のbme680モジュールのダウンロード
robert-hhさんが公開している以下のページからCode -> Download ZIPを選択して、モジュールのソースコードをダウンロードします。
ZIPファイルをダウンロード後、解凍しておきます。
https://github.com/robert-hh/BME680-Micropython

3-2.bme680.pyのアップロード
Thonnyの「表示」メニューから→「ファイル」を選択します。Rapberry Pi Pico側に/libフォルダがなければ、ペイン下側のフォルダで右クリックメニューから[ New Directory...」を選択し、フォルダ名を入力して/libフォルダを作成します。

フォルダ作成ダイアログ

3.3.ローカルPCのフォルダ内のPythonモジュールをアップロード
Raspberry Pi Pico側の/libフォルダに移動後(左側ペインの下のlibフォルダをダブルクリックで移動)、ローカルPCのフォルダにあるbme680.pyで右クリックメニューから「upload to /lib」を選択してモジュールのライブラリをアップロードします。

4. プログラミングとプログラムのアップロード
以下のプログラムをmain.pyとしてRaspberry Pi Picoに保存して、実行します。実行後3秒おきに温度・湿度・気圧・ガスの値を取得できることを確認します。
main.py
from bme680 import *
from machine import I2C, Pin
import time
scl = Pin(1)
sda = Pin(0)
bme = BME680_I2C(I2C(0, scl=scl, sda=sda))

while True:
    print("Temp:{}, Humidity:{}, Pressure:{}, Gas:{}".format(bme.temperature, bme.humidity, bme.pressure, bme.gas))
    time.sleep(3)

2021年3月20日土曜日

Raspberry Pi ZeroとBME680センサーで、温度・気圧・湿度・ガスの情報を返すREST APIを作成する

Raspberry Pi ZeroとBME680センサーで、温度・気圧・湿度・ガスの情報を返すREST APIを作成するには、以下の手順を実行します。

※Raspberry Pi ZeroとBME680の接続は「Raspberry Pi ZeroにBME680を接続して、温度・気圧・湿度・ガスの値を取得する」を参照してください。

開発手順

1. 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. bme680モジュールとflaskがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、bme680とflask用の仮想環境を作成します。
mkdir -p ~/bme680_flask

cd ~/bme680_flask

pipenv --python 3

pipenv install bme680 flask smbus

pipenv shell

3. Flask REST APIアプリケーションの作成
/bme680にアクセスされたとき、温度・気圧・湿度・ガスの情報を取得してJSONで返すコードを実装します。

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

try:
    sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY)
except IOError:
    sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY)

sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)
sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_filter(bme680.FILTER_SIZE_3)
sensor.set_gas_status(bme680.ENABLE_GAS_MEAS)

sensor.set_gas_heater_temperature(320)
sensor.set_gas_heater_duration(150)
sensor.select_gas_heater_profile(0)

app = Flask(__name__)

@app.route('/bme680')
def get_bme680():
  data = {}
  while True:
    if sensor.get_sensor_data():
      if sensor.data.gas_resistance:
        data = {"temperature":sensor.data.temperature, "pressure":sensor.data.pressure, "humidity":sensor.data.humidity, "gas":sensor.data.gas_resistance}
      break
  return jsonify(data)

4. 実行
Flaskを実行するには、以下のコマンドを実行します。
export FLASK_APP=app.py

flask run -h 0.0.0.0

次に、ブラウザから以下のアドレスにアクセスして、温度・気圧・湿度・ガスの情報をjsonで返すことを確認します。
http://<Raspberry Piのホスト名またはIPアドレス>:5000/bme680

関連情報

・bme680-pythonのgithubリポジトリ
https://github.com/pimoroni/bme680-python

2021年3月19日金曜日

Raspberry Pi Zeroに接続したBME680センサーのデータをPostgreSQLに保存する

BME680で取得したの温度・気圧・湿度・ガスのデータをPostgreSQLに保存するには以下の手順を実行します。
Raspberry Pi ZeroとBME680の接続は「Raspberry Pi ZeroにBME680を接続して、温度・気圧・湿度・ガスの値を取得する」を参照してください。

実行手順

1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。

create table test_sensor
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  temperature float,
  atmospheric_pressure float,
  humidity float,
  gas float,
  constraint pk_test_sensor primary key (device_name, data_ts)
);

2. 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

3. bme680とpsycopg2モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、bme680用の仮想環境を作成します。
sudo apt-get -y install libpq-dev

mkdir -p ~/bme680_pg

cd ~/bme680_pg

pipenv --python 3

pipenv install bme680 psycopg2-binary smbus

pipenv shell

4. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_bme680.py
import os
import psycopg2
import psycopg2.extras
import bme680

try:
    sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY)
except IOError:
    sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY)

sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)
sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_filter(bme680.FILTER_SIZE_3)
sensor.set_gas_status(bme680.ENABLE_GAS_MEAS)

sensor.set_gas_heater_temperature(320)
sensor.set_gas_heater_duration(150)
sensor.select_gas_heater_profile(0)

while True:
  if sensor.get_sensor_data():
    print("temperature:{0:.2f}".format(sensor.data.temperature))
    print("atmospheric_pressure:{0:.2f}".format(sensor.data.pressure))
    print("humidity:{0:.3f}".format(sensor.data.humidity))

    if sensor.data.gas_resistance:
      print("gas: {} Ohms".format(sensor.data.gas_resistance))

      device_name = 'test device'
      sql = """insert into test_sensor values (%s, current_timestamp, %s, %s, %s, %s)"""

      conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
      with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
        cur.execute(sql , (device_name, sensor.data.temperature, sensor.data.pressure, sensor.data.humidity, sensor.data.gas_resistance))
      conn.commit()
      break

5. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_bme860.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python record_bme680.py

関連情報

・bme680-pythonのgithubリポジトリ
https://github.com/pimoroni/bme680-python

2021年3月18日木曜日

Raspberry Pi ZeroにBME680を接続して、温度・気圧・湿度・ガスの値を取得する

Raspberry Pi ZeroにBME680を接続して、温度・気圧・湿度・ガスの値を取得するには、以下の手順を実行します。
BME680は秋月電子さんの「BME680使用 温湿度・気圧・ガスセンサモジュールキット」を使用しました。
https://akizukidenshi.com/catalog/g/gK-14469/

セットアップ手順

1. I2Cの有効化
1.1.raspi-configを実行して、I2Cを有効化します。
sudo raspi-config

1.2.上下キーで3 Interface Optionsに移動して、リターンキーを押します

1.3.上下キーでP5 I2Cに移動して、リターンキーを押します

1.4.左右キーでYesに移動して、リターンキーを押します

1.5.リターンキーを押します

1.6.Tabキーを1回押してから、左右キーで「Finish」に移動して、リターンキーを押します

2. 配線
一度でシャットダウンしてから、Raspberry Pi ZeroとBME680を接続します

SDカードスロット上にして下図ピンを参考に、以下の様に接続します
Raspberry Pi 3.3Vピン(ピン1) -> BME680のVIN
Raspberry Pi GPIO 2/SDAピン(ピン3) -> BME680のSDA
Raspberry Pi GPIO 3/SCLピン(ピン5) -> BME680のSCL
Raspberry Pi Groundピン(ピン9) -> BME680のGND

3. 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

4. bme680用の仮想環境作成
pipenvを使用する場合は以下のコマンドで、bme680用の仮想環境を作成します。
mkdir -p ~/bme680

cd ~/bme680

pipenv --python 3

pipenv install bme680 smbus

pipenv shell

5. サンプルの実行
wget https://github.com/pimoroni/bme680-python/raw/master/examples/read-all.py

python read-all.py
実行すると、温度・気圧・湿度・ガスの値が表示されます。Ctrl+Cで終了します。

関連情報

・BME680センサーのデータをデータベースに記録したい場合は、以下の記事を参照してください。
Raspberry Pi Zeroに接続したBME680センサーのデータをPostgreSQLに保存する

・BME680センサーのデータをREST APIで提供したい場合は、以下の記事を参照してください。
Raspberry Pi ZeroとBME680センサーで、温度・気圧・湿度・ガスの情報を返すREST APIを作成する

・bme680-pythonのgithubリポジトリ
https://github.com/pimoroni/bme680-python

・写真のRaspberry Piのケースは3Dプリンタで作成しました。
OpenSCADとUltimaker Curaを使用してRaspberry Pi Zero WHのケースを作成する