SpresenseでLチカから始める (17) Wireライブラリ 温度STTS751-0
STTS751は、2009年ごろに発売されたSTMicroelectronicsの温度センサです。同社の温度センサのリストです。秋月電子通商で入手しました。
●STTS751のおもな特徴
- 電源電圧 2.25~3.6V
- 消費電流 20uA(1回/秒)。スタンバイ時3uA
- 測定温度範囲 -40~125℃。0.0625℃ の分解能(12ビット)で±1.0℃ (0~+85℃)の確度
- インターフェース I2C(最大400kHz)
- データ長 2の補数形式の9/10/11/12ビット
- スレーブ・アドレス AddrピンをGNDに落としたときSTTS751-0は0x72、STTS751-1は0x76。AddrピンをVddにプルアップするときの抵抗の値によって変更できる。利用したのはSTTS751-0だが、I2C-scannerでは1ビット・シフトした0x39が見つかった。
●おもなレジスタ
ポインタ・ レジスタ |
機能 | 初期値 |
---|---|---|
0x00 | 温度データの上位バイト | 不定 |
0x01 | ステータス | 不定 |
0x02 | 温度データの下位バイト | 不定 |
0x03 | コンフィギュレーション | 0x0000 |
(※)温度データは12ビット2の補数形式。上位バイトに上位8ビットが、下位バイトにはMSBから4ビット分が入る。コンフィギュレーションの初期値0x0000では、連続変換モードでをrunさせる設定。
●接続
1番ピンAddrは変換基板上でGNDにつないで、0x72(0x39)に設定しました。5番ピンはEvent出力です。上限温度(デフォルトは85℃)を設定し、設定温度を超えるとこの端子をLowにします。今回利用していませんが、デフォルトで有効になっています。
Spresenseは3.3Vで動作させました。
●スケッチ
setup()内でデフォルトの10ビットから12ビットへ変更します。
最初に、左詰めで記録されている16ビット分を読み出し、右に4ビット・シフトすれば12ビットの温度データが用意でき、LSBが1/16℃なので乗ずれば摂氏の温度になります。
#include <Wire.h>
#define STTS751address 0x39
#define TemperatureR_high 0x00
#define TemperatureR_low 0x02
#define ConfigurationR 0x03
#define bitSet12 0x0c // Tres1=1,Tres0=1
void setup() {
Wire.begin();
Serial.begin(9600);
Wire.beginTransmission(STTS751address);
Wire.write((byte)ConfigurationR);
Wire.write((byte)bitSet12); // 10->12bit
Wire.endTransmission();
}
int read_tempdata() {
Wire.beginTransmission(STTS751address);
Wire.write((byte)TemperatureR_high);
Wire.endTransmission();
Wire.requestFrom(STTS751address, 1);
//wait for response
while(Wire.available() == 0);
int TH = Wire.read(); // Serial.println(TH,BIN); // High byte
Wire.beginTransmission(STTS751address);
Wire.write((byte)TemperatureR_low);
Wire.endTransmission();
Wire.requestFrom(STTS751address, 1);
//wait for response
while(Wire.available() == 0);
int TL = Wire.read(); // Serial.println(TL,BIN); // Low byte
int T = ( TH << 8 | TL ) >> 4 ;
return ( -(T & 0b100000000000) | (T & 0b011111111111) );
}
void loop() {
float Temp = read_tempdata() *(1.0/16.0);
// Serial.print(String(read_tempdata(),BIN) +" ");
Serial.println(Temp,2);
delay(1000);
}
実行結果です。