BME280 搭載、温度・湿度・気圧センサーを SPI で動かしてみた( ESP-WROOM-02 ( ESP8266 )使用)

ESP8266 ( ESP-WROOM-02 )

こんばんは。

夏、真っ只中、カツンと晴れたり、スコールが降ったりと、梅雨が明けたのに天気が安定しないですねぇ・・・。この前は洗濯物を干していて放っておいたら、突然の雷と大雨で全滅してしまいました。

そこで、今回は天候の変化を素早く知りたいがために、温度・湿度・気圧センサーを表示させてみることに挑戦してみました。
そして、この記事の後半では気象庁のアメダス表形式を参照して、海面気圧と実測気圧から現地点の標高を自動計算させてみたいと思います。
後半では気圧から標高の計算方法を紹介しています。

以前の記事では2種類の温度・湿度センサー DHT11 をシリアル通信で使ったことがありますが、今回はSPI通信ができるスイッチサイエンス製のこのデバイスを使ってみたいと思います。

BME280搭載 温湿度・気圧センサモジュール(スイッチサイエンス製)
現在Amazonで販売されていないようなので、以下のスイッチサイエンスさんの公式サイトをご参照ください。
https://www.switch-science.com/products/2236?_pos=3&_sid=373c89d96&_ss=r

このBME280というデバイスはあの電動工具で有名なBOSCH(ボッシュ)製です。
こんな超極小デバイスも作っているとは知りませんでした。スゴイ会社ですねぇ・・・。

制御はもちろん、お馴染みのスイッチサイエンス製 ESPr Developer ( ESP-WROOM-02 ( ESP8266 )) を使います。

前回の記事まではSPI通信のフルカラーOLED ( 有機EL ) SSD1351 を使っていて、これを生かしていろいろと表示させてみたいと思っていました。
しかし、ESP-WROOM-02 ( ESP8266 ) はGPIOピンが少ないので、SPI通信とシリアルやI2C通信などを混在させることは難しいのです。。
そこで、SPI通信できるモジュールを探していたところ、BME280に出会ったわけです。

ただ、ネット上でBME280の情報はI2C通信ばかりで、SPIに関しては微々たるものでした。どうやってSPIで動かしたら良いのか、詳しく解説しているサイトは殆どありませんでした。
救いだったのは、Adafruitのライブラリを使うと問題なく動作したことでした。
ただ、このライブラリのサンプルスケッチを使っているだけでは細かいキャリブレーションや、どういう原理で動作してるのかということがサッパリ分からず・・・。
ライブラリを読み解いていると、難解な計算式が沢山ありました。
BME280のデータシートにその計算式が記載されていて、レジスタ設定方法も詳しく載っていましたが、相変わらず英語が苦手で解読が進まず・・・。
AdafruitさんのライブラリとスイッチサイエンスさんのBME280使い方ページも見ながらI2CをSPIに置き換えて何度もテストしているうちに、ついにようやく解明するに至りました。

ということで、今回もいつものようにライブラリを一切使わずにBME280をSPIで動かす方法を解説してみたいと思います。Arduino標準のSPIライブラリも使いません。
ただ、このデバイスはスイッチサイエンス製なので、分かりやすいようにスイッチサイエンスさんのBME280使い方ページにあるI2C接続用のサンプルスケッチに習ったプログラム構成にしてみました。

(この記事はだいぶ古い記事のため、現在の環境では動作しない場合があることをご了承ください)

    【目次】

  1. 準備するもの
  2. BME280 モジュールのピンヘッダハンダ付け
  3. BME280 モジュールと ESPr Developer をブレットボード上で接続する
  4. Arduino IDE の ESP8266 ボード設定
  5. スケッチの入力
  6. アメダス表形式を使って海面気圧(海抜0m気圧、又は海面更正気圧)を入力する
  7. 気圧からの標高を計算することについて
  8. コンパイル書き込みおよび実行する
Arduino-ESP32 が2018/06/28以降大幅更新され、I2C(Wire)ライブラリが一新されました。
以下の記事を参照してください。
Arduino – ESP32 大幅更新( 2018/06/28以降 )と I2C 不具合解決、その他気付いたこと
SPI通信でも同様の不具合があり、I2Cよりむしろ誤差が大きいです。
もう一つ、以下の記事も合わせて参照してみてください。
BME280 を M5Stack で使って再びハマったこと、BOSCH 純正ドライバの使用について
(2018/07/07)

 

その後の記事では、ESP32 ( ESP-WROOM-32 )用 BME280 ライブラリを作成したり、誤差を少なくする方法を試してみたり、オーバーサンプリングの設定を見直したりしてみましたので、以下の記事も合わせてご参照ください。
●ESP32 用 BME280 ( 温度 湿度 気圧センサー ) ライブラリを作ってみた
●ESP32 の Wi-Fi のみ OFF および温度・湿度・気圧センサー BME280 の再調整など

以下の記事は ESP8266 ( ESP-WROOM-02 )用の記事です。

 

1.準備するもの

