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デバイスアクセスクラスの作成を行おうと思います。
コメント
コメントを投稿