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);
}

 実行結果です。

前へ

SpresenseでLチカから始める (16) Wireライブラリ 温度TMP116

次へ

SpresenseでLチカから始める (18) Wireライブラリ 温度S-5851A