●Arduinoに温度センサを接続してみる
今回は、温度センサにNXP SemiconductorsのSE97を使用します。温度センサ(SE97)とArduinoはI2Cで接続します。ArduinoボードのSDA(データ・ライン)はアナログ入力ピン4、SCL(クロック・ライン)はアナログ入力ピン5です。温度センサのSDA、SCLそれぞれと接続してください。
今回は、温度センサにNXP SemiconductorsのSE97を使用します。温度センサ(SE97)とArduinoはI2Cで接続します。ArduinoボードのSDA(データ・ライン)はアナログ入力ピン4、SCL(クロック・ライン)はアナログ入力ピン5です。温度センサのSDA、SCLそれぞれと接続してください。
ユースカラーLCD e-DISP読者プレゼントのご案内
本記事で紹介しているe-DISPを抽選で5名様にプレゼントいたします。下記のページからご応募ください。応募ページは個人情報を登録する必要があります。また、どういう用途に使う予定かというアンケートもお願いします。 (編集部)
終了しました。https://cc.cqpub.co.jp/system/enquete_entry/44/
●温度センサから温度を読んでみる
温度センサとArduinoはI2Cで接続しました。ArduinoでI2C通信を実装するには公式ライブラリの"Wire"ライブラリを使用します。温度センサ(SE97)のデータシートを眺めながら、温度センサとの通信部分のコードを書き上げてしまいましょう。
#includeこれらのコードで、温度センサとの通信の準備をしたり、温度センサから温度を読み取ったり、マニュファクチャID、デバイスIDを取得することができます。#define SE97_SLAVE_ADRS (0x38>>1) // 初期化 void SE97_init(void) { Wire.begin(); } // センサからレジスタの値を読む uint16_t SE97_readRegister(uint8_t reg) { Wire.beginTransmission(SE97_SLAVE_ADRS); Wire.send(reg); // write reg addr Wire.endTransmission(); Wire.requestFrom(SE97_SLAVE_ADRS, 2); if(Wire.available()){ uint16_t result = Wire.receive(); result <<= 8; result |= Wire.receive(); return result; } return -1; } // センサから温度を取得 uint16_t SE97_readTemperature(void) { return SE97_readRegister(0x05); // read Temperature register } // センサからマニュファクチャIDを取得 uint16_t SE97_readManufacturesID(void) { return SE97_readRegister(0x06); // read Manufacturer ID register } // センサからデバイスIDとリビジョンを取得 uint16_t SE97_readDeviceID(void) { return SE97_readRegister(0x07); // read Device ID/Revision register }
では、実際に温度センサから温度を読んでみましょう。
void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
mySerial.begin(9600); // スピードを設定
SE97_init(); // 温度センサを初期化
}
void loop() {
delay(1000);
uint16_t temp;
temp = SE97_readTemperature();// 温度符号を読む
mySerial.print("temp=");
mySerial.println((long)temp);
}
センサから読み取った値(温度を示す符号)を、10進数で表示しています。温度が変わるたびに数値が変化します。だけど、意味のわからない数値が表示されます。温度センサ(SE97)の仕様書を見てみると、温度を示す符号の意味は次のように書いてあります。
ACT、AAW、BAWは、今回は使用しません。マスクして取り除いてしまいましょう。
SIGNは、符号を示すビットです。TEMPは、温度を示すビットです。温度値は2の補数表現なので、負の値を示すときは、温度値の全ビットを反転して1を足すことで実際の温度を得ることができます。
温度符号を、見てわかりやすい数値に変換するために、次のような関数を用意しました。
// 温度符号を数値(x1000)に変換
long TempToLong(word temp) {
boolean sign = false;
long value = 0;
if(temp & 0x1000) { // sign
sign = true; // 符号あり
temp = ~temp; // 1の補数
temp += 1; // 2の補数
}
temp &= 0x0FFF; // MSB4ビット(フラグ部分と符合部分)をカット
value = ((long)(temp>>4)*1000); // 整数部
value += (((temp&0x8)!=0)*500); // 小数部の精度は0.5
value += (((temp&0x4)!=0)*250); // 小数部の精度は0.25
value += (((temp&0x2)!=0)*125); // 小数部の精度は0.125
value = (sign) ? -value : value;
return value;
}
数値に変換した温度値を、文字列で表示するために、次のような関数を用意しました。// 温度を表示
void printTemperature(long temp) {
mySerial.print("温度:");
mySerial.print((temp<0)?"-":"+"); // 符号
temp = (temp<0) ? -temp : temp; // 符号を取り除く
mySerial.print(temp/1000); // 整数部
mySerial.print("."); // 小数点
mySerial.print((temp%1000)/100); // 小数部(精度は0.5)
mySerial.print("℃");
mySerial.print("\x1B[K");// カーソル位置からカーソル位置の行の右端までの文字を削除します。
楠川 歩
e-DISP入手先 (株)ディーディーエル


コメントする