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
--- 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
--- 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