I2C 接続の温度センサ ADT7410 用のライブラリ. Library for temperature sensor ADT7410 connected using I2C interface.

Dependents:   Mbed2_ConnectTestAll Demo_ADT7410

Revision:
7:990e3c54ac51
Parent:
6:438204ab1793
diff -r 438204ab1793 -r 990e3c54ac51 ADT7410.cpp
--- a/ADT7410.cpp	Thu Apr 02 02:38:16 2020 +0000
+++ b/ADT7410.cpp	Thu Apr 16 04:28:59 2020 +0000
@@ -1,54 +1,75 @@
 //--------------------------------------------------------------
-//  Class for ADT7410
-//      Default: 13-bit resolution
+//  ADT7410 クラスのメンバ関数の定義
 //
-//  このプログラムを作った際の mbed のリビジョン:Rev.172
-//  2020/04/02, Copyright (c) 2020 MIKAMI, Naoki
+//  2020/04/16, Copyright (c) 2020 MIKAMI, Naoki
 //--------------------------------------------------------------
 
 #include "ADT7410.hpp"
 
 namespace Mikami
 {
-    // Constructor
+    // コンストラクタ
     ADT7410::ADT7410(PinName sda, PinName scl, uint8_t addr)
-        : ADDR_(addr), i2c_(sda, scl)
+        : ADDR_(addr), i2cPtr_(new I2C(sda, scl)), i2c_(*i2cPtr_)
+    {   Reset(); }
+
+    // 外部の I2C オブジェクトを与えるコンストラクタ
+    ADT7410::ADT7410(I2C &i2c, uint8_t addr)
+        : ADDR_(addr), i2cPtr_(NULL), i2c_(i2c)
     {   Reset(); }
 
-    // Get value in configuration register
-    // See Figure 17 in data sheet of ADT7410
-    uint8_t ADT7410::GetConfig()
+    // コンフィギュレーション・レジスタの設定
+    // ADT7410 のデータシートの Figure 15 参照
+    void ADT7410::SetConfig(char val) const
     {
-        WriteSingleByte(CONFIG_, true);
-
-        char rReg[1];
-        i2c_.read(ADDR_, rReg, 1);
-
-        return rReg[0];
+        TxRegAddr(CONFIG_, true);
+        i2c_.write(val);
+        i2c_.stop();
     }
 
-    // Read temperature
-    // See Figure 18 in data sheet of ADT7410
-    float ADT7410::Read()
+    // 温度の読み込み
+    // ADT7410 のデータシートの Figure 18 参照
+    float ADT7410::Read() const
     {
-        WriteSingleByte(TEMPER_, true);
+        TxRegAddr(TEMPER_, true);
+        i2c_.start();
+        i2c_.write(ADDR_ | 0x01);
+        uint8_t valH = i2c_.read(1);
+        int16_t value = (valH << 8) | i2c_.read(0);
+        i2c_.stop();
 
-        char rReg[2];
-        i2c_.read(ADDR_, rReg, 2);
-
-        int16_t value = (rReg[0] << 8) | rReg[1];
         if ( (GetConfig() & 0x80) == 0x00 )
-            value &= 0xfff8;        // For 13-bit resolution
-
+            value &= 0xfff8;        // 分解能: 13 ビットの場合
         return value/128.0f;
     }
 
-    // Reset
-    // See p.19 in data sheet Rev.A of ADT7410
-    void ADT7410::Reset()
+    // リセット
+    // ADT7410 のデータシート Rev.A の p.19 参照
+    void ADT7410::Reset() const
     {
-        WriteSingleByte(RESET_);
+        TxRegAddr(RESET_);
         wait_ms(250);
+        // 分解能: 13 ビット,continuous 変換モード に設定
         SetConfig(0x00);
     }
+    
+    // ADT7410 内部レジスタのアドレスの送信
+    void ADT7410::TxRegAddr(uint8_t reg, bool repeated) const
+    {
+        i2c_.start();
+        i2c_.write(ADDR_);
+        i2c_.write(reg);
+        if (!repeated) i2c_.stop(); 
+    }
+
+    // ADT7410 の内部レジスタの 1 バイトの読み込み
+    uint8_t ADT7410::GetReg(Reg addr) const
+    {
+        TxRegAddr(addr, true);
+        i2c_.start();
+        i2c_.write(ADDR_ | 0x01);
+        uint8_t val = i2c_.read(0);
+        i2c_.stop();
+        return val;
+    }
 }
\ No newline at end of file