BME280搭載 温湿度・気圧センサモジュール  ( スイッチサイエンス 製)
現在Amazonで販売されていないようなので、以下のスイッチサイエンスさんの公式サイトをご参照ください。
https://www.switch-science.com/products/2236?_pos=3&_sid=373c89d96&_ss=r

温度・湿度・気圧のセンサーがあり、I2C通信とSPI通信の両対応です。
ESPr Developer ピンソケット実装済みにArduinoシールドのように差し込み出来るモジュールもありますが、それはESP-WROOM-02や電源レギュレーターの熱に影響されて正しい測定が出来ないと思われますのでご注意ください。

●ESPr Developer ( スイッチサイエンス 製)
Amazon.co.jp

ESP-WROOM-02開発ボード
スイッチサイエンス(Switch Science)

ESPr Developer(ピンソケット実装済)
スイッチサイエンス(Switch Science)

当ブログで何度も紹介しているお馴染みのESP-WROOM-02シリアルインターフェイス付きボードです。
ESPRESSIF社製 ESP8266 チップは2.4GHz帯Wi-Fi対応で、日本の電波法をクリア(技術適合認証)したパッケージとして販売している ESP-WROOM-02 をスイッチサイエンスさんがさらに余裕のある電源レギュレーターやUSBシリアルインターフェイスをモジュール化して使いやすくしてあるものです。
これの使い方や組み立て方は以下のページを参照してください。
ESPr Developer の使い方をザッと紹介

●その他、ブレッドボード、ジャンパーワイヤー、USBケーブル、パソコン等

2.BME280 モジュールのピンヘッダハンダ付け

BME280搭載 温湿度・気圧センサモジュールを購入すると以下のようにピンヘッダが付属していました。

モジュールの中央にある銀色の小さい四角いケースがBME280です。こんなちっちゃいものに温度、湿度、気圧センサーが入っているなんて信じられないですよね。因みにこのピンヘッダは2.54mmです。
I2C通信用のプルアップ抵抗はありません。I2C通信を使う場合はR1,R2にプルアップ抵抗を自分でハンダ付けする必要があります。
ただ、今回はSPIなのでプルアップ抵抗は不要です。
SPI通信ではプルアップ抵抗が必要な場合と不要な場合があるようですが、BME280のデータシートによると不要だそうです。

裏面はこうなってます。

Vio と Vcore のPad 間がショートしてあるパターンがあり、要するに、BME280内のチップに別電源を使いたい場合はカッターなどでプリントパターンをカットして使うようです。おそらくノイズの影響を受けないようにクリーンな電源を使って精密な測定をしたい場合ということでしょうか・・・。
今回はカットせずにそのまま使います。
詳細はスイッチサイエンスさんのサイトにありますのでそちらもご参照ください。

ピンヘッダをハンダ付けしていきます。
一度、一カ所だけチョビっとハンダ付けして、その後ハンダを溶かしながら垂直になるように微調整して、バッチリになったら全部ハンダ付けすると良いです。

3.BME280 モジュールと ESPr Developer をブレットボード上で接続する

ESPr Developer ( ESP-WROOM-02 ( ESP8266 )) と BME280 モジュールのSPI通信用接続方法はこんな感じになります。

BME280 の電源は3.3V までですので、間違っても5Vに接続しないように注意してください。

SPI通信の場合は、ESP-WROOM-02側がMaster(要するに親機)で制御する側となり、BME280 はSlave(要するに子機)となります。
後で紹介するサンプルスケッチで、ESP-WROOM-02 ( ESP8266 )側のGPIO設定をしますが、13番ピンを MOSI ( Master Output Slave Input ) として、それをBME280側の SDI ( Slave Data Input )に接続します。略した頭文字だけでは訳が分からないので、こうして訳すと分かりやすいですね。
12番ピンは MISO ( Master Input Slave Output ) で、SDO ( Slave Data Output )に接続します。
SCK は( Serial Clock ) です。
CSB は SPI接続の CS 信号 ( または SS 信号 )で、これを別のピン配置にすることによって、スレーブ機器を連結して、別々に制御することができます。ただ、デバイスが増える毎にCSピンを増やさなければいけないのが難点です。その点でいえば、多少速度が遅くなってもI2C接続の方が楽で便利ですね。

因みに、先に述べましたが、プルアップ抵抗は不要です。BME280 のデータシートにもそう書いてありました。

GPIO #16 CS ( SS ) —– CSB
GPIO #14 SCLK —– SCK
GPIO #13 MOSI ( Master Output Slave Input ) —– SDI ( Slave Data Input )
GPIO #12 MISO ( Master Input Slave Output ) —– SDO ( Slave Data Output )

4.Arduino IDE の ESP8266 ボード設定

Arduino IDE のバージョンはArduino.cc サイトのバージョン 1.6.10 で動作しています。(2016/8/3現在)
これに ESP8266 ボードをインストールしておいてください。
インストール方法は以下のページを参照してください。
Arduino IDE に Staging(Stable)版ESP8266 ボードをインストールする方法

コメント

  1. かいじ より:

    この取得したデータ(温度、湿度、気圧、高度)をsdに保存したいのですが、どうすればいいですか? 

タイトルとURLをコピーしました