このブログへの投稿/アップロードについて(コメントは誰でも、投稿は受講者+スタッフのみ)
コメント/投稿/ラベルについて(基本事項)投稿時間の設定(下書き/予定など)プログラム(ソースコード)を投稿する際の注意点Processingのプログラム(Applet)を表示する方法
ArduinoやProcessingについては「建築発明工作ゼミ2008」の方にまとめてあります。
秋葉原の電子工作マップ、Arduino販売店についてはこちら。 :

2009年6月16日火曜日

温度センサー LM60BIZ版

内容はかぶってしまいますが、違う温度センサーを使って温度を測定してみました。
このセンサーは、-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;
}

7 件のコメント:

  1. なぜかよくわかりませんが、変数をintではなくlongにするとうまくいきました。
    intのままだと、値にマイナスが付いてしまい、計算がうまくいきませんでした。だれか知っている方がいらっしゃったら教えてください。

    返信削除
  2. 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で済むのであれば、演算コストを軽減させることも含め、計算する順番とか、割り算よりは掛け算をつかうとか、工夫するといいのかもしれません。

    返信削除
  3. 僕もLM60BIZでやってみました。1秒ごとなので変化が早いです。
    演算効率といえば、配列を操作する関数がないですね。当初、計測温度をとりあえず配列に入れておいて、最大と最小をその配列から取得しようと考えていたのですが、メモリを大切に使いましょうという言語仕様ですね。

    返信削除
  4. あと、
    for文の行が文字化けしています。

     for (int i=0; i<10;>

    は、

     for (int i=0; i<10; i++) {

    とやるといいかと思います。
    kousakuさんのアドバイスでもありましたが、
    ブログ編集の時に「<」や「>」の周辺は要注意です。

    返信削除
  5. polanetさん
    ご指摘ありがとうございます。
    修正しときました。

    返信削除
  6. kousakuさん

    ご指摘のとおりにしたらうまく動作しました。
    メモリの量を節約とかまでまだ注意が回ってません。。
    まだまだ勉強不足ですね。

    返信削除
  7. 早いけど良い感じですね。
    「リモートアプリケーションに最適」って書いてあるし!

    返信削除

*