본문 바로가기
Arduino/AVR/2. Arduino프로젝트

아두이노에서 써미스터(thermistor)로 온도 측정하기

by pepsiman 2009. 8. 27.
써미스터는 작고 싸서 정확한 온도가 필요치 않는 곳에 사용하기 그만입니다.
250원짜리로 온도를 측정할수 있다니...정말 저렴하고 매력적인 센서네요.

아두이노를 이용하면 간단한 회로로 가능하니 한번 해보시기 바랍니다.
하지만 써미스터는 온도가 저항값으로 출력되기 때문에 계산하기가 번거롭네요.




NTC_502F397F.xls

엑셀파일에 5도씨 간격으로 온도별 저항값이 적혀 있습니다. 그것을 그래프로 그린것이 위 그래프입니다.

보통 씨피유 파워가 약하거나 시간이 오래 걸리는 계산에는 미리 계산된 값을 배열에 담아서 사용하기도 합니다만
위 엑셀에는 5도씨 간격인것도 있고 세세히 모두 배열에 넣으면 메모리를 많이 차지 한다는 단점도 있습니다.
각자에 상황에 맞게 이용하시면 됩니다.

저는 계산식을 이용해서 프로그램했습니다.
부품 : NTC-502F397
저항= 5K +-1%,  B=3970,    열방산정수= 3.5mW/C

R =R0 exp (B/T-T0)
R0:온도 T0(K)의 저항값 K는 273.15
R :온도 T(K)의 저항값
B :Thermistor 정수
라는데 위 식으론 어떻게 계산하는건지 도무지 계산이 안돼네요 ㅜㅜ  아시는분 계시면 도와주세요.



디바이스마트의 댓글에 적혀 있는 방정식을 토대로 온도를 구했습니다.
T(단위 K) = log(4R -3000) / ( -0.024119329) + 473    --- 저항의 단위는 (옴)
화씨(F) = 1.8 * 섭씨(Tc)+ 32
섭씨(Tc) = (F-32)/1.8
섭씨(Tc) = 절대온도(T) - 273.15

여기서 또 이상한점이 결과가 켈빈 온도라고 되어 있는데 화씨로 계산하니 값이 맞는거 같습니다. ^^;

회로는 써미스터의 출력값이 저항값이기 때문에 전압 나눔회로를 만들어서 저항을 측정했습니다.
기준 저항은 10K옴 입니다.
측정은 아두이노 0번 아날로그핀으로 했습니다.

int analPin = 0;
int ledPin = 13;   // select the pin for the LED
int val = 0;       // variable to store the value coming from the sensor
long x=0, vcc=4840;
float th=0,ce=0;

void setup() {
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT
  Serial.begin(9600);
}

void loop() {
  val = analogRead(analPin);    // read the value from the sensor
  digitalWrite(ledPin, HIGH);  // turn the ledPin on
  x = map(val,0,1023,0,vcc);
  th = (((float)(vcc-x)*10.0)/(float)x)*1000.0;
  ce = ((log(4.0*th - 3000.0) / (-0.024119329) + 473)-32.0)/1.8;
  
  //Serial.print(vcc-x);
  //Serial.print(", ");
  //Serial.print(x);
  //Serial.print(", ");
  //Serial.print(th);
  //Serial.print(", ");
  Serial.println(ce);
  digitalWrite(ledPin, LOW);   // turn the ledPin off
  delay(200);                  // stop the program for some time
}
아두이노의 map명령은 여러모로 참 편한것 같습니다. 특히나 비례식 계산에는 복잡한 머리를 한결 가볍게 해주네요 ^^
실제 온도가 얼마인지 몰라서 오차가 얼마나 되는지 파악은 안되지만...
체리보드에서 측정된 온도와 1도 미만으로 차이 나더군요. 대충 비슷하게 맞는것 같습니다. ^^