[아두이노] 아날로그 온도 센서 완벽 가이드 (TMP36 vs LM35DZ)
아두이노로 온도를 측정할 때 가장 많이 사용하는 센서인 LM35DZ와 TMP36.
겉모양은 거의 동일한데, 왜 코드 속 계산식은 다를까요?
핵심은 바로 전압 스케일링 + 오프셋(Offset) 입니다.
1. 하드웨어 이해 (TO-92 패키지)
두 센서 모두 동일한 형태입니다.
👉 평평한 면을 정면으로 봤을 때:
왼쪽 : VCC (5V)
가운데: OUTPUT
오른쪽: GND
센서 스펙 차이
-
LM35DZ
- 측정 범위: 0°C ~ 100°C
- 특징: 음수 온도 측정 불가 (기본 상태에서는)
-
TMP36
- 측정 범위: -40°C ~ 125°C
- 특징: 영하 온도 측정 가능
2. 1단계: ADC 값을 전압으로 변환
아두이노는 전압을 직접 읽지 못하고
0 ~ 1023 범위의 디지털 값으로 변환합니다.
공식 (블로그 안전 버전)
Voltage(mV) = Reading × (5000.0 / 1024.0)
의미
- 5000.0 → 5V를 mV로 변환
- 1024.0 → ADC 분해능 (10비트)
- 1 step ≈ 4.88mV
즉,
👉 ADC 값 × 4.88mV = 실제 전압
3. 2단계: 전압 → 온도 변환
두 센서 모두 공통점:
10mV = 1°C
하지만 차이는 여기서 발생합니다:
👉 0°C 기준점 (Offset)
4. LM35DZ (기준점 = 0V)
특성
- 0°C → 0mV
- 완전히 비례하는 직선
공식
Temperature(°C) = Voltage(mV) / 10.0
장점
- 계산이 매우 단순
단점
-
음수 온도 측정 불가
(아두이노는 음전압 측정 못함)
5. TMP36 (Offset = 500mV)
핵심 개념: 오프셋(Offset)
- 0°C → 500mV
- 일부러 기준점을 위로 올려둠
이유
👉 영하에서도 전압이 0V 아래로 떨어지지 않게 하기 위해
예:
-10°C → 400mV
공식
Temperature(°C) = (Voltage(mV) - 500.0) / 10.0
해석
- 500mV 제거 (가짜 기준 제거)
- 10으로 나눔 → 온도 환산
6. 통합 코드 (그대로 사용 가능)
void setup() {
Serial.begin(9600);
}
void loop() {
int reading = analogRead(A0);
// 1. ADC → 전압 변환 (mV)
float voltage = reading * (5000.0 / 1024.0);
// 2. 센서별 온도 계산
float tempLM35 = voltage / 10.0; // LM35
float tempTMP36 = (voltage - 500.0) / 10.0; // TMP36
Serial.print("Voltage: ");
Serial.print(voltage);
Serial.print(" mV | ");
Serial.print("Temp (LM35): ");
Serial.print(tempLM35);
Serial.println(" C");
// TMP36 사용할 경우 아래 주석 해제
// Serial.print("Temp (TMP36): ");
// Serial.print(tempTMP36);
// Serial.println(" C");
delay(1000);
}
7. 실전에서 많이 터지는 문제들
🔴 온도가 이상하게 높게 나올 때 (40~50°C)
👉 원인: 5V가 실제로 5V가 아님
- USB 전원 → 4.7V ~ 5.2V 흔함
- 해결:
float voltage = reading * (실측전압 / 1024.0);
👉 멀티미터로 5V 핀 측정 후 값 넣기
🔴 값이 계속 흔들릴 때
- 노이즈 영향
- 해결 방법:
delay(10); // 또는 평균 필터 사용
또는
여러 번 읽어서 평균값 사용
8. 핵심 요약
-
LM35
- 0V = 0°C
-
공식:
V / 10 - 단순하지만 음수 측정 불가
-
TMP36
- 0°C = 500mV
-
공식:
(V - 500) / 10 - 영하 측정 가능
9. 한 줄 핵심 개념
👉 TMP36은
"온도 눈금을 500mV만큼 위로 이동시킨 센서"
댓글
댓글 쓰기