温度センサADT7410 16bit 4Chサンプリング

#秋月で売ってる。ADT7410、温度センサ
http://akizukidenshi.com/catalog/g/gM-06675/

##せっかく4ch分アドレスがあるというのに（　＾ω＾）・・・
4ch同時にサンプリングしてる人はいないなぁと思い、Arduinoスケッチを書いてみることにした。

Arduinoやってるひとは、所詮コピペプログラマが多く、再現性が大事で
昼間から炭酸麦茶キメてる人でも、コピペしたら動くものじゃないと発狂してしまうので。
尊敬する藤原 麻里菜 (@togenkyoo) on Twitter メソッドによって解決することにした。

##回路は、ArduinoにI2Cデイジーチェーンで接続。
アドレスを4つはんだジャンパーして出来上がり


####wsnakさんのブログからソースをお借りする。
http://www.wsnak.com/wsnakblog/?p=409

4ch分コピペして出来上がり。


##ソース
Wire.hライブラリのみインポートすれば使えるようになる。

```ADT7410_16bit_4Ch.c
//温度センサADT7410 16bit 4Chサンプリング
//温度精度は±0.5℃。-40℃～+105℃（2.7V～3.6V）の範囲。-40℃～+105℃の範囲で計測可能。16ビットの値を取得可能。分解能は0.0078℃。

#include <Wire.h>
int I2CAdrs0;
int I2CAdrs1;
int I2CAdrs2;
int I2CAdrs3;


// 初期化
void setup(void) {
  I2CAdrs0 = 0x48;
  I2CAdrs1 = 0x49;
  I2CAdrs2 = 0x4A;
  I2CAdrs3 = 0x4B;
  
  Serial.begin(19200);
  Wire.begin();       // マスタ初期化

  Wire.beginTransmission(I2CAdrs0);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x00 | 0x80);          // SLEEP mode 設定 0110 0000
  Wire.endTransmission();           // ストップ・コンディション

  Wire.beginTransmission(I2CAdrs1);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x00 | 0x80);          // SLEEP mode 設定 0110 0000
  Wire.endTransmission();           // ストップ・コンディション

  Wire.beginTransmission(I2CAdrs2);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x00 | 0x80);          // SLEEP mode 設定 0110 0000
  Wire.endTransmission();           // ストップ・コンディション

  Wire.beginTransmission(I2CAdrs3);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x00 | 0x80);          // SLEEP mode 設定 0110 0000
  Wire.endTransmission();           // ストップ・コンディション
}
  
// メインループ
void loop(void) {
  uint16_t val0;
  uint16_t val1;
  uint16_t val2;
  uint16_t val3;
  
  float tmp0;
  float tmp1;
  float tmp2;
  float tmp3;
  
  long int ival0;
  long int ival1;
  long int ival2;
  long int ival3;

//CH0----------------------------------------------------------------------
  Wire.requestFrom(I2CAdrs0, 2);       // S.C発行,CB送信
  val0 = (uint16_t)Wire.read() << 8;   // データの読み出し(上位)
  val0 |= Wire.read();                 // データの読み出し(下位)
 
  ival0 = (long int)val0;
  if(val0 & 0x8000) {         // 符号判定
    // 負数
    ival0 = ival0 - 65536;
  }
  tmp0 = (float)ival0 / 128.0;
//CH1----------------------------------------------------------------------
  Wire.requestFrom(I2CAdrs1, 2);       // S.C発行,CB送信
  val1 = (uint16_t)Wire.read() << 8;   // データの読み出し(上位)
  val1 |= Wire.read();                 // データの読み出し(下位)
 
  ival1 = (long int)val1;
  if(val1 & 0x8000) {         // 符号判定
    // 負数
    ival1 = ival1 - 65536;
  }
  tmp1 = (float)ival1 / 128.0;
//CH2----------------------------------------------------------------------
  Wire.requestFrom(I2CAdrs2, 2);       // S.C発行,CB送信
  val2 = (uint16_t)Wire.read() << 8;   // データの読み出し(上位)
  val2 |= Wire.read();                 // データの読み出し(下位)
 
  ival2 = (long int)val2;
  if(val2 & 0x8000) {         // 符号判定
    // 負数
    ival2 = ival2 - 65536;
  }
  tmp2 = (float)ival2 / 128.0;
//CH3----------------------------------------------------------------------
  Wire.requestFrom(I2CAdrs3, 2);       // S.C発行,CB送信
  val3 = (uint16_t)Wire.read() << 8;   // データの読み出し(上位)
  val3 |= Wire.read();                 // データの読み出し(下位)
 
  ival3 = (long int)val3;
  if(val3 & 0x8000) {         // 符号判定
    // 負数
    ival3 = ival3 - 65536;
  }
  tmp3 = (float)ival3 / 128.0;
//----------------------------------------------------------------------  
  
  
  Serial.print(tmp0, 5);
  Serial.print(",");
  Serial.print(tmp1, 5);
  Serial.print(",");
  Serial.print(tmp2, 5);
  Serial.print(",");
  Serial.println(tmp3, 5); 
  delay(250);
}
```


シリアルプロッター機能で確認すれば、こんな感じに表示される。
実にお手軽で、高精度が得られる。アナデバ素晴らしい。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/164180/3705bcaa-1ab6-f482-90e3-a29a720e7db2.png)