テレビの天気予報では、0.1℃単位で温度が表示されます。温度計は、とうぜん気象庁の校正を受けていなければ、うそっこのデータになります。校正といえば、費用と時間がかかります。ここでは、±0.1℃がメーカによって保証?されているTMP117を使います。
データシートに書かれている特徴です。
ASTME1112およびISO 80601の電子医療体温計の要件を満
たすように設計されています。較正不要で、-20°C~50℃
の温度範囲にわたって0.0078℃の分解能、最大±0.1℃
の精度で16ビットの温度結果を提供します。
###TMP117のおもなスペック
- 動作電圧 1.8~5.5V
- 分解能 16ビット、LSBは0.007812℃
- 動作温度範囲 -55~150℃
- 確度
- -20~+50℃ の範囲で±0.1℃ (最大値)
- -40~+100℃ の範囲で±0.2℃ (最大値)
- -55~+150℃ の範囲で±0.3℃ (最大値)
- 消費電流 1Hzの変換サイクルで3.5uA
- インターフェース I2C(1~400kHz)
- データ長 2の補数形式の16ビット
- 平均化出力が可能
- 温度設定のアラートあり
###評価ボードを加工
とても小さいパッケージなので、手はんだは困難です。評価ボードTMP117EVMを入手しました。使用例は、こちらを参照してください。
ケーブルをはんだ付けし、先端にコネクタを圧着し、ラズパイとの接続に使います。
###接続
SDAをラズパイの3番(GPIO2)、SCLを5番(GPIO4)に接続します。GNDはGNDへ、V+は3.3Vへ接続します。アラート出力のALRTは、今回使いません。
###スレーブ・アドレス
切り離したセンサ部分の基板上にはR16が取り付けられている(ADD0がGNDに接続)ので、スレーブ・アドレスは0x48です。
プログラムで確認します。ラズパイのセットアップは、前回の記事を参照してください。
clear all
rpi = raspi('192.168.111.114', 'pi', 'raspberry');
for i = 1:length(rpi.AvailableI2CBuses)
scanI2CBus(rpi, rpi.AvailableI2CBuses{i})
end
0x48が返りました。
###プログラム
ConfigurationRegister に各種設定を書き込みます。データシートには、factory default reset = 0220hと書かれています。
Conversion cycle bitが'100'です。変更する必要はなかったのですが、'000'にしました。
Conversion averaging modesは'01': 8 Averaged conversionsです。'11': 64 averaged conversionsに変更しました。この時、変換時間は1秒になります。
10回繰り返して温度を読み出します。分解能を見たいがために小数点第5位まで表示していますが、確度はそこまで取れません。
パッケージが小さいので、レスポンスはよいです。
読み出したデータは、16ビット長 2の補数形式なので、一度dec2bin()でバイナリの文字列に変換します。この文字列の前に接頭語'0b'をくっつけ、後ろに接尾辞's16'をつなげます。その文字列をbin2dec()で10進数に変換すると、先頭が'1'であればマイナスの符号の処理が行われます(R2020a以降)。
clear all
rpi = raspi('192.168.111.114', 'pi', 'raspberry'); % host name raspberrypi-uMchsTIvew
% for i = 1:length(rpi.AvailableI2CBuses)
% scanI2CBus(rpi, rpi.AvailableI2CBuses{i})
% end
tmp117 = i2cdev(rpi, 'i2c-1', '0x48');
TemperatureRegister = 0x00;
ConfigurationRegister = 0x01;
Ctrl_OUT = [0x00, 0x60]; % Continuous conversion,Conversion cycle=000,averaging=11 is 64...1sec
writeRegister(tmp117, ConfigurationRegister, Ctrl_OUT, 'uint8');
for i=1:10
RegisterData = readRegister(tmp117, TemperatureRegister, 2);
temperature = double(bitshift(uint16(RegisterData(1)), 8)) + double(RegisterData(2));
temperature = bin2dec(append('0b',dec2bin(temperature),'s16'))* 0.0078125; % 2's complement R2020a
fprintf(' temperature is %.5f \n', temperature);
pause(2);
end