I2C 接続の温度センサ ADT7410 用のライブラリ. Library for temperature sensor ADT7410 connected using I2C interface.
Dependents: Mbed2_ConnectTestAll Demo_ADT7410
Revision 7:990e3c54ac51, committed 2020-04-16
- 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