Arduino 에 온도 센서 연결하기

아두이노는 아날로그 입력핀 6개를 가지고 있습니다.

빨간 원 안이 아날로그 입력입니다.

아날로그 입력핀이란 ADC(Analog Digital Converter) 와 연결된 핀인데
말그대로 아날로그 입력을 디지털 값으로 바꾸어줍니다.
즉 각종 아날로그 센서의 값을 0~1023 으로 변환해서 보여주며 아두이노는 총 6개의 입력을 받을 수 있습니다.

물론 센서를 꽂으면 바로 0~1023 값이 선형적으로 증가하면 참 좋겠지만
어느 센서던지 데이터시트를 확인하여 회로와 특성을 이해해야 정확한 센서값을 얻을 수 있습니다.

제가 사용해본 센서는 TMP36이라는 온도센서
아트로봇이란곳에서 3천원에 구입한 저렴한놈입니다.

TMP36

정말 제대로 활용을 해보겠다면
회로를 구성하기 전에 데이터시트를 살펴보는 습관을 들이는것이 좋습니다.
데이터시트에는 제품특성에 관한 유용한 정보가 있습니다. TM36 Datasheet
(항상 데이터시트를 보다보면 영어가 모국어인 엔지니어들은 참 편리하겠군 하는 생각이 ...)


그래도 센서특성 정도는 봐두시는게 좋습니다.

    - Voltage Input: 2.7 V to 5.5 VDC
    - 10 mV/°C scale factor
    - ±2°C accuracy over temperature
    - ±0.5°C linearity
    - Operating Range: −40°C to +125°C

- 2.7V ~ 5.5V 를 공급해주면 된다니 아두이노에선 3.3V핀이나 5V 핀중 아무곳이나 꽂아도 괜찮겠군요.
- 1도변화당 10mV변화량을 가지는 모양입니다.
- 고온에서는 +-2도 정도의 정확도를 가짐.
- 0.5도 정도의 해상도.
- -40도 ~ 125도까지 측정가능.

(0.5도의 해상도가 난 저렴한녀석이다라는걸 말해주네요)




핀을 살펴보면 왼쪽부터 Vs, Vout, GND 핀입니다.
Vs : (Voltage Supply ? ) 전원 공급을 연결해주는 핀입니다.
Vout : ADC핀과 연결해주면 됩니다.
GND : 그라운드와 연결합니다.

단촐하게 핀 세개만 연결해주면 됩니다.
고맙게도 저항을 연결할 필요도 없어보입니다.



이제 센서값을 읽어들일 스케치를 작성해야 하는데

ADC로 들어오는 값을 어떻게 섭씨 온도로 변환시킬지가 관건입니다.

센서특성에따라 Vout핀으로 출력되는값을 알면 온도를 구할수 있습니다.
그런데 아두이노의 ADC는 입력되는 값을 0~1023의 디지털값으로 변환해서 보여줍니다.
그러면 우선 입력되는값을 다시 Vout값으로 변환해야 겠군요.

저는 5V를 연결했으니 아래와 같은 공식으로 ADC값을 Voltage로 변환합니다.

Voltage (mV) = ADC * (5000/1024) // 3.3V에 연결했다면 3300 으로 바꿔야겠네요

이제 Voltage값을 온도로

섭씨온도 = [(mV) - 500] / 10

원래 해당 공식을 구하기 위해서는 데이터시트를 꼼꼼히 읽는 수고를 해야하지만
전 사실 아래 사이트에서 쉽게 정보를 얻었습니다.
http://www.ladyada.net/learn/sensors/tmp36.html
(다른 센서에 대해서도 무척 설명이 잘 되어 있습니다.)

아래는 스케치 내용인데 이것도 간단한 내용이라
위 사이트에서 가져온 코드에 주석만 번역했습니다.


//TMP36 핀 변수
int sensorPin = 0; //TMP36의 Vout핀과 연결되는 아날로그 핀. 1도당 10mV 변함

/*
 * setup() - Arduino 가 켜질때 한번만 실행되는 코드
 * 여기서 PC와 시리얼 설정함
 */
void setup()
{
  Serial.begin(9600);  //시리얼 콘솔로 결과를 확인하기 위해 PC와 연결 시작
}
 
void loop()                     //계속 반복되는 코드
{
 // 온도 센서로부터 Voltage값을 읽어옴
 int reading = analogRead(sensorPin); 
 
 // 읽어들인 값을 Voltage값으로 변환, 3.3V 에 연결했다면 3.3 으로 사용
 float voltage = reading * 5.0;
 voltage /= 1024.0;
 
 // Voltage 값을 출력
 Serial.print(voltage); 
 Serial.println(" volts");
 
 // 온도값을 출력
 float temperatureC = (voltage - 0.5) * 100 ;  // 500mV을 뺀다음 10mV/'C 단위로 바꾸기위해 *100

 Serial.print(temperatureC);
 Serial.println(" degrees C");
 
 // 화씨 값으로 변환
 float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
 Serial.print(temperatureF);
 Serial.println(" degrees F");
 
 delay(1000);                                     // 1초 간격으로 출력하기 위해 대기
}



스케치를 Upload 한후 시리얼 콘솔을 열면
현재 ADC로 입력되는 Voltage 값과, 섭씨, 화씨 온도를 1초 단위로 계속 볼 수 있습니다.






Arduino 1차 목표가 무선조정탱크 만드는것 까지인데 아직 갈길이 멀군요 ㅎㅎ

'Arduino' 카테고리의 다른 글

Arduino + Wifly (WiFi shield) (1-소개)  (8) 2011.12.09
Arduino + TMP36 (온도센서)  (3) 2011.12.03
Arduino + FND (7segment)  (3) 2011.12.02
Arduino (아두이노) 란?  (0) 2011.11.29
Posted by Pulse@

댓글을 달아 주세요

  1. ??? 2012.02.07 21:26  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 포스팅 잘 봤습니다.

    다름이 아니라 센서값이 좀 이상해서 실례지만 질문 드려봅니다.

    이 센서를 가지고 회로를 만들었는데, 20도도 채 안되는 온도에서 값은 계속 33-34도에 해당하는 전압이 읽히네요.

    소스나 회로는 몇십 번을 봐서 틀렸을 것 같진 않고..
    오차범위도 10도가 넘어가진 않는데요. 혹시 아시는 바가 있나요?

    • Favicon of https://printk.tistory.com BlogIcon Pulse@ 2012.02.09 13:47 신고  댓글주소  수정/삭제

      같은 센서라면 위에 스케치를 그대로 복사해서 한번 테스트 해보시는게 어떨까요. 회로도 단순화 시켜서 테스트해보시구요. 그래도 틀리다면 저도 잘 ;;;

  2. bryan7 2015.01.16 14:33  댓글주소  수정/삭제  댓글쓰기

    질문이 하나 있는데요.

    아두이노에 온도 센서를 최대 몇 개까지 연결할 수 있을까요?

    답변 좀 부탁드립니다.

    감사합니다.