●Arduinoに温度センサを接続してみる
 今回は、温度センサに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/

4-1.jpg
●温度センサから温度を読んでみる
 温度センサとArduinoはI2Cで接続しました。ArduinoでI2C通信を実装するには公式ライブラリの"Wire"ライブラリを使用します。温度センサ(SE97)のデータシートを眺めながら、温度センサとの通信部分のコードを書き上げてしまいましょう。
#include 
#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
}
 これらのコードで、温度センサとの通信の準備をしたり、温度センサから温度を読み取ったり、マニュファクチャID、デバイスIDを取得することができます。
 では、実際に温度センサから温度を読んでみましょう。
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)の仕様書を見てみると、温度を示す符号の意味は次のように書いてあります。

4-2.jpg
 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入手先 (株)ディーディーエル




トラックバック(0)

このブログ記事を参照しているブログ一覧: Arduinoにリユース・カラーLCD「e-DISP(イーディスプ)」をつなぐ (その4)

このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/3199

コメントする

カテゴリ

このブログ記事について

このページは、yoshidaが2009年8月13日 10:50に書いたブログ記事です。

ひとつ前のブログ記事は「Arduino MEGAを使ったLEDマトリクスによる漢字ティッカの製作 その2」です。

次のブログ記事は「連載(48)Arduinoで何でも制御K型熱電対でローストビーフの内部の温度をモニタ(3)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.