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

Dependents:   Mbed2_ConnectTestAll Demo_ADT7410

Files at this revision

API Documentation at this revision

Comitter:
MikamiUitOpen
Date:
Thu Apr 16 04:28:59 2020 +0000
Parent:
6:438204ab1793
Commit message:
8

Changed in this revision

ADT7410.cpp Show annotated file Show diff for this revision Revisions of this file
ADT7410.hpp Show annotated file Show diff for this revision Revisions of this file
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
diff -r 438204ab1793 -r 990e3c54ac51 ADT7410.hpp
--- a/ADT7410.hpp	Thu Apr 02 02:38:16 2020 +0000
+++ b/ADT7410.hpp	Thu Apr 16 04:28:59 2020 +0000
@@ -1,10 +1,12 @@
-//--------------------------------------------------------------
-//  Class for ADT7410 (Header)
-//      Default: 13-bit resolution
+//------------------------------------------------------------------
+//  温度センサ ADT7410 用の ADT7410 クラスのヘッダ
+//      温度の分解能のデフォルト値: 13 ビット
 //
+//  割込みサービス・ルーチン内に記述した場合に動作しない点を修正した
 //  このプログラムを作った際の mbed のリビジョン:Rev.172
-//  2020/04/02, Copyright (c) 2020 MIKAMI, Naoki
-//--------------------------------------------------------------
+//
+//  2020/04/16, Copyright (c) 2020 MIKAMI, Naoki
+//------------------------------------------------------------------
 
 #ifndef ADT7410_HPP
 #define ADT7410_HPP
@@ -16,49 +18,72 @@
     class ADT7410
     {
     public:
-        // Constructor
+        // デフォルト・コンストラクタ
 #if defined(STM32F4) || defined(STM32L0) || defined(__STM32F3xx_H)
         ADT7410(PinName sda = D14,      // SDA
                 PinName scl = D15,      // SCL
                 uint8_t addr = 0x90);   // I2C bus address
-// Default constructor is defined for only Nucleo 
+// デフォルト・コンストラクタは Nucleo のみ
 #else
         ADT7410(PinName sda,            // SDA
                 PinName scl,            // SCL
                 uint8_t addr = 0x90);   // I2C bus address
 #endif
-        // Set configuration register
-        // See Figure 15 in data sheet of ADT7410
-        void SetConfig(char val)
-        { i2c_.write(ADDR_, (char[]){CONFIG_, val}, 2); }
+        // 外部の I2C オブジェクトを与えるコンストラクタ
+        ADT7410(I2C &i2c,               // 外部の I2C オブジェクト
+                uint8_t addr = 0x90);   // I2C bus address
 
-        // Get value in configuration register
-        uint8_t GetConfig();
+        // デストラクタ
+        virtual ~ADT7410()
+        {   if (NULL != i2cPtr_) delete i2cPtr_;    }
+
+        // コンフィギュレーション・レジスタの設定
+        void SetConfig(char val) const;
 
-        // Read temperature
-        float Read();
+        // コンフィギュレーション・レジスタの読み込み
+        // ADT7410 のデータシートの Figure 17 参照
+        uint8_t GetConfig() const { return GetReg(CONFIG_); }
+
+        // 温度の読み込み
+        virtual float Read() const;
         
-        // Operator shorthand for Read()
-        operator float() { return Read(); }
+        // Read() の代わりに使える演算子
+        virtual operator float() const { return Read(); }
 
-        // Reset
-        void Reset();
+        // リセット
+        void Reset() const;
 
     protected:
-        // Register addresses
-        enum Reg { TEMPER_ = 0x00,  // Temperature value MSByte
-                   CONFIG_ = 0x03,  // Configuration
-                   RESET_  = 0x2F}; // Software reset
+        const uint8_t ADDR_;    // ADT7410 の左詰めのアドレス
 
-        // Write single byte
+        // ADT7410 の内部のレジスタのアドレス
+        enum Reg { TEMPER_ = 0x00,  // 温度レジスタの上位バイト
+                   ST_     = 0x02,  // ステータス・レジスタ
+                   CONFIG_ = 0x03,  // コンフィギュレーション・レジスタ
+                   ID_     = 0x0B,  // ID, 0xCX
+                   RESET_  = 0x2F}; // ソフトウェア・リセット
+
+        // ADT7410 内部レジスタのアドレスの送信
         // "STOP" を送らずにふたたび "START" を送る,つまりリスタート・コンディションに
         // する場合は,"repeated" を "true" にする
-        void WriteSingleByte(Reg reg, bool repeated = false)
-        { i2c_.write(ADDR_, (char []){reg}, 1, repeated); }
+        void TxRegAddr(uint8_t reg, bool repeated = false) const;
+        
+        // ステータス・レジスタの読み込み
+        uint8_t GetStatus() const { return GetReg(ST_); }
+
+        // ADT7410 の内部レジスタの 1 バイトの読み込み
+        uint8_t GetReg(Reg addr) const;
 
     private:
-        const uint8_t ADDR_;    // left-justified 7-bit slave address of ADT7410
-        I2C i2c_;               // Object of I2C
+        I2C *const i2cPtr_; // I2C オブジェクトのポインタ
+
+    protected:
+        I2C &i2c_;          // I2C オブジェクトの参照
+
+    private:
+        // コピー・コンストラクタと代入演算子関数の禁止
+        ADT7410(const ADT7410&);
+        ADT7410& operator=(const ADT7410&);
     };
 }
 #endif  // ADT7410_HPP
\ No newline at end of file