今回は16ビット精度で温度を読み出してみます。
●16bitモード
と言ってもADT7410側の対応は、動作モード設定の際にコンフィギュレーション・レジスタ(Configuration register)のbit7を”1″にするだけです。
読み出した値は16ビットまるまるAD変換された温度値ですので、そのまま摂氏温度の換算に使えます。今回は負数の場合に65536を減算する関係で、読み出したAD変換値を一旦32bitのlong型にして減算したあとにfloat型に戻して余算しています。
サンプルスケッチを次に示しますが、全動作モードを組み込んで、if-defで切り替えるようにしてありますので、あらかじめ希望のdefine文のコメントを外して1づたけ有効化してから実行してください。
// ********** どれか一つを有効化(コメントアウトを外す) ******* //#define SLEEP //#define ONESHOT #define NORM //#define SPS // *********************************************************** #include <Wire.h> int I2CAdrs; // 初期化 void setup(void) { I2CAdrs = 0x48; Serial.begin(19200); Wire.begin(); // マスタ初期化 #ifdef NORM // ノーマル Wire.beginTransmission(I2CAdrs); // S.C発行,CB送信 Wire.write(0x03); // Configuration register 選択 Wire.write(0x00 | 0x80); // SLEEP mode 設定 0110 0000 Wire.endTransmission(); // ストップ・コンディション #endif #ifdef SPS // SPS Wire.beginTransmission(I2CAdrs); // S.C発行,CB送信 Wire.write(0x03); // Configuration register 選択 Wire.write(0x40 | 0x80); // one-shot mode 設定 0100 0000 Wire.endTransmission(); // ストップ・コンディション #endif #ifdef SLEEP // スリープ Wire.beginTransmission(I2CAdrs); // S.C発行,CB送信 Wire.write(0x03); // Configuration register 選択 Wire.write(0x60); // SLEEP mode 設定 0110 0000 Wire.endTransmission(); // ストップ・コンディション #endif } // メインループ void loop(void) { uint16_t val; float tmp; long int ival; #ifdef ONSHOT // ワンショット リトリガ再設定 Wire.beginTransmission(I2CAdrs); // S.C発行,CB送信 Wire.write(0x03); // Configuration register 選択 Wire.write(0x20 | 0x80); // one-shot mode 設定 Wire.endTransmission(); // ストップ・コンディション delay(240); #endif Wire.requestFrom(I2CAdrs, 2); // S.C発行,CB送信 val = (uint16_t)Wire.read() << 8; // データの読み出し(上位) val |= Wire.read(); // データの読み出し(下位) ival = (long int)val; if(val & 0x8000) { // 符号判定 // 負数 ival = ival - 65536; } tmp = (float)ival / 128.0; Serial.println(tmp, 2); // xx.xx delay(1000); }
表示される温度は、見かけ上は13ビットの時と変わりませんが、小数点以下の値の変化量が細かくなっているはずです。
次回はI2C制御のLCDをI2Cバスに並列に接続して、温度値をLCDへ表示させます。
(続く)