アナログ温度計を使う(その2)


アナログ値のばらつきを解消するために、以下の様に50回サンプリングしたアナログ値を、ヒストグラムに展開し、
最も分布の大きかったアナログ値を採用するようにしました。
回路はバイパスコンデンサーなしのシンプルなものです。




/*
 * Test Program for LM35DZ
 */
#define s_size 50   // アナログデータ格納領域
#define h_size 25   // ヒストグラム格納領域
#define A_inPin A0  // アナログ入力ピン番号

float A_val;        // アナログ入力値
float tempC   = 0;  // 摂氏値( ℃ )

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  int buf[s_size];
  int hist[h_size];
  int imin=1023;
  int imax=0;
  int tmp;
  int pos;
  int i;

//Clear Histgram
  for(i=0;i<h_size;i++) hist[i]=0;

//Get Analog Data
  for(i=0;i<s_size;i++) {
    buf[i] = analogRead( A_inPin );
    if (buf[i] > imax) imax=buf[i];
    if (buf[i] < imin) imin=buf[i];
//    Serial.print(buf[i]);
//    Serial.print(" ");
  }
  Serial.print("imin=");
  Serial.print(imin);
  Serial.print(" imax=");
  Serial.print(imax);

//Set Histgram
  for(i=0;i<s_size;i++) {
    tmp=buf[i]-imin;
    if(tmp < h_size) hist[tmp]++;
  }

//Get Max Histgram
  tmp=0;
  for(i=0;i<h_size;i++) {
//    Serial.print(hist[i]);
//    Serial.print(" ");
    if (hist[i] > tmp) {
      tmp=hist[i];
      pos=i;
    }
  }
//  Serial.print(" pos=");
//  Serial.println(pos);
  A_val=imin+pos;
  Serial.print(" A_val=");
  Serial.print(A_val);
  Serial.print(" Temp=");
  tempC = ((5.0 * A_val) / 1024.0) * 100.0;
  Serial.println( tempC );
  delay(1000);
}


実行すると、28.32度で値が安定しました。



次回はUNO内蔵のDACと外付けDACを比較してみます。

続く....