温度・湿度・気圧センサーBME280をESP8266 ArduinoのSPI通信でアクセスするライブラリーを作りました。

やりたいこと

ESP8266 Arduinoで環境モニターを作っています。今まではBME280をI2C通信でアクセスして温度、湿度、気圧を測定していましたが、これに加えてフォトトランジスター(NJL7502L)で照度を測ることにしました。ESP8266にはアナログ入力が一つありますが、これは電池の電圧を測るのに使っているので、照度の測定にはADコンバーター(MCP3002)を使いました。BME280はI2C通信とSPI通信のどちらでもアクセスできますが、MCP3002はSPI通信でしかアクセスできません。そこで、BME280もSPI通信でアクセスするようにしました。

BME280とESP8266の接続

SPI通信には3線で通信する方式と4線で通信する方式があります。BME280は3線式、4線式の両方に対応できますが、MCP3002が4線式なのでBME280も4線式で使うことにします。ESP2866とBME280は以下のように接続します。

ESP8266 BME280
IO14: HSPI_CLK SCK
IO12: HSPI_MISO SDO
IO13: HSPI_MOSI SDI
IO15: HSPICS  CSB

 

SPI通信版BME280ライブラリー複数のSPIデバイスを接続するときはCLK、MISO、MOSIは共通に(バス状に)接続し、CSはデバイスごとに個別に接続します。つまりデバイスの数だけESP8266のピンが必要になります。ESP8266のマニュアルにはIO15ピンがHSPICSに割り当てられていますが、CSはSPIデバイスと通信するときに対応するピンをLOWレベルにすればいいので、別のGPIOピンも使うことができます。

SPI通信版BME280ライブラリー

BME280にアクセスするプログラムは再利用しやすいよう、ライブラリーにしました。

BME280を制御するクラスを定義し、メンバー関数として初期化(begin)と温度、湿度、気圧の読み出し(readTemperature、readHumidity、readPressure)を用意しました。

使い方はこんな感じです。

    #include 
    #include "BME280_SPI.h" // SPI通信版BME280ライブラリーのヘッダーファイル

    BME280 bme280; // BME280のデーターを定義

        bme280.begin(BME_CS); // BME280の初期化

        temp = bme280.readTemperature(); // 温度の読み出し
        humid = bme280.readHumidity(); // 湿度の読み出し
        pressure = bme280.readPressure(); // 気圧の読み出し

ライブラリーの全体とサンプルプログラムはGithubに公開しました。

https://github.com/TakehikoShimojima/BME280_SPI

次はこれを使って環境モニター3号機を作ります。