SpresenseでLチカから始める (16) Wireライブラリ 温度TMP116
テレビの天気予報を見ていると、かならず温度は小数点第一位までを表示しています。多くの温度センサの確度はよくても±0.5℃ですから、校正なしでは0.1℃の表示はできません。校正機関は気象庁が紹介してくれます。
テキサス・インスツルメンツの温度センサTMP116は±0.1℃(typical)です。校正なしでこの確度が保証されます。2mm角ととても小さいので、温度変化にも素早く反応しそうです。評価用ボードはこちらで紹介しました。
TMP116の部分だけを切り離して、Wireライブラリで通信します。
●TMP116のおもな特徴
- 電源電圧 1.9~5.5V
- 消費電流 3.5µA。シャットダウン時250nA
- 測定温度範囲 -40~125℃。0.0078℃ の分解能(16 ビット)で±0.1℃ (–10~+85℃、V+=3.3V)の確度
- インターフェース I2C(1~400kHz)
- データ長 2の補数形式の16ビット
●主なレジスタ
ポインタ・ レジスタ |
機能 | 初期値 |
---|---|---|
0x00 | 温度データ | 0x8000 |
0x01 | コンフィギュレーション | 0x0220 |
0x02 | リミット上限 | 0x6000 |
0x03 | リミット下限 | 0x8000 |
(※)コンフィギュレーションの初期値0x0220では、連続変換、変換時間250ms、平均化は8回などが設定されている。
●接続
Alertは使っていません。基板上でADD0端子はGNDに接続されているのでスレーブ・アドレスは0x48です。3.3Vで動作させました。5V時より消費電力が下がります。
●スケッチ
#include <Wire.h>
#define TMP116address 0x48
#define TemperatureR 0x00
void setup() {
Wire.begin();
Serial.begin(9600);
}
int read_tempdata() {
Wire.beginTransmission(TMP116address);
Wire.write((byte)TemperatureR);
Wire.endTransmission();
Wire.requestFrom(TMP116address, 2);
//wait for response
while(Wire.available() == 0);
int T = Wire.read();
T = T << 8 | Wire.read() ;
return ( -(T & 0b1000000000000000) | (T & 0b0111111111111111) );
}
void loop() {
float Temp = read_tempdata() * 7.8125 /1000.0;
// Serial.print(String(read_tempdata(),BIN) +" ");
Serial.println(Temp,2);
delay(1000);
}
実行結果です。