SensorTagで使用されている圧力センサー「T5400」は、object temperatureとthe ambient temperatureの2種類の温度データも取得できます。SensorTagの気圧センサー「T5400」は、最少時間「2ms」で更新されます。
SensorTagの 圧力センサーへのデータアクセス
ハンドルを用いたSensorTagの 圧力センサー「T5400」(U4)への問い合わせは、次のテーブルに従います。
Type | UUID | Handle | Read/Write | Format |
---|---|---|---|---|
<Data> | F000AA41 * | 0×4b | Read only | TempLSB TempMSB PressLSB PressMSB (4 bytes) |
<Data Notification> | 0×4c | R/W | 2 bytes | |
<Configuration> | F000AA42 * | 0×4f | R/W | 1 byte |
<Calibration> | 0×52 | Read only | C1LSB C1MSB…C8LSB C8MSB (16 bytes) |
圧力センサーデータの気圧への変換式
Tempは温度でPressは圧力を示します。
圧力センサー「T5400」から入力した校正データ(Handle:0x52)を次の式にで設定し、圧力データ(Handle:0x4b)の2バイトのデータから生の圧力データを取り出して、次の計算式により圧力に変換します。Prは生の圧力データで、Trは生の温度データを示します。圧力は符号なしで、Pは、パスカル単位の圧力です。パスカルからバールに変換するには、「10000」で除算します。
温度は符号を持ち、圧力データ(Handle:0x4b)の2バイトのデータから生の温度データを取り出して、次の計算式により温度に変換します。
圧力センサーデータ変換のプログラム
上記の圧力センサーの変換式をjava言語とC言語でコード化した例を示します。
java言語で記述すると次のようになります。
/* Conversion algorithm for barometer temperature * * Formula from application note, rev_X: * Ta = ((c1 * Tr) / 2^24) + (c2 / 2^10) * * c1 - c8: calibration coefficients the can be read from the sensor * c1 - c4: unsigned 16-bit integers * c5 - c8: signed 16-bit integers */ private double calcBarTmp(int rawT) { long m_raw_temp = rawT; long temp, val; val = ((long) (c1 * m_raw_temp) * 100); temp = (val >> 24); val = ((long) c2 * 100); temp += (val >> 10); return ((double) temp) / 100; } /* Conversion algorithm for barometer pressure (hPa) * * Formula from application note, rev_X: * Sensitivity = (c3 + ((c4 * Tr) / 2^17) + ((c5 * Tr^2) / 2^34)) * Offset = (c6 * 2^14) + ((c7 * Tr) / 2^3) + ((c8 * Tr^2) / 2^19) * Pa = (Sensitivity * Pr + Offset) / 2^14 */ private double TcalcBarPress(int rawT) { long s, o, pres, val; long Pr; int Tr; Pr = rawT; // Tr = m_raw_temp; Tr = 8; // Sensitivity s = (long) c3; val = (long) c4 * Tr; s += (val >> 17); val = (long) c5 * Tr * Tr; s += (val >> 34); // Offset o = (long) c6 << 14; val = (long) c7 * Tr; o += (val >> 3); val = (long) c8 * Tr * Tr; o += (val >> 19); // Pressure (Pa) pres = ((long) (s * Pr) + o) >> 14; return (double) pres / 100; } // #define BUILD_UINT16(loByte, hiByte) ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8))) private void storeCalibrationData(int[] pData) { c1 = (pData[0] & 0x00FF) | ((pData[1] & 0x00FF) << 8); c2 = (pData[2]) | ((pData[3] & 0x00FF) << 8); c3 = (pData[4]) | ((pData[5] & 0x00FF) << 8); c4 = (pData[6]) | ((pData[7] & 0x00FF) << 8); c5 = (pData[8]) | ((pData[9] & 0x00FF) << 8); c6 = (pData[10]) | ((pData[11] & 0x00FF) << 8); c7 = (pData[12]) | ((pData[13] & 0x00FF) << 8); c8 = (pData[14]) | ((pData[15] & 0x00FF) << 8); }
C言語で記述すると次のようになります。
/* Conversion algorithm for barometer temperature * * Formula from application note, rev_X: * Ta = ((c1 * Tr) / 2^24) + (c2 / 2^10) * * c1 - c8: calibration coefficients the can be read from the sensor * c1 - c4: unsigned 16-bit integers * c5 - c8: signed 16-bit integers */ double calcBarTmp(uint16 rawT) { uint16 c1, c2; c1 = m_barCalib.c1; c2 = m_barCalib.c2; m_raw_temp = rawT; int64 temp, val; val = ((int64)(c1 * m_raw_temp) * 100); temp = (val >> 24); val = ((int64)c2 * 100); temp += (val >> 10); return ((double)temp) / 100; } /* Conversion algorithm for barometer pressure (hPa) * * Formula from application note, rev_X: * Sensitivity = (c3 + ((c4 * Tr) / 2^17) + ((c5 * Tr^2) / 2^34)) * Offset = (c6 * 2^14) + ((c7 * Tr) / 2^3) + ((c8 * Tr^2) / 2^19) * Pa = (Sensitivity * Pr + Offset) / 2^14 */ double TcalcBarPress(uint16 rawT) { int64 s, o, pres, val; uint16 c3, c4; int16 c5, c6, c7, c8; uint16 Pr; int16 Tr; Pr = rawT; Tr = m_raw_temp; c3 = m_barCalib.c3; c4 = m_barCalib.c4; c5 = m_barCalib.c5; c6 = m_barCalib.c6; c7 = m_barCalib.c7; c8 = m_barCalib.c8; // Sensitivity s = (int64)c3; val = (int64)c4 * Tr; s += (val >> 17); val = (int64)c5 * Tr * Tr; s += (val >> 34); // Offset o = (int64)c6 << 14; val = (int64)c7 * Tr; o += (val >> 3); val = (int64)c8 * Tr * Tr; o += (val >> 19); // Pressure (Pa) pres = ((int64)(s * Pr) + o) >> 14; return (double)pres/100; } #define BUILD_UINT16(loByte, hiByte) ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8))) void storeCalibrationData(uint8 *pData) { m_barCalib.c1 = BUILD_UINT16(pData[0],pData[1]); m_barCalib.c2 = BUILD_UINT16(pData[2],pData[3]); m_barCalib.c3 = BUILD_UINT16(pData[4],pData[5]); m_barCalib.c4 = BUILD_UINT16(pData[6],pData[7]); m_barCalib.c5 = BUILD_UINT16(pData[8],pData[9]); m_barCalib.c6 = BUILD_UINT16(pData[10],pData[11]); m_barCalib.c7 = BUILD_UINT16(pData[12],pData[13]); m_barCalib.c8 = BUILD_UINT16(pData[14],pData[15]); }