音湿度センサープログラム
湿度と温度の表を配列 humt[] と tmpt[] に記録します。湿度の場合、あらかじめ。出力電圧を AD変換値に換算しています。humt[0]
の値 152 は 出力電圧 0.74V に相当します。tempt[] は各温度に対応する抵抗の値です。
温度、湿度共に10回計測しその平均値を valh に求めます。湿度の場合、valh から humt[] を用いて、map() 関数で線形補間します。最初の
10 は 湿度の最低値です。9 は表のサイズ、最後の 10 は表の列当たりの湿度差です。
hum = map(valh,10,humt,9,10);
map() では、まず、valh が humt[] の値より最初に大きくなる列を求めます。この列と次の列との間で線形補間をします。
温度の場合、まず、平均値 valt を求め、これを電圧 vt に変換後、さらに抵抗値 rg に変換します。温度センサーの抵抗値 rg は 10kΩと直列ですから、
10・(5/( rg +10)) = vt になります。したがって次のように計算できます。
float rg=(5.0*10.0)/float(vt)-10;
rg から、湿度の場合と同様 tempt[] を利用して、線形補間を行います。
//温度はサーミスタなので非線形、湿度も線形ではない
//表を利用し、部分線形補間を行う
int i;
int tm,num;
int vd[4];
//10%から90%までのAD変換値と湿度
unsigned int humt[]={152,195,266,344,413,485,550,612,653};
//60度から度までの抵抗の値と温度
//unsigned long tmpt[]={158,94,58,47,38,25,17};
unsigned int tmpt[]={17,25,38,59,95,158};//60-0
int hum,tmp;
long sum;
int valt,valh;
char string[40];
void setup(){
tm=0;
Serial.begin(9600);
}
//valの値をary[]の値で補間する、表の先頭に対応する値をv0,
//変化する値をgap 範囲外の場合99を返す
int map(unsigned val,unsigned v0,unsigned int ary[],int num,int gap){
float diff;
int rval;
if(val<ary[0]) return 99;
if(val>ary[num-1]) return 99;
for(i=1;i<num;i++){
if(val<ary[i]){
diff=ary[i]-ary[i-1];
rval=v0+(i-1)*gap+(unsigned int)((float)(val-ary[i-1])*gap/diff);
break;
}
}
return rval;
}
void loop(){
int tmp;
sum=0;
for(i=0;i<10;i++){
tmp= analogRead(A0);//AD変換する
sum+=tmp;
delay(10);
}
valh=sum/10;//平均値
//Serial.println(valh);
//湿度変換
hum = map(valh,10,humt,9,10);
sum=0;
for(i=0;i<10;i++){
sum += analogRead(A1);//AD変換する
delay(10);
}
valt=sum/10;//平均値
//電圧に変換
float vt=(5.0/1024.0)*valt;
//Serial.print("vt:");
//Serial.println(vt);
//抵抗値に変換
float rg=(5.0*10.0)/float(vt)-10;
Serial.print("rg:");
Serial.println(rg);
//温度変換
tmp = map((int)rg,50,tmpt,6,-10);
sprintf(string,"tmp=%2u,hum=%2u\n", tmp,hum);
Serial.print(string);
delay(1000);
}
///実行結果
rg:61.11
tmp=20,hum=60
rg:61.11
tmp=20,hum=60
rg:61.11