블루투스 온도 모니터: 아두이노 나노와 NTC 서미스터로 구현
부품 및 소모품
| 부품 | 수량 |
| Arduino Nano R3 | 1 |
| 점퍼 와이어 (범용) | 1세트 |
| HC-06 블루투스 모듈 | 1 |
| NTC 서미스터 | 1 |
| 10kΩ 저항 | 1 |
| 1kΩ 저항 | 1 |
| 2.21kΩ 저항 | 1 |
필요한 도구 및 장비
- 납땜 인두 (선택 사항)
- 3D 프린터 (선택 사항, 케이스 제작용)
앱 및 온라인 서비스
프로젝트 개요
아두이노 나노와 NTC 서미스터로 온도를 측정하고, HC-06 블루투스 모듈을 통해 안드로이드 앱으로 실시간 전송하는 튜토리얼입니다.
회로 구성
1. 서미스터 전압 분배 회로
서미스터와 알려진 저항(10kΩ)을 직렬로 연결해 전압 분배기를 구성합니다. 아두이노 아날로그 핀 A0로 분배 전압을 읽어 서미스터 저항값을 계산합니다.
raw = analogRead(analogPin);
if(raw) {
ratio = raw * Vin;
Vout = ratio / 1024.0;
ratio = (Vin / Vout) - 1;
R2 = R1 * ratio;
}
2. 베타 공식으로 온도 변환
얻은 저항값을 베타 공식으로 온도(°C)로 변환합니다. 서미스터의 베타 값과 25°C에서의 저항값(Ro)은 데이터시트에서 확인해야 합니다.
Temp = Beta / log(R2 / (Ro * exp(-Beta / To)));
Temp = Temp - 273.15; // 켈빈 → 섭씨
3. 블루투스 모듈 연결
HC-06 모듈은 3.3V 로직이므로 아두이노 TX → 모듈 RX 사이에 1kΩ/2.21kΩ 전압 분배기가 필요합니다. 모듈 VCC는 5V, GND는 공통, 모듈 TX → 아두이노 RX 직결 가능합니다.
아두이노 코드 동작
시리얼 통신(9600 baud)으로 온도 데이터를 전송합니다. 25~75°C 범위 모니터링 예제이며, 74°C 이상이면 약 5분(300초) 카운트 후 "Heating Complete" 메시지, 26°C 이하면 "Temperature ≤ 25°C" 메시지를 보냅니다.
안드로이드 앱 (MIT App Inventor 2)
블루투스 연결 후 시리얼 데이터를 수신해 화면에 표시하는 간단한 앱을 제작했습니다. 사용자 인터페이스와 블록 프로그래밍 예시가 포함되어 있습니다. 앱 인벤터 갤러리에서 다운로드 가능합니다.
필요에 따라 온도 임계값 알림 소리, 가열 완료 알림 등 커스터마이징이 쉽습니다.
마무리
브레드보드 조립 후 납땜하고 3D 프린팅 케이스에 넣어 완성할 수 있습니다. 서미스터 케이블을 길게 뽑아 측정 대상(용액 등)에서 전자부를 멀리 떨어뜨릴 수 있게 했습니다.
주의사항: 블루투스 모듈 전압 분배기 회로도에 오류가 있어 수정했습니다. 코드 업로드 시 블루투스 모듈을 분리하면 업로드 실패를 방지할 수 있습니다.
전체 코드
// Temperature monitor with bluetooth module
int analogPin = 0;
int raw = 0;
int Vin = 5;
float Vout = 0;
float R1 = 10000; // 사용 저항값으로 변경
float Ro = 10000; // 서미스터 25°C 저항값으로 변경
float R2 = 0;
float ratio = 0;
float Temp = 0;
float Beta = 3694; // 서미스터 베타값으로 변경
float To = 298.15; // 25°C = 298.15K
void setup() {
Serial.begin(9600);
}
void loop() {
raw = analogRead(analogPin);
if(raw) {
ratio = raw * Vin;
Vout = ratio / 1024.0;
ratio = (Vin / Vout) - 1;
R2 = R1 * ratio;
Temp = Beta / log(R2 / (Ro * exp(-Beta / To)));
Temp = Temp - 273.15;
if(Temp >= 74) {
for (int i = 0; i <= 30; i++) {
Serial.print("Temperature >= 74 °C");
delay(10000);
}
Serial.print("Heating Complete");
delay(10000);
} else if (Temp <= 26) {
Serial.print("Temperature <= 25 °C");
delay(10000);
} else {
Serial.print("Temperature: ");
Serial.println(Temp);
delay(10000);
}
}
}
회로도

참고: 분배기 저항 R2는 사용 중인 서미스터 저항값에 맞게 변경하세요. 알 수 없는 저항과 R2의 차이가 클수록 온도 측정 오차가 커집니다.