BMP280温度センサー・その6(メインルーチン)
簡易目次
実際のプログラムに入る前にプロジェクトフォルダーをGitHubに作成しました。
前回までの説明で(ほとんど説明してないけど)作成した、デバイスクラスやデバイスマネージャークラスを実際に使ってみます。
メインプログラムはTestProject/00_TestI2C.cppとなっており、ソースは以下の通りです。
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <linux/i2c-dev.h> #include <fcntl.h> #include <sys/ioctl.h> #include "../../SPI2C/BMP280/BMP280.h" int main() { SPI2C::CSPI2CManager i2cManager("/dev/i2c-1"); //Control & Configuration SPI2C::CSPI2CBMP280ConfigCtrl * pConfigCtrl = new SPI2C::CSPI2CBMP280ConfigCtrl( 0x76 ); pConfigCtrl->SetCtrlOsrsP(SPI2C::CSPI2CBMP280ConfigCtrl::OsrsP_x16); pConfigCtrl->SetSender(); i2cManager.AddDeviceAccess( pConfigCtrl ); SPI2C::CSPI2CBMP280TempPress * pTempPress = new SPI2C::CSPI2CBMP280TempPress( 0x76 ); SPI2C::CSPI2CBMP280Calib * pCalib = new SPI2C::CSPI2CBMP280Calib( 0x76 ); pCalib->SetTempPressInstance( pTempPress ); i2cManager.AddDeviceAccess( pCalib ); i2cManager.AddDeviceAccess( pTempPress ); pthread_t threadId; pthread_create( &threadId, NULL, SPI2C::CSPI2CManager::ThreadProc, (void*)&i2cManager ); int iCounter = 0; while( 1 ) { sleep( 1 ); double dblTemp = pTempPress->GetTemperature(); double dblPress = pTempPress->GetPressure() / 100.0; printf( "Temp: %.2fC Press:%.5fHPa \r" , dblTemp , dblPress );fflush(stdout); if( iCounter % 60 == 0 ) { time_t timeNow = time(NULL); struct tm tmNow; localtime_r( &timeNow, &tmNow ); char szName[64]; snprintf( szName, 64, "TempPress%04d%02d%02d.csv" , tmNow.tm_year+1900, tmNow.tm_mon+1, tmNow.tm_mday ); FILE * fp = fopen( szName, "a" ); if( fp ) { fprintf( fp, "%04d/%02d/%02d %02d:%02d:%02d,%.2f,%.4f\n" , tmNow.tm_year+1900, tmNow.tm_mon+1, tmNow.tm_mday , tmNow.tm_hour, tmNow.tm_min, tmNow.tm_sec , dblTemp, dblPress ); fclose( fp ); } iCounter = 0; } iCounter++; } pthread_join( threadId, NULL ); return 9; }できるだけシンプルに仕上げたつもりです。
マネージャークラスのインスタンスを作成
SPI2C::CSPI2CManager i2cManager("/dev/i2c-1");
して
そのマネージャークラスにBMP280のデバイスアクセスクラスを登録しています。
最初に登録するのが、コンフィギュレーションクラスのインスタンスSPI2C::CSPI2CBMP280ConfigCtrl
次に温度・圧力の取得ルーチンのインスタンスを作成
SPI2C::CSPI2CBMP280TempPress
し、そのインスタンスをキャリブレーションクラス
SPI2C::CSPI2CBMP280Calib
のインスタンスに登録
pCalib->SetTempPressInstance( pTempPress );
しています。
その後マネージャークラスにキャリブレーションクラスのインスタンスと温度・圧力取得クラスのインスタンスを登録
i2cManager.AddDeviceAccess( pCalib );
i2cManager.AddDeviceAccess( pTempPress );
しています。
あとはマネージャークラスのスレッドをマネージャークラスのインスタンスを引数として起動
pthread_create( &threadId, NULL, SPI2C::CSPI2CManager::ThreadProc, (void*)&i2cManager );
しています。
while内の処理では、1秒ごとに温度・圧力の取得ルーチンのインスタンスから温度・圧力を取得し、画面に表示するとともにCSVファイルへ追加出力しています。
マネージャークラス・デバイスアクセスクラス、デバイス用スレッドを使用することにより、名ンルーチンで使う側は非常にシンプルにBMP280デバイスを使用できるようになりました。
今後はI2Cに液晶ディスプレイを追加し、温度・湿度の表示を行います。同じようにデバイスアクセスクラスの作成を行いますので、メインルーチンの方は非常にシンプルになります。
その下準備として次回からは液晶ディスプレイのコントロール用のI2Cデバイスアクセスクラスの作成を行おうと思います。
コメント
コメントを投稿