今週は第55回地盤工学研究発表会が京都で行われるはずでしたが、コロナウィルスのため中止になり、一部のセッションのみオンライン(Zoom)で実施されました。主に水害に関するいくつかのセッションを拝聴しましたが、やはり水位観測システムがン十万円という発表がいくつかあり、観測の価格破壊にはまだまだ余地があると感じました。このブログも急いで応用編に入って、より実用的な作例を紹介したいと感じました。実際の製品には人件費等が含まれるのでセンサーの価格の総和とはなりませんが、少なくとも研究は自作により廉価な装置を使えるはずです。
前回の続きです。温度を計る別の方法として、Bosch Sensortec社のBME280あるいはBMP280というセンサーがあります。BMP280は温度・気圧(絶対圧)を計ることができ、その上位製品であるBME280は加えて湿度も計ることができます。センサーそのものは下の写真の通り非常に小さく(写真右の中央に見える約1mm×2mmの金属片)、このように基板実装したモジュールを使うことがほとんどだと思います。
BMP280はAmazonで最安300円くらい、BME280は800円くらいです。どちらも使い方はほとんど同じです。裏面にBMP/Eと書いてあり、印をつける白い□があります。ここに自分で印をつけておかないと(買うとすでに書いてある場合もあります)、見た目では区別がつかないので、わからなくなります。I2CでもSPIでも通信することができますが、モジュールによってはI2Cのポートしか引き出していなかったり、SparkFun社の製品のように、どちらもポートが引き出してあったりします。
I2Cなので使いやすく、温度も気圧もそこそこ正確に測ってくれるので、かなりメジャーなセンサーであり、電子工作のウェブサイトや入門書を買うと、よく例として使い方が載っています。また、多くのマイコンボードやIDEに対してライブラリが提供されています(Raspberry PieとかESP32とか)。ただ、私の経験でいえば、地盤モニタリングではそれほど主役にはなりません。防水ではないのでロガーの中に入れることになりますが、計っているのは大気温度・湿度ではなくロガー内温度と湿度になるので、あまり大した意味は持ちません。気圧は正しく計れますが、近くのAMeDASステーションの大気圧で事足ります(リアルタイムで気圧を計りたい場合を除く)。湿度はそもそも正確に計れているのか評価するのが難しいです。このような理由で、ロガー内のおまけとして使うことが多いです。いずれにしても使い方を紹介します。ちなみに、英語が苦にならなければ、SparkFunのウェブサイトのほうが詳しいです。
https://learn.sparkfun.com/tutorials/sparkfun-bme280-breakout-hookup-guide
ここではI2CでArduinoに接続することにします。I2Cアドレスは異なる2つの設定が可能で、SDOをGNDにつなぐと0x76、Vccにつなぐと0x77になります。他のI2Cセンサーと重複しなければどちらでもいいのですが、ここはVccにつないで0x77とします。これは、これから使うライブラリのヘッダーファイルAdafruit_BMP280.hの中にデフォルトで以下のようなコードがあるからです。
#define BMP280_ADDRESS (0x77)
アドレスを0x76として使う場合は、ここを書き変えて保存しなければなりません。
スケッチは以下のようにします。ここで、ライブラリAdafruit_BMP280.hを使います。
https://github.com/adafruit/Adafruit_BMP280_Library
Adafruit_BME280.hはこちら
https://github.com/adafruit/Adafruit_BME280_Library
BME280を使う場合は、(ライブラリをダウンロードしたうえで)上のスケッチのBMPを全てBMEにすればいいです。これでシリアルモニタを見れば、毎秒、温度と気圧が表示されます。久しぶりに画面をキャプチャしました。
下の図は、BMP280で計測した気圧とAMeDAS秋田の気圧を1か月にわたって比較したものです(AMeDASでは、気圧は管区のステーションでしか計測されていません)。オフセットがありますが、変化率は同じで、オフセット補正をすればAMeDASと等価なデータがとれることがわかります。これは例えば地下水位計測を目的として絶対圧センサーを地下水位以下に設置し、計測した水圧をゲージ圧(水深に相当)に変換するときなどに使えます。