● 温度センサから取得した温度をe-DISPに表示してみる
 前の章で、温度センサから温度符号を取得して、見た目にわかりやすい温度値として表示するための関数の準備を行ってきました。これらの関数を使って、センサから読んだ温度をe-DISPに表示するためのコードを完成させましょう。
void loop() {
  delay(1000);

  // 温度を読む
  uint16_t temp_code;
  temp_code = SE97_readTemperature();// 温度符号を読む
  temp_code &= 0xFFF8;// 小数部の精度を0.5に落とす
  long temp;
  temp = TempToLong(temp_code);// 温度符号を数値に変換
    
  // 温度を表示
  mySerial.print("\x1B[7;15H"); // カーソルを(15,7)に移動
  printTemperature(temp);
}
 1秒ごとにセンサから温度を読み取って、カーソル位置(15,7)に温度を表示するコードが完成しました。

5-1.jpg
  どうでしょう? e-DISPをArduinoにつなげることで、センサから読んだ値を簡単に表示できることを感じていただけたでしょうか?センサから読んだ値を棒グラフにして表示してみたりとか、アイデア次第でいろいろ可能性が広がります。

5-2.jpghttp://ddlab.jp/shop/edisp/



※参考
・回路図:Arduino2eDISP回路図.pdf

・温度情報を文字で表示するデモ・プログラム:sketch_eDispTemperature_090723a.pde

・温度情報を文字とバーグラフで表示するデモ・プログラム:sketch_eDispTemperature2_090723a.pde
 

● 今回作成したスケッチの全体像
#include   // ライブラリの導入

#define rxPin 2
#define txPin 3

// 新たなシリアルポートを設定
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup() {
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT); // DIGITAL3番ピンをシリアルのTX(出力)として使う

  mySerial.begin(9600);    // スピードを設定

  SE97_init();  // 温度センサを初期化
  
  mySerial.print("\x1B@6Z"); // 文字サイズを大(8x16)に設定
    mySerial.print("\x1B@3Z"); // 文字コードをUTF-8 に設定
  mySerial.print("\x1B[>5h"); // カーソル表示をOFF にします。
}

void loop() {
  delay(1000);

  // 温度を読む
  uint16_t temp_code;
  temp_code = SE97_readTemperature();// 温度符号を読む
  temp_code &= 0xFFF8;// 小数部の精度を0.5に落とす
  long temp;
  temp = TempToLong(temp_code);// 温度符号を数値に変換
    
  // 温度を表示
  setCursor(15, 7); // カーソルを(15,7)に移動
  printTemperature(temp);
}

// 温度を表示
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");// カーソル位置からカーソル位置の行の右端までの文字を削除します。
}
 
// 温度符号を数値(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;
}


/********************************************************************************
 * 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
}


/********************************************************************************
 * e-DISP
 ********************************************************************************/
// カーソルを(y)行(x)列に移動します
void setCursor(int x, int y) {
    mySerial.print("\x1B[");
    mySerial.print(y);
    mySerial.print(";");
    mySerial.print(x);
    mySerial.print("H");
}

// 四角形の単色データを背景に表示します。
void box(int buffer, int width, int height, int x, int y, word color) {
    mySerial.print("\x1B@0;");
    mySerial.print(buffer); mySerial.print(";");
    mySerial.print(width); mySerial.print(";");
    mySerial.print(height); mySerial.print(";");
    mySerial.print(x); mySerial.print(";");
    mySerial.print(y); mySerial.print(";");
    mySerial.print(color); mySerial.print("z");
}

// (x0,y0)-(x1,y1)間にラインを表示します。
void line(int buffer, int x0, int y0, int x1, int y1, word color) {
    mySerial.print("\x1B@2;");
    mySerial.print(buffer); mySerial.print(";");
    mySerial.print(x0); mySerial.print(";");
    mySerial.print(y0); mySerial.print(";");
    mySerial.print(x1); mySerial.print(";");
    mySerial.print(y1); mySerial.print(";");
    mySerial.print(color); mySerial.print("z");
}
楠川 歩

e-DISP入手先 (株)ディーディーエル


トラックバック(0)

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

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

コメントする

カテゴリ

このブログ記事について

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

ひとつ前のブログ記事は「エレキジャックNo.14「FunnelとPepperを使って省エネ・センサを作ろう」フォローアップ記事(2)」です。

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

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

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