[아두이노] 서미스터 온도센서로 온도 측정하기 (NTC,PTC)

jalju·2022년 8월 29일
0

아두이노 & AVR

목록 보기
2/2

서미스터(Thermally Sensitive Resistor)는 열 저항기의 일종으로, 특징은 온도에 따라 저항이 바뀐다. 바뀌는 저항값을 통해 온도를 계산하는데 온도가 높아질 수록 저항값이 올라가는 PTC(Positive Temperature Coefficient thermistor)온도가 높아질 수록 저항값이 내려가는 NTC(Negative Temperature Coefficient thermistor)로 나눌 수 있다. 서미스터는 온도 센서로 자주 애용된다. 나는 서미스터가 온도센서로 자주 사용되는 이유는 다음과 같다고 생각한다.

  1. 소형이고 온도 감지가 빠르다.
  2. 가격이 저렴하다.
  3. 진동, 충격에 강하다
  4. 종류가 많아 다양한 분야에서 사용 가능하다

사용한 사람이 많은 만큼 온도 계산하는 방법에 대해 서술한 글들이 많다. 그래서 사용하고자 할 때 많은 자료를 바탕으로 비교적 쉽게 사용이 가능하다. 이 글에서는 서미스터를 이용해 간단히 온도를 측정하는 예제의 소프트웨어적인 부분을 설명하겠다.

위 사진은 kty83로 서미스터 온도센서이다. PTC방식의 온도 센서이다. NTC는 이미 여러 블로그나 글에서 다루고 있기도 하고 PTC나 NTC나 온도를 측정하기 위한 방법이 큰 차이가 없기에 PTC에 대한 예제를 가져왔다. PTC와 NTC에 관한 더 자세한 내용은 이곳에서 볼 수 있다.

내가 사용한 서미스터 온도 측정 방법은 Steinhart–Hart equation을 응용해 계산하는 방식이였다.

T가 온도, A,B,C는 공식에서 쓰이는 계수이다. 이 값은 센서마다 다르다. 정확히는 온도에 따른 센서의 저항값과 연관되어있다. 이 값을 직접 구하진 않고 다른 사람이 친절하게 사이트로 만들어 놓았다. 여기서 대표값 3가지를 넣고 값을 얻으면 된다.

주소 : https://www.thinksrs.com/downloads/programs/therm%20calc/ntccalibrator/ntccalculator.html

여기서 내가 느꼈던 궁금점은 '대표값을 어떻게 정해야 온도값이 비교적 정확하게 측정이 될까?' 였다. 홈페이지에 있는 주황색 물음표에 커서를 올리면 알 수 있듯이 대표값은 내가 측정하고자 하는 온도의 최대,최소값 그리고 그 중앙값으로 정하면 온도값의 정확성이 높아질 것이다.
예를 들어 내가 측정하고자 하는 온도가 -40 ~ 100도 라면 그 중앙값인 30도 까지해서 R1,R2,R3를 넣고 A,B,C값을 구하는 게 온도 측정에 도움이 된다. 온도에 따른 저항치는 해당 센서의 데이터시트에 나온다. 데이터시트는 구글에 치면 대부분 나온다. 데이터시트가 있어야 온도 센서의 사용을 원활히 할 수 있기 때문에 대부분의 회사들은 데이터시트를 제공한다.
https://www.alldatasheet.com/view.jsp?Searchword=Kty83&gclid=CjwKCAjwx7GYBhB7EiwA0d8oe86TXIwXSiBqB9BlIkgLnuzGsoeD_tsPl08RN9OWQVgmtxYY0nxwQBoCkMQQAvD_BwE
이 링크는 kty83 데이터 시트를 다운 받을 수 있는 사이트이다. 본 예제는 kty83/110를 사용하기에 참고로 링크를 달아두겠다.
이제 온도를 측정해보자 kty83/110은 25도 일때 10k의 저항치를 가지는 서미스터이다.

void loop()
{
	int temp = analogRead(Ax) // Ax는 analog 포트중 임의의 하나
	int tmp = 0;
	while(tmp++ < 100) temp += analogRead(Ax)
    temp = temp / 100.0f;
	float R1 = 1000; // 25도 일 때 저항값(기준)
	float logR2, R2, T;
	float c1 =25.83991031e-03, c2 = -41.26093174e-04, c3 = 182.5188330e-07;
	R2 = R1 * (1024.0 / (float)temp - 1.0);
	logR2 = log(R2);
	T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
	CurrentTemperature = T - 273.15f; // 화씨 온도를 섭씨로 바꾸기 위해 273.15 빼기
}

난 -50 25 100도를 대표값으로 설정하여 식을 완성했다. 데이터 시트에 값을 보고 기입하면 A,B,C가 나오고 식으로 계산하면 온도가 나온다. temp를 100번 읽어서 100으로 나누는 이유는 온도의 평균값을 구하기 위해서 이다. 정확도 계산에 도움이 된다.
이 방법 말고도 B 파라미터 방정식을 이용해 구하는 방법이 있다. 추후에 한번 B파라미터 방정식이 더 정확한지 위의 방식이 더 정확한지 비교해봐야겠다.

profile
https://www.acmicpc.net/user/dlckswn334

0개의 댓글