内容はかぶってしまいますが、違う温度センサーを使って温度を測定してみました。
このセンサーは、-40℃~+125℃の範囲で測定できます。氷点下の温度が測りたい人にはいいかもしれません。
national Semiconductor製 LM60BIZ(TO-92) 温度センサー
+6.25mV/℃ 1℃温度が上がると、6.25mVずつ増加
0℃のとき、424mV流れる
ex)25℃ のときは、424+25×6.25≒580mV
http://akizukidenshi.com/catalog/g/gI-02490/
プログラムの流れは
1)変数を用意
2)アナログ入力値を読み取る
3)読み取ったアナログ入力値を0.1秒×10 回読み取り、加算する
4)10回加算したアナログ値を10で割り、平均の入力値を出す。
5)mapをつかって、0から1023の入力値を電圧値である0~5000へリマッピングする
6)温度を計算するために、入力値-424(mV) を6.25で割る。
7)シリアルモニタへ出力
8)変数をすべてリセット
です。
センサーとArduinoの接続は、前出のpolanetさんと同じです。
http://ken-nou-kou.blogspot.com/2009/06/blog-post_14.html
//-------------Arduino code--------------------
long val = 0;//センサーからの入力値の変数 (なぜかintだと上手くいかず。longにした)
long val_2 = 0;//入力値を一時的に足す変数
float ave_val = 0;//入力値の平均用変数
float re_volt = 0;//リマッピング用変数
float temp = 0;//温度変数
void setup(){
Serial.begin(9600); // シリアルポートを9600bpsで開く
}
void loop(){
for (int i=0; i < 10; i++){
val = analogRead(0);//アナログ入力ピン0番の値
val_2 += val; //入力値を足していく
delay(100);//0.1秒ごとに測定
}
ave_val = val_2*0.1;
re_volt = map(ave_val,0,1023,0,5000);//10ビットの入力値を0~5000mvへリマッピング
temp = (re_volt-424)/6.25;//電圧から温度に変換
Serial.print("temp.");//シリアルモニタに"temp."文字を送る
Serial.println(temp);//シリアルモニタに温度を送る
//それぞれの変数をリセット
val = 0;
val_2 = 0;
ave_val = 0;
temp = 0;
re_volt = 0;
}
なぜかよくわかりませんが、変数をintではなくlongにするとうまくいきました。
返信削除intのままだと、値にマイナスが付いてしまい、計算がうまくいきませんでした。だれか知っている方がいらっしゃったら教えてください。
intのかわりにunsigned int(符号なし:+のみの整数)をつかってみてはどうでしょう?
返信削除あるいは、平均値を求めるところを、ave_valをint型(もしくはunsigned int型)にして、
ave_val = val_2/10;
としてfloatを使わないで整数値だけの計算にしてみてはどうでしょう?
map()で入力値の範囲が0~1023の整数値なので、floatをつかわなくても大丈夫なはず。
それにつられて、valやre_voltもint型(もしくはunsigned int型)にし、最終的に温度tempだけをfloatにすればいいのかもしれません。
途中の計算でfloatを使わないでintで済むのであれば、演算コストを軽減させることも含め、計算する順番とか、割り算よりは掛け算をつかうとか、工夫するといいのかもしれません。
僕もLM60BIZでやってみました。1秒ごとなので変化が早いです。
返信削除演算効率といえば、配列を操作する関数がないですね。当初、計測温度をとりあえず配列に入れておいて、最大と最小をその配列から取得しようと考えていたのですが、メモリを大切に使いましょうという言語仕様ですね。
あと、
返信削除for文の行が文字化けしています。
for (int i=0; i<10;>
は、
for (int i=0; i<10; i++) {
とやるといいかと思います。
kousakuさんのアドバイスでもありましたが、
ブログ編集の時に「<」や「>」の周辺は要注意です。
polanetさん
返信削除ご指摘ありがとうございます。
修正しときました。
kousakuさん
返信削除ご指摘のとおりにしたらうまく動作しました。
メモリの量を節約とかまでまだ注意が回ってません。。
まだまだ勉強不足ですね。
早いけど良い感じですね。
返信削除「リモートアプリケーションに最適」って書いてあるし!