2015년 5월 28일 목요일

온도센서를 이용한 아두이노 아날로그 입력 실험

 여기에서는 온도 센서 LM35DZ를 이용하여 아날로그 입력 실험을 수행하도록 하겠다. 이 소자의 외형과 핀의 기능은 다음 그림과 같다. 세 개의 다리가 있는데 각각 5V, 출력, GND 이고 가운데 출력핀을 아두이노의 아날로그 핀에 연결해야 한다.

[그림 1] 온도센서 LM35-DZ

데이터시트에 따르면 이 소자는 섭씨 +2도~+150도 의 범위를 측정할 수 있으며 섭씨 1도는 약 10mV 의 전위차를 갖는다. 예를 들어서 센서핀의 전압이 0.21V라면 210mV 이므로 온도는 21도씨라는 것이다. 따라서 아날로그 값을 읽어들여서 약간의 계산(전압값에 100을 곱한다)을 거쳐서 섭씨 온도가 얻어진다.

 만약 A0 핀에 센서가 연결되어 있다고 하면 이를 수행하는 코드는 다음과 같다.

short sVal = analogRead(A0); // 아날로그값: 0~1023의 값을 갖는다.
float fVoltage = sVal*5.0/1024; // 실제 전압값을 변환 (5.0을 곱함에 유의한다.)
float fTemp = fVoltage * 100; // 전압값을 섭씨 온도로 변환한다.

이제 이것을 함수로 구현하여 1초마다 한 번씩 온도를 감지하여 PC로 시리얼 통신을 통해서 표시해주는 예제는 다음과 같다.

void setup() {
   Serial.begin(9600);
}

void loop() {
   Serial.println(getTemp());
   delay(1000);
}

float getTemp() {
   short sVal = analogRead(A0);
   float voltage = sVal*5.0/1024; // 실제 전압값을 구한다.
   return voltage*100;
}
[그림 5.2.2] 1초마다 온도를 감지하여 표시하는 결과 화면

 만약 기준 전압으로 내부 전압인 1.1V를 사용하면 분해능이 약 5배 정도 높아지므로 OP-AMP와 같은 외부 회로 없이 간접적으로 5배 증폭의 효과를 볼 수 있다. 1.1V라도 섭씨 110도에 해당되므로 실온을 측정하는 경우라면 크게 문제가 없을 것이다. 다음과 같이 앞의 예제를 조금만 수정하면 된다.

#define SUPPLY_VOLTAGE 1.1

void setup() {
   Serial.begin(9600);
   analogReference(INTERNAL);
}

void loop() {
   Serial.println(getTemp());
   delay(1000);
}

float getTemp() {
   short sVal = analogRead(A0);
   // 1.1을 곱한 뒤 1024로 나눈다.
   float voltage = sVal*SUPPLY_VOLTAGE/1024;
   return voltage*100;
}

 한 가지 더 부연할 것은 실제 온도와 센싱된 온도와는 아무래도 차이가 나게 마련이다. 따라서 정밀하게 온도를 잴 수 있는 온도계 값과 센싱된 값을 비교하여서 그 차이만큼 보정을 해주면 좀 더 정확하게 온도를 잴 수 있을 것이다.

댓글 없음:

댓글 쓰기