今週は第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

 

 



#include <Adafruit_BMP280.h>

 

Adafruit_BMP280 bmp;

 

void setup(void)

{   

    Serial.begin(9600);

    while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

    }

 

    /* ----- Starting up BMP280 ----- */

    if (!bmp.begin()) { 

      Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));

      while (1);

    }

}

 

void loop(void)

{

    Serial.print("Temperature = ");

    Serial.print(bmp.readTemperature());

    Serial.println(" *C");

   

    Serial.print("Atm. Pressure = ");

    Serial.print(bmp.readPressure());

    Serial.println(" Pa");

 

  delay(1000);

}

 

 

BME280を使う場合は、(ライブラリをダウンロードしたうえで)上のスケッチのBMPを全てBMEにすればいいです。これでシリアルモニタを見れば、毎秒、温度と気圧が表示されます。久しぶりに画面をキャプチャしました。

 

 

 下の図は、BMP280で計測した気圧とAMeDAS秋田の気圧を1か月にわたって比較したものです(AMeDASでは、気圧は管区のステーションでしか計測されていません)。オフセットがありますが、変化率は同じで、オフセット補正をすればAMeDASと等価なデータがとれることがわかります。これは例えば地下水位計測を目的として絶対圧センサーを地下水位以下に設置し、計測した水圧をゲージ圧(水深に相当)に変換するときなどに使えます。