2021/09/10
その1でWEBサーバとDBの準備をしました。本編では、Raspberry Pi Zero Wに物理的にセンサーを取り付ける作業、センサーから値を読み取る設定、読み取った値をサーバにアップロードする設定を行います。
- 温度・湿度・気圧をBME280/Raspberry Pi/Azureで可視化 その1(AzureにWEBサーバとDBの準備編)
- 温度・湿度・気圧をBME280/Raspberry Pi/Azureで可視化 その2(Raspberry Pi Zero WにBME280取り付け・データ送信編) ←本稿
- 温度・湿度・気圧をBME280/Raspberry Pi/Azureで可視化 その3(チャート描画編)
Raspberry Pi Zero WとBME280の接続
利用したハードウェアとOSは以下の通りです。
ハードウェア | Raspberry Pi Zero W |
---|---|
OS | Raspbian Buster with desktop:September 2019 |
作業を進める前提として、OSセットアップ、GPIOピンヘッダ取り付け、SSHでログインできる環境が完了している必要があります。
BME280センサーはYahooショッピングで1000円位でした。
ジャンパピンを下記のように結線します。
センサーを接続した状態。
Raspberry Pi Zero W側が何のピンか、gpio readallコマンドで確認できます。
I2Cの有効化
Raspberry Pi Zero Wの通信方式I2Cを有効化します。
$ sudo raspi-config
5 Interfacing Optionsを選択します。
P5 I2Cを選択します。
YESを選択します。
OKを選択します。
Finishを選択します。
続いて、必要なツールをインストールします。
$ sudo apt-get install i2c-tools
センサーの値を取得する
利用アドレスを確認します。0x76であることが分かります。SOD端子をGNDに接続する場合0x76になり、電源に接続する場合0x77になるそうです。
$ sudo i2cdetect -y 1
スイッチサイエンスのWEBサイトから、BME280のサンプルプログラム[bme280_sample.py]をダウンロードします。ログインユーザーのルートディレクトリにBME280というディレクトリを作成しダウンロードしました。
$ wget https://raw.githubusercontent.com/SWITCHSCIENCE/BME280/master/Python27/bme280_sample.py
ダウンロードしたプログラムを実行してみます。アドレスが0x76の場合、サンプルプログラムはそのままで動きます。0x77の場合は、ダウンロードしたサンプルプログラムのI2Cアドレス部分を変更する必要があります。
$ sudo python bme280_sample.py
モジュールが足りないとエラーが出てしまったので、追加します。
$ sudo pip install smbus2
再度サンプルプログラムを実行してみます。今度はちゃんと出力されました。温度(℃)、気圧(hPa)、湿度(%)の順です。
$ sudo python bme280_sample.py
送信プログラムの設定
センサーの値を取得できたので、次にサーバにアップロードする設定をします。
スイッチサイエンスのサンプルプログラムでは、センサーの値を画面表示するだけです。このサンプルプログラムを改良し、取得したデータを変数に格納し、他のプログラムからカンマ区切りで呼び出せるプログラムを公開しているサイトがありましたので、利用させていただきました。
ページ中盤にある[bme280_custom.py]というプログラムです。またプログラムの実装にあたって、下記ページを参考にさせていただきました。
プログラムを保存しているディレクトリBME280に、上記紹介ページで公開されている[bme280_custom.py]を保存します。同じディレクトリへ、下記コードの[bme280.py]作成します。[bme280_custom.py]をインポートし、センサーで取得したデータをWEBにPOSTするプログラムです。
#coding: utf-8
import bme280_custom
import requests
import json
from datetime import datetime
def valuepost(temp, hum, press):
url = 'https://●●●.azurewebsites.net/sensortest/sensordatapost.php'
sensorsdata = {'datetime':datetime.now().strftime("%Y/%m/%d %H:%M:%S"),'temp':temp,'hum':hum,'press':press}
print json.dumps(sensorsdata)
headers = {'content-type': 'application/json'}
res = requests.post(url, data=json.dumps(sensorsdata), headers=headers, verify=False)
print res.json()
pass
csv = bme280_custom.readData()
list = csv.split(",")
press = list[0]
temp = list[1]
hum = list[2]
print "温度 = " + temp
print "湿度 = " + hum
print "気圧 = " + press
#アップロード
valuepost(temp,hum,press);
プログラムを実行してみます。
$ sudo python bme280.py
ssl-warningsと警告が出ましたが、データの送信は成功したように見えます。データベース側を見てみます。
ちゃんとデータベースにセンサーの値が入っていました。この瞬間は非常にうれしいものでした。
送信のプログラムは問題なさそうなので、ワーニングの問題を調べてみます。
/usr/lib/python2.7/dist-packages/urllib3/connectionpool.py:849: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
警告を出なくするように参考にしたページです。
[bme280.py]に下記2行を追加して、再度実行してみました。
import urllib3
urllib3.disable_warnings()
$ sudo python bme280.py
今度は警告が出ずにアップロードできました。
アップロードするプログラムの正常動作が確認できたので、15分おきにサーバにアップロードする設定をします。
cronを利用します。
$ sudo crontab -e
毎時、0分-15分-30分-45分にデータがアップロードされる設定です。最終行に追加し上書きします。
*/15 * * * * sudo python /home/pi/BME280/bme280.py
データベースにセンサーの値が15分おきに追加されていくのが確認できると思います。
次回その3では、データベースからデータを取得、JavaScriptでブラウザ上にグラフを描画する設定を行います。