2009/08/12

ArduinoにLCDを付けて温度計を表示させてみた

ArduinoでLCDがようやく動きました。温度計を読んでLCDに表示するコードは以下の通り。簡略化版です。
Arduino with LCD & Temperature Sensor

「LiquidCrystal lcd(...)」は、コード上のオブジェクト定義と共に、LCDのイニシャライズも行います。ここで、一般的に手に入るLCDはPowerON後に数十ms待たなければならない仕様になっているのですが、LiquidCrystal の中では立ち上がり時のDelayを入れている雰囲気はありませんでした。

よって、setup で delay を入れてもう一度イニシャライズをかける必要があります。尚、最初のイニシャライズは、lcdというオブジェクトにloop関数がアクセスするために必要です。また、最初のlcdの前にdelayを入れても見ましたが、loopやsetup以外ではdelayは使えないみたいで、Compileが通りませんでした。

更に、setup のみでlcdを宣言すると、setup内のローカルなオブジェクトと見なされるらしく、loopからはアクセスできませんでした。これもCompileが通りません。結果的に、グローバルスコープのlcdとsetup内部のlcdの、二つのオブジェクトが重複することになります。一方のオブジェクト分だけメモリが無駄になっているのは、ちょっと心残りですね。ですが、いくつオブジェクトを作ろうと、ハードウェアは一つなのでイニシャライズはちゃんとかかります。

#include <LiquidCrystal.h>

/*** PIN Definition ***/
int rs = 7;
int rw = 6;
int en = 5;
int d4 = 3;
int d5 = 2;
int d6 = 9;
int d7 = 8;
int ANPIN_Temp = 0; /* Analog Input Pin */

double sumTemp = 0;
double dispTemp = 0;

/* 1st init: No delay after PowerON */
LiquidCrystal lcd(rs, rw, en, d4, d5, d6, d7);

void setup()
{
delay(100);
/* 2nd init: With delay after PowerON */
LiquidCrystal lcd(rs, rw, en, d4, d5, d6, d7);
delay(100);
}

void loop()
{
sumTemp = analogRead(ANPIN_Temp);

/* Ave. Temp.[bit] x 5V / 1024bit x (1c / 0.01V) */
dispTemp = sumTemp * 5 / 1024 * 100;

/* Display Temperature to LCD */
lcd.setCursor(0, 1); /* Set to 2nd Row */
lcd.print(dispTemp); /* Print Temperature */
lcd.print("c"); /* Print Celsius */
delay(1000);
}


<関連記事>
Arduinoに液晶ディスプレイを付ける
Arduinoに温度センサーを付けてみた
Arduinoの開発環境構築はすげぇ簡単

<追伸>
今日は会津若松に行ってきました。なぜかと言われるとなぜかわかりませんが、なんか思い当たったのが会津若松でした。温泉街があるということだったので、一応風呂の準備はしていったのですが、夏場は清掃しているらしくやってませんでした。まあ、この暑い中に温泉入ろうなんてのが間違っているかも。でも、街中の鶴ヶ城を見たり、猪苗代湖に行ったりと、結構充実しましたね。意外に住みやすそうなんだよなぁ、会津若松。僕はああいう街並み結構好きですね。長野の松本もあんな感じだったような。メジャーな城があると、城を中心に碁盤の目状態できっちりと街作りが行われているので、街がすっきりして見えるのかもしれませんね。
鶴ヶ城