温度・湿度・気圧センサー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号機を作ります。