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

コメント

このブログの人気の投稿

プロジェクトのきっかけ・コンセプト・未来

BMP280温度センサー・その5(I2Cデバイスクラスに関して)

Raspberry Pi セットアップ