Help us understand the problem. What is going on with this article?

IchigoJam+BME280で気温、気圧、湿度をロギング

IchigoJamで部屋の気温のログを取得して
暖房効率を見える化したいなー

と思い、昨年末にBME280というセンサーを購入。

買ってから気づいてしまったが、このセンサー
ネット上にIchigoJamでの使用例が存在しない orz

わりと苦労したけど、できたので、やりかたを共有します。
あまり詳しくないので、まちがいあればご指摘ください。

方針

IchigoJamだけでやらない。
(できなかったので、あきらめた)

IchigoJamでBME280からレジスタ値を読み出し、
レジスタ値をサーバプログラム(Python)に送って、
サーバプログラムで気温、気圧、湿度を計算する。

前提

サーバとHTTP通信するので、MixJuice等のWifiモジュールが必要。
私は互換のMJ POSTが使えるWeb Termを使用しました。

参考にした資料

IchigoJamとの接続

BME280側 ⇔ IchigoJam側
VCC ⇔ VCC
GND ⇔ GND
SCL ⇔ SCL
SDA ⇔ SDA
CSB ⇔ 接続しない
SDO ⇔ GND

IchigoJam側のプログラム

954 Byte
https://gist.github.com/kinumi/a33bc034b63056fec1196e4ac27d264a

自由に使ってください。
動作保証はないです。

解説

10 X=1
20 Y=10
30 Z="example.com"

パラメータ設定

Xは、IchigoJamの番号
複数台のIchigoJamで複数の部屋の気温をはかりたいときに、サーバ側で区別するために使う。

Yは、測定インターバル(秒)

Zは、サーバーのアドレス

110 GSB@SETUP
120 ?"MJ POST START ";STR$(Z)
130 ?X
140 GSB@CARIB
150 FORI=0TO31:?PEEK(#800+I):NEXT
160 GSB@DATA
170 FORI=0TO7:?PEEK(#800+I):NEXT
180 ?"MJ POST END"
190 WAIT Y*60
999 GOTO120

110行目GSB@SETUPで、BME280の設定レジスタに設定値を書き込みます。

120行目〜180行目 HTTP POST。
POSTするデータは以下。

1.IchigoJamの番号(パラメータX) 10進数
2.BME280の調整データ 32バイト分 16進数 (GSB@CARIBで読み出し)
3.BME280の測定データ 8バイト分 16進数 (GSB@DATAで読み出し)

190〜200行目 測定インターバルのWAIT、ぐるぐる回す

1010 @I2CR
1020 [101]=I2CR(#76,#8C6,1,#8C8,1)
1999 RETURN

2010 @I2CW
2020 [101]=I2CW(#76,#8C6,1,#8C8,1)
2999 RETURN

こいつらは、I2CRI2CWをかんたんに呼び出すためだけに定義。

3010 @SETUP
3020 A=#8C6:B=#8C8:C=0
3030 POKEA,#F2:POKEB,`00000101:GSB@I2CW
3040 POKEA,#F4:POKEB,`10110111:GSB@I2CW
3050 POKEA,#F5:POKEB,`10100000:GSB@I2CW
3999 RETURN

設定レジスタ書き込み。
何も考えずにオーバーサンプリングx16
(資料読んでもよくわからんかった)

4010 @CARIB
長いので略

BME280の調整レジスタを順番に読み出して
IchigoJamのメモリアドレス#800から順々に書き込んでます

5010 @DATA
5020 A=#8C6:B=#8C8:C=0
5030 POKEA,#F3:GSB@I2CR
5040 IF PEEK(B)&`00001000!=0 GOTO5030
5050 FOR I=0 TO 7
5060 POKEA,#F7+I:GSB@I2CR
5070 POKE#800+I,PEEK(B)
5080 NEXT
5999 RETURN

5030行目〜5040行目で、測定完了を待ってます
あとはBME280の測定結果のレジスタを順番に読み出して
IchigoJamのメモリアドレス#800から順々に書き込んでます

サーバ側のプログラム (Python)

https://gist.github.com/kinumi/15a6fbdb7ac1ab634f4e81e50e61426c

bme280.pyのロジックは、スイッチサイエンスのサンプルをほぼほぼ流用してます。
よって再利用はスイッチサイエンスのライセンス(MIT)に従います。
https://github.com/SWITCHSCIENCE/samplecodes/blob/master/LICENSE

app.pyより抜粋
@app.route('/', methods=["POST"])
def post():
    post_data = request.get_data().splitlines()
    post_data = list(map(lambda x: int(x), post_data))
    ijid = post_data[0]
    calib = post_data[1:1+32]
    data = post_data[1+32:1+32+8]
    bme280 = BME280()
    bme280.setCalib(calib)
    bme280.setData(data)
    return 'done.'

post_dataがIchigoJamから送られてきたデータです
改行区切りのテキストデータなので、改行で分割して数値変換してます

0番目がIchigoJamの番号(ijid)
1番目〜32番目が調整データ(calib)
33番目〜40番目が測定データ(data)

これらのデータをBME280クラスにぶちこんで計算してます

動作例

こんなかんじで、気温、気圧、湿度が測定できます。
あとはDBにいれたりグラフを描いたり、自由自在!

$ python app.py 
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
temp : 10.32  ℃
pressure : 1013.46 hPa
hum :  62.86 %
127.0.0.1 - - [19/Jan/2020 14:37:34] "POST / HTTP/1.0" 200 -
temp : 10.32  ℃
pressure : 1013.47 hPa
hum :  62.83 %
127.0.0.1 - - [19/Jan/2020 14:37:45] "POST / HTTP/1.0" 200 -
temp : 10.32  ℃
pressure : 1013.44 hPa
hum :  62.77 %
127.0.0.1 - - [19/Jan/2020 14:37:54] "POST / HTTP/1.0" 200 -
temp : 10.32  ℃
pressure : 1013.46 hPa
hum :  62.84 %
127.0.0.1 - - [19/Jan/2020 14:38:05] "POST / HTTP/1.0" 200 -
temp : 10.32  ℃
pressure : 1013.46 hPa
hum :  62.92 %
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした