● 温度センサから取得した温度をe-DISPに表示してみる
前の章で、温度センサから温度符号を取得して、見た目にわかりやすい温度値として表示するための関数の準備を行ってきました。これらの関数を使って、センサから読んだ温度を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)に温度を表示するコードが完成しました。どうでしょう? e-DISPをArduinoにつなげることで、センサから読んだ値を簡単に表示できることを感じていただけたでしょうか?センサから読んだ値を棒グラフにして表示してみたりとか、アイデア次第でいろいろ可能性が広がります。
※参考
・回路図: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入手先 (株)ディーディーエル


コメントする