PR

トワイライト(TWELITE)でBME280のデータを取得する

組み込みエンジニア
本記事はプロモーションが含まれています。

こんにちは、ENGかぴです。

トワイライトのWire(I2C通信)を使用することでBME280から温湿度・気圧のデータを取得することができます。MWSTAGEではセンサーデバイスライブラリであるBMx280クラスの関数をコールするだけでBME280のデータを取得できます。

BMx280クラスを使用して温湿度・気圧のデータを取得しMONOSTICKに無線通信して動作確認をしています。BME280はAE-BME280(秋月電子)を使用しています。

BME280のデータを取得する

BME280は温湿度に加えて気圧の3つの環境情報を同時に測定できるのが特徴です。また、マイコンとの通信方式がI2CまたはSPIを選択できるためマイコンに組み込みやすい構成となっています。製作メーカであるBOSCH社が提供しているAPIを組み込んで動作確認したことについてまとめています。

トワイライト(TWELITE)のI2C通信を実装し無線通信する

トワイライト(TWELITE)のSPI通信を実装し無線通信する

上記記事ではAPIを組み込むために処理を追加する必要がありますが、BMx280クラスを使用する場合は関数をコールするだけでよいので手早く動作確認ができます。

センサー・デバイス(SNS)のBMx280クラスを使用する

MWX Libraryのセンサーデバイス(SNS)においてBMx280x-環境センサー用のクラスが実装されています。関数の使用方法などの詳細はモノワイヤレス社のHPに公開されています。

モノワイヤレス社ーセンサー・デバイス(SNS)BMx280-環境センサー

これらの関数を使用することで簡単にBME280からデータを取得することができます。

PR:わからないを放置せず、あなたにあった最低限のスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!

BME280からデータを取得する

BMx280クラスを使用するために専用のヘッダーとオブジェクトを宣言する必要があります。

#include <SNS_BME280>

SNS_BME280 sns_bme280;

void setup() {
    Wire.begin(); //I2Cを有効にする
    sns_bme280.setup(); 
}

BMx280の通信方式はI2Cであるためsetup()関数を使用する前にWireを有効にする必要があります。setup()関数に引数を指定しない場合は初期値の0x76がスレーブアドレスとして指定されます。BME280のスレーブアドレスが0x77の場合は0x77を引数にします。

//測定を開始する場合
sns_bme280.begin();

//経過時間を通知(測定完了を通知しないセンサーの場合)
sns_bme280.process_ev(20); //20ms経過を通知 

測定を開始はbegin()関数を使用します。測定完了をavailable()によって確認しますが、BMx280クラスでは経過時間を通知しなければavaiable()がtrueにならないためprocess_ev()で時間経過を通知しています。

BME280の測定時間はデータのサンプリングによって変化しますが数十msなので関数発行から20ms後に測定完了を通知します。

if(sns_bme280.available()){ //測定完了したか  
    getsensor.temp = sns_bme280.get_temp_cent();  //温度
    getsensor.humi = sns_bme280.get_humid_per_dmil(); //湿度
    getsensor.press = sns_bme280.get_press(); //気圧
}

測定結果の取得は温度データの場合get_temp()関数、湿度データの場合get_humid()関数、気圧の場合get_press()関数を使用します。100倍値を取得したい場合はget_temp_cent()及びget_humid_per_dmil()の関数を使用します。気圧は100倍値の関数はありません。

ZigBee通信する際は100倍値を送信した方がデータ量が少なくできるため有効です。

PR:わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!

BME280で取得したデータを無線通信する例

BME280で取得したデータを無線通信する例
BME280で取得したデータを無線通信する例

トワイライトの低消費電流を活かすためにスリープしながらBME280の測定を行います。センサー情報を取得しながら無線通信を行うサンプルアクトの公開されています。

モノワイヤレス社ーMWX Library Slp_Wk_and_Tx

Slp_Wk_and_txアクトの機能を引用しながらBME280からデータを取得し無線通信を行います。手順は以下の通りです。

  1. スリープする
  2. ウェイクアップしたときBME280測定を開始する(begin()関数)
  3. ナップ(100ms)する(ナップ中にBME280の測定完了している)
  4. ウェイクアップする
  5. BME280からデータを取得
  6. 測定結果を無線通信する
  7. 1に戻って繰り返す

2.ウェイクアップした瞬間にBME280の測定コマンドを送出してナップ(ショートスリープ)することでBME280の測定時にトワイライトの消費電流を押さえることができます。BME280の測定は数十msで完了するためナップからウェイクアップしたときにはデータを取得することができます。

if (!sns_bme280.available()) {
    sns_bme280.process_ev(1); 
    //napにより100ms以上経過しているため1をセット0ではavailableとならない
}

経過時間の通知のためprocess_ev()関数を使用しますが、0を指定してもavailable()がtrueにならないため最低でも1を指定する必要があります。

PR:スキマ時間で自己啓発!スマホで学べる人気のオンライン資格講座【スタディング】まずは気になる講座を無料で体験しよう!

動作確認

トワイライトのBMx280クラスを使用して測定結果を無線通信で送信します。無線通信データの確認はMONOSTICKで行います。MONOSTICKを親機とし、子機でBME280のデータを取得し無線通信します。

動作確認用の回路

動作確認用の回路図(子機)
動作確認用の回路図(子機)

BME280モジュールにはプルアップ抵抗が実装されているためプルアップ抵抗は必要ありません。スリープとナップを使用し消費電流を押さえながらBME280のデータを取得して無線通信を行います。

SW1はEEPROMの動作確認用でlogical_idをランダム値を利用して書き換えするために使用します。SW1を長押しするとEEPROMにデータを書き込みます。

EEPROMにランダム値を書き込むとトワイライトをリスタートさせます。無線通信が開始するとMONOSTICK上に子機の番号を表示するためlogical_idが変更されていることが確認できます。

動作結果

動作結果
動作結果

子機はBME280から取得した結果をシリアルモニタで表示しています。親機は子機の受信したデータを表示しています。5秒間スリープして測定する動作を繰り返しているため5秒おきに親機の表示が追加されています。

親機の179の表示は子機のlogical_idでありSW1を押してEEPROMの値が変更されると表示が変更されていることも確認できています。

子機の番号をEEPROMに保管して通信などで変更できればと思い動作確認用にSW1を入れていますが子機はスリープを使用していることやボタンが押せない遠隔地に設置した場合に意味をなさないため基本的にソフト書き込み時にIDを固定する方法がベストだと感じました。

スポンサーリンク

ソースコード全体

ソースコードは記事作成時点において動作確認できていますが、使用しているライブラリの更新により動作が保証できなくなる可能性があります。また、ソースコードを使用したことによって生じた不利益などの一切の責任を負いかねます。参考資料としてお使いください。

リンクからZIPファイル形式のファイルをダウンロードし、任意の場所に展開していただくとテキストファイルが生成されます。

ソースコードをダウンロード

TWELITEのソースコードはMWSTAGEの環境でアクトのソースファイルにコピーすると使用できます。

関連リンク

トワイライトを太陽光パネルで動作させたことやMWSTAGEの環境でソフト開発して無線通信したことなどについてまとめています。

トワイライト(TWELITE)のソフト開発と無線通信でできること

PR: わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジムPython入門講座の申込

最後まで、読んでいただきありがとうございました。

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