使用されているIR温度センサー「TI TMP006」は、object temperatureとthe ambient temperatureの2種類のデータが取得できます。SensorTagの温度センサー「TMP006」は、最少時間「250ms」で更新されます。

SensorTagの 温度センサーへのデータアクセス

ハンドルを用いたSensorTagの IR温度センサー「TI TMP006」(U5)への問い合わせは、次のテーブルに従います。

SensorTagの温度センサー(U5)への問い合わせ
Type UUID Handle Read/Write Format
<Data> F000AA01 * 0×25 Read/Notify ObjLSB ObjMSB AmbLSB AmbMSB (4 bytes)
<Data Notification> 0×26 R/W 2 bytes
<Configuration> F000AA02 * 0×29 R/W 1 byte

温度センサーデータの温度への変換式

Objはobject temperatureで、Ambはthe ambient temperatureを示します。
IR温度センサー「TI TMP006」から入力したデータ(Handle:0x25)を、次の計算式により温度に変換します。
温度センサー変換式

温度センサーデータ変換のプログラム

t1,2はobject temperatureで、t3,4はambient temperatureを示します。上記のIR温度センサーの変換式をjava言語とc言語でコード化した例を示します。
java言語で記述すると次のようになります。

import static java.lang.Math.*;

public class IrTemperature {
	/**/
	private double calcTmpLocal(int rawT)
	{
		//-- calculate die temperature [°C] -
		double m_tmpAmb = (double) rawT / 128.0; 
		// Used in also in the calc. below
		return m_tmpAmb;
	}
	/* Conversion algorithm for target temperature */
	private double calcTmpTarget(int rawT)
	{
		//-- calculate target temperature [°C] -
		double Vobj2 = (double) rawT;
		Vobj2 *= 0.00000015625;

		double Tdie2 = this.calcTmpLocal(0x321) + 273.15;
		double S0 = 6.4E-14; // Calibration factor

		double a1 = 1.75E-3;
		double a2 = -1.678E-5;
		double b0 = -2.94E-5;
		double b1 = -5.7E-7;
		double b2 = 4.63E-9;
		double c2 = 13.4;
		double Tref = 298.15;
		double S = S0 * (1 + a1 * (Tdie2 - Tref) + a2 * pow((Tdie2 - Tref), 2));
		double Vos = b0 + b1 * (Tdie2 - Tref) + b2 * pow((Tdie2 - Tref), 2);
		double fObj = (Vobj2 - Vos) + c2 * pow((Vobj2 - Vos), 2);
		double tObj = pow(pow(Tdie2, 4) + (fObj / S), .25);
		tObj = (tObj - 273.15);

		return tObj;
	}
}

C言語で記述すると次のようになります。

/*  Conversion algorithm for die temperature */
double calcTmpLocal(uint16 rawT)
{
  // calculate die temperature [°C]  
  m_tmpAmb = (double)((qint16)rawT)/128.0; // Used in also in the calc. below
  return m_tmpAmb;
}

import static java.lang.Math.pow;

/* Conversion algorithm for target temperature */
double calcTmpTarget(uint16 rawT)
{
  //-- calculate target temperature [°C] -
  double Vobj2 = (double)(qint16)rawT;
  Vobj2 *= 0.00000015625;

  double Tdie2 = m_tmpAmb + 273.15;
  const double S0 = 6.4E-14;            // Calibration factor

  const double a1 = 1.75E-3;
  const double a2 = -1.678E-5;
  const double b0 = -2.94E-5;
  const double b1 = -5.7E-7;
  const double b2 = 4.63E-9;
  const double c2 = 13.4;
  const double Tref = 298.15;
  double S = S0*(1+a1*(Tdie2 - Tref)+a2*pow((Tdie2 - Tref),2));
  double Vos = b0 + b1*(Tdie2 - Tref) + b2*pow((Tdie2 - Tref),2);
  double fObj = (Vobj2 - Vos) + c2*pow((Vobj2 - Vos),2);
  double tObj = pow(pow(Tdie2,4) + (fObj/S),.25);
  tObj = (tObj - 273.15);

  return tObj;
}