chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

ESP8266+BME280+NodeMCU+ライブラリで温湿度と気圧を計測→ライブラリに入っておらず→ブランチから取ってきてビルドしなおし

これまで、NodeMCUとluaとI2CライブラリでシコシコとBME280用のライブラリを書いていたけど、すでにBME280用のライブラリがNodeMCU側で用意されているのを知った。ということで、、提供されているライブラリを使ってどんな値が得られるのか?を見てみる。

以下はサンプルコースそのまま

http://nodemcu.readthedocs.org/en/dev/en/modules/bme280/#example

alt=320 -- altitude of the measurement place

bme280.init(3, 4)

P, T = bme280.baro()
print(string.format("QFE=%d.%03d", P/1000, P%1000))

-- convert measure air pressure to sea level pressure
QNH = bme280.qfe2qnh(P, alt)
print(string.format("QNH=%d.%03d", QNH/1000, QNH%1000))

H, T = bme280.humi()
print(string.format("T=%d.%02d", T/100, T%100))
print(string.format("humidity=%d.%03d%%", H/1000, H%1000))
D = bme280.dewpoint(H, T)
print(string.format("dew_point=%d.%02d", D/100, D%100))

-- altimeter function - calculate altitude based on current sea level pressure (QNH) and measure pressure
P = bme280.baro()
curAlt = bme280.altitude(P, QNH)
print(string.format("altitude=%d.%02d", curAlt/100, curAlt%100))

初期化関数を実行してみたところ、エラーになる。どうもbme280のライブラリは実装されていないようだ。


> bme280.init(6, 5)
stdin:1: attempt to index global 'bme280' (a nil value)
> = bme280
nil
今入ってるバージョンは、NodeMCU 0.9.6

> print("NodeMCU "..majorVer.."."..minorVer.."."..devVer)
NodeMCU 0.9.6

> node.restart()
NodeMCU 0.9.6 build 20150704 powered by Lua 5.1.4
ビルドの時にDisableにしてしまったからか?

調べてみると、リリース版には、bme280.cが入っておらず、devのブランチにのみ入っている様だ。(開発版のみということか??)

https://github.com/nodemcu/nodemcu-firmware/blob/dev/app/modules/bme280.c

devのブランチをZIPで落として、Ubuntu環境でbuildしてみる


mkdir tmp ; cd tmp
wget https://github.com/nodemcu/nodemcu-firmware/archive/dev.zip
unzip dev.zip
cd nodemcu-firmware-dev
export PATH=$PATH:/opt/Espressif/esp-open-sdk/xtensa-lx106-elf/bin/
make
エラーが出ずビルドできたのでfirmを焼いてみる

sudo make flash

動かしてみたけど、bme280は有効になっておらず、ファイルを編集してモジュールを有効化する
file:nodemcu-firmware-dev/app/include/user_modules.h


//#define LUA_USE_MODULES_BME280
コメントアウトされているのを有効化↓

#define LUA_USE_MODULES_BME280
同じように、ビルドしてfirmを焼く。

make clean ; make
sudo make flash
ESP8266を電源Off/Onでリブート、シリアルコンソールで接続(速度は115200baud)

NodeMCU 1.5.1 build unspecified powered by Lua 5.1.4 on SDK 1.5.1(e67da894)
lua: cannot open init.lua
> = bme280
romtable: 0x402618e0
>
上記の通り、bme280が有効になっている。。
改めて、温度を計測してみる。。 bme280.init(6,5)を指定していますが、GPIO12(io index:6)にI2CのData,GPIO14(io index:5)にI2CのClockを接続しているから。

> bme280.init(6, 5)
> H, T = bme280.humi()
> print(string.format("T=%d.%02d", T/100, T%100))
T=25.98
> print(string.format("humidity=%d.%03d%%", H/1000, H%1000))
humidity=35.956%
センサーで取得できた値として、温度は25.98℃で、湿度は35.96%らしい。
タニタの温度計では、24.3℃、目覚まし時計の温度計は23.3℃で、湿度は49%になっている。温度の誤差は1℃〜2℃ぐらいだけど、湿度は結構差がある。

再度計測、センサーは24.41℃、タニタは23.3℃、目覚ましの温度計は24.0℃


> bme280.init(6, 5)
> P, T = bme280.baro()
> H, T = bme280.humi()
> print(string.format("T=%d.%02d", T/100, T%100))
T=24.41
> print(string.format("humidity=%d.%03d%%", H/1000, H%1000))
humidity=44.410%
これまで自分がシコシコ作っていたライブラリで計算された温度は。。24.43℃。
リリースされているライブラリの値にかなり近いのでちょっと安心。だけどまぁ今後は自作はこれで中断して、リリース版を使う予定。

> BME280.readData()
24.43