몸·온도·습도 · 난이도 쉬움
MLX90614 비접촉 적외선 온도 센서로 표면 온도를 재고 시야각과 방사율이 만드는 차이 알기
MLX90614는 물체가 내는 적외선으로 닿지 않고 표면 온도를 재는 I²C 센서예요. 주소 0x5A·100kHz 배선, 물체와 센서 온도를 함께 읽는 코드, 거리가 멀수록 넓어지는 시야, 반짝이는 금속이 낮게 나오는 이유, 피부 온도가 체온이 아닌 이유를 정리했어요.
이 센서로 무엇을 잴 수 있나
MLX90614는 멜렉시스(Melexis)가 만든 적외선 온도 센서예요. 작은 금속 캔(TO-39) 안에 적외선을 받는 서모파일과 신호를 계산하는 칩이 함께 들어 있고, 공장에서 보정된 온도를 숫자로 내보내요. 데이터시트에 적힌 범위는 물체 온도 −70~380℃, 센서 자신의 온도 −40~125℃이고, 해상도는 0.02℃예요. 표준판의 정확도는 물체와 센서가 모두 0~50℃일 때 ±0.5℃예요. 수업에서는 GY-906 같은 작은 기판에 얹힌 모듈을 써요.
이 센서가 재는 것은 표면 온도예요. 컵의 겉면, 햇빛을 받은 책상, 손바닥과 이마의 피부처럼 닿지 않고 겉면을 재는 탐구에 맞아요. 물이 식는 속도나 손이 찬물에서 회복되는 시간처럼 변화를 따라가는 데도 좋아요.
반대로 몸속 온도(심부 체온)는 재지 못해요. 피부 표면 온도는 주변 기온, 땀, 혈류에 따라 달라지고 보통 몸속보다 낮아요. MLX90614에도 의료용 정확도 판(옵션 글자가 D로 시작하는 ESF-DCI 등)이 따로 있지만, 의료용 체온계는 피부 온도에서 체온을 추정하는 계산과 의료기기 인증까지 갖춘 제품이에요. 이 모듈의 숫자로 열이 있는지 판단하지 않아요.
원리
모든 물체는 온도에 따라 적외선을 내요. 서모파일은 물체에서 온 적외선과 센서 자신이 내는 적외선의 차이만큼 아주 작은 전압을 만들고, 칩은 함께 잰 센서 온도(Ta)를 이용해 물체 온도(To)를 계산해요. 그래서 이 센서는 두 온도를 늘 함께 알려 줘요.
데이터시트는 측정값을 "시야(FOV) 안에 있는 모든 물체의 평균 온도"라고 적어요. 시야는 품번 끝 글자로 정해져요. 흔한 BAA·AAA는 90°, xCC는 35°, xCF는 10°, xCI는 5°예요. 90°라면 시야의 지름이 거리의 약 2배라서, 2cm에서는 지름 4cm, 10cm에서는 지름 20cm 원을 평균 내요. 데이터시트도 정확도는 물체가 시야를 다 채울 때만 보장된다고 적어요.
또 하나는 방사율이에요. 같은 온도라도 물질마다 적외선을 내는 정도가 달라요. 이 센서는 공장에서 방사율 1.0으로 맞춰져 있어요. 데이터시트의 질문·답변에 따르면 대충 닦은 알루미늄은 약 0.18, 플라스틱은 0.84~0.95, 심하게 산화한 알루미늄도 0.30 정도예요. 방사율이 낮은 표면은 주변의 적외선을 거울처럼 되비추는데, 센서는 그것을 물체가 낸 빛과 구별하지 못해요. 그래서 반짝이는 캔은 실제 온도보다 주변 온도에 가깝게 읽혀요.
통신은 I²C와 호환되는 SMBus예요. 기본 주소는 0x5A, 클록은 10~100kHz예요. 램 주소 0x06에 센서 온도, 0x07에 물체 온도가 들어 있고, 읽은 16비트 값에 0.02를 곱한 뒤 273.15를 빼면 섭씨온도예요. 읽을 때 오는 세 바이트는 낮은 바이트, 높은 바이트, 검사 바이트(PEC) 순서이고, 높은 바이트의 맨 윗비트가 1이면 오류 표시예요.
준비물
- 라즈베리파이 피코와 USB 케이블
- MLX90614 모듈(GY-906 등), 암-수 점퍼선 4개, 브레드보드
- 자, 센서를 고정할 받침(집게, 블록)
- 탐구용: 컵, 50℃보다 낮은 따뜻한 물, 주방용 온도계나 방수 온도 센서, 알루미늄 캔, 검은 절연 테이프, 수돗물을 담은 그릇
배선
브레드보드 따라 꽂기 순서 (9단계)
- 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
- 주황 선: 피코 36번 핀(3V3(OUT)) 옆 칸 a6 → 위쪽 + 줄(3.3V). 이제 이 줄 전체가 3.3V예요.
- 검은 선: 피코 38번 핀(GND) 옆 칸 a4 → 위쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
- 비접촉 적외선 온도 MLX90614 꽂기: 다리 VIN · GND · SDA · SCL를 위쪽 a24 · a25 · a26 · a27에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
- 주황 선(3.3V 전원): 비접촉 적외선 온도 VIN 줄 b24 → 위쪽 + 줄(3.3V)
- 검은 선(GND): 비접촉 적외선 온도 GND 줄 b25 → 위쪽 − 줄(GND)
- 파란 선(신호): 비접촉 적외선 온도 SDA 줄 b26 → 피코 6번 핀(GP4) 옆 칸 j7
- 파란 선(신호): 비접촉 적외선 온도 SCL 줄 b27 → 피코 7번 핀(GP5) 옆 칸 j8
- 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
| 모듈 핀 | 피코 핀 | 비고 |
|---|---|---|
| VIN | 3V3 (36번) | 3V판 센서 기준 |
| GND | GND (38번) | 피코와 접지를 함께 써요 |
| SDA | GP4 (6번) | I2C0 SDA |
| SCL | GP5 (7번) | I2C0 SCL, 100kHz로 써요 |
먼저 캔에 새겨진 글자를 봐요. 데이터시트의 표시 규칙에서 첫 글자 A는 5V판, B는 3V판, D는 3V 의료용 정확도판이고, 둘째 글자는 구역 수와 보정 방식, 셋째 글자는 시야각이에요. 이 글은 B나 D로 시작하는 3V판을 3V3에 잇는 배선이에요. A로 시작하는 5V판이 얹힌 모듈이라면 판매처 회로도를 먼저 확인해요.
센서와 피코가 모두 3.3V로 동작해서 분압 저항은 필요 없어요. 다른 I²C 장치와 함께 쓸 때는 버스 전체를 100kHz로 맞춰요. 데이터시트의 SMBus 최고 속도가 100kHz예요.
코드
from machine import Pin, I2C
import time
i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=100000) # MLX90614는 100kHz까지
ADDR = 0x5A
def read_c(reg):
d = i2c.readfrom_mem(ADDR, reg, 3) # 낮은 바이트, 높은 바이트, 검사 바이트(PEC)
if d[1] & 0x80: # 높은 바이트의 맨 윗비트 1 = 오류 표시
return None
return (d[0] | (d[1] << 8)) * 0.02 - 273.15
found = i2c.scan()
print("I2C 주소:", [hex(a) for a in found])
if ADDR not in found:
print("0x5A가 없어요: VIN=3V3, SDA=GP4, SCL=GP5를 확인해요")
while True:
s_obj = 0
s_amb = 0
n = 0
for i in range(8):
o = read_c(0x07) # 물체 온도(시야 안의 평균)
a = read_c(0x06) # 센서 자신의 온도(주변 온도)
if o is not None and a is not None:
s_obj += o
s_amb += a
n += 1
time.sleep_ms(50)
if n:
obj = s_obj / n
amb = s_amb / n
print(f"DATA: obj_c={obj:.2f}, amb_c={amb:.2f}, diff_c={obj - amb:.2f}, n={n}")
else:
print("DATA: obj_c=-999, amb_c=-999, diff_c=0, n=0")
time.sleep(0.5)
- 라이브러리 없이 내장
machine.I2C의readfrom_mem()으로 레지스터를 바로 읽어요. 시나브로 PICO 센서 가이드 예제와 같은 방법이에요. read_c()는 오류 표시 비트가 켜진 값을 버리고None을 돌려줘요.- 0.05초 간격으로 8번 읽어 평균을 내고, 몇 번이 성공했는지
n으로 알려 줘요. diff_c는 물체 온도와 센서 온도의 차이예요. 0에 가까우면 센서가 주변과 같은 온도의 무언가를 보고 있다는 뜻이에요.
값 해석과 보정
거리부터 정해요. 지름 8cm 컵을 재고 싶다면 90° 센서는 4cm보다 가까이 가야 시야가 컵 안에 들어와요. 그보다 멀면 컵 주변의 책상과 벽이 평균에 섞여 온도가 낮게 나와요. 거리를 바꿀 때마다 값이 어떻게 변하는지는 탐구 1에서 직접 확인해요.
반짝이는 표면은 무광으로 덮어요. 맨 금속을 재야 한다면 검은 절연 테이프처럼 무광인 재료를 한 조각 붙이고, 테이프가 금속과 같은 온도가 될 때까지 1분쯤 기다린 뒤 테이프를 재요. 방사율 값을 센서 메모리(EEPROM)에 새로 쓰는 방법도 있지만, 데이터시트는 공장 보정값이 든 칸을 건드리지 말라고 경고해요. 이 글은 메모리를 쓰지 않아요.
센서가 자리 잡을 때까지 기다려요. 데이터시트는 정확도가 센서 캔 전체의 온도가 고른 상태에서만 지켜진다고 적어요. 손으로 캔을 잡았거나, 뜨거운 물체를 아주 가까이 댔거나, 차가운 곳에서 막 가져왔다면 amb_c가 멈출 때까지 기다린 뒤 기록해요.
기준과 비교해요. 따뜻한 물의 수면을 재서 온도계 값과 견줘 보면 센서가 얼마나 맞는지 알 수 있어요. 차이가 늘 비슷하면 그만큼 빼는 한 점 보정을 써요(센서 값의 신뢰도).
자주 하는 실수
- 멀리서 재고 "생각보다 차갑다"고 결론 내기. 시야가 넓어져 배경이 섞였을 가능성이 커요. 거리를 함께 적어요.
- 알루미늄 캔이나 스테인리스 컵을 그대로 재기. 표면이 주변을 되비춰 실제보다 낮게 나와요.
- I²C를 400kHz로 두기. 다른 장치에 맞춰 속도를 올리면 이 센서 값이 깨질 수 있어요. 100kHz로 맞춰요.
- 센서 캔을 손가락으로 쥐고 재기. 캔에 온도 차가 생겨 오차가 커져요. 받침에 고정해요.
- 이마 표면 온도를 체온이라고 기록하기. 표에는 "이마 표면 온도"라고 적어요.
이 센서로 잴 수 있는 탐구
1. 거리가 멀어지면 컵의 온도는 얼마나 낮게 읽힐까
- 질문: 같은 따뜻한 물컵을 거리만 바꿔 재면 측정 온도가 어느 거리부터 떨어질까?
- 바꾸는 것: 센서와 컵 겉면 사이 거리 2cm, 4cm, 8cm, 16cm, 32cm
- 재는 것: obj_c(℃), 온도계로 잰 물 온도(℃)
- 방법: 센서를 받침에 고정하고 컵을 자 위에서 옮겨요. 물이 식으니 거리마다 온도계 값도 함께 적어요. 컵 지름과 "거리 × 2"를 비교해 값이 떨어지기 시작한 거리를 설명해요. 3번 반복해요.
2. 같은 캔인데 표면에 따라 온도가 다를까
- 질문: 따뜻한 물이 든 알루미늄 캔에서 맨 금속, 검은 절연 테이프, 종이 라벨 부분은 각각 몇 ℃로 읽힐까?
- 바꾸는 것: 재는 표면(맨 알루미늄, 테이프, 종이)
- 재는 것: obj_c(℃), 캔 속 물 온도(℃)
- 방법: 거리는 2cm로 고정하고 표면을 번갈아 재요. 표면마다 3번 기록하고, 물 온도와의 차이로 어떤 표면이 믿을 만한지 판단해요.
3. 찬물에 담근 손등은 몇 분 만에 돌아올까 - 질문: 수돗물에 손을 담근 시간이 길수록 손등 표면 온도가 처음 값으로 돌아오는 데 오래 걸릴까? - 바꾸는 것: 담그는 시간 10초, 20초, 30초 - 재는 것: 손등 표면 온도(℃), 처음 값과 1℃ 안으로 돌아오기까지 걸린 시간(초) - 방법: 센서를 2cm 높이에 고정하고 손등을 같은 자리에 둬요. 담그기 전 1분 평균을 처음 값으로 삼아요. 물에서 꺼낸 손은 수건으로 가볍게 눌러 물기를 닦은 뒤 센서 아래에 두고, 물그릇은 피코와 노트북에서 떨어뜨려 둬요. 조건 사이에는 10분 쉬어요. 얼음물은 쓰지 않고, 손이 아프면 바로 멈춰요.
안전
- 이 장치는 체온계가 아니에요. 열이 있는지, 아픈지 판단하는 데 쓰지 않아요. 몸 상태가 걱정되면 어른께 알리고 인증받은 체온계를 써요.
- 다른 사람의 피부 온도를 잴 때는 먼저 허락을 받고, 기록에는 이름 대신 번호를 써요.
- 따뜻한 물은 50℃보다 낮게 준비해요. 뜨거운 물은 선생님이 다뤄요.
- 물과 전기를 떨어뜨려요. 젖은 손으로 피코와 배선을 만지지 않고, 물을 쏟으면 먼저 USB를 뽑아요.
- 전원은 3V3에만 잇고, 배선은 USB를 뽑은 채로 바꿔요.
더 알아보기
- 데이터시트: Melexis "MLX90614 Single and dual zone IR sensor in TO39" Datasheet Rev 021(측정 범위, ±0.5℃ 정확도와 조건, 품번 표시 규칙, 시야각 표, SMBus 주소 0x5A와 10~100kHz, 램 0x06·0x07, 방사율 1.0과 질문·답변의 방사율 예, 의료용 정확도판)
- 라이브러리: 따로 없어요. MicroPython 내장
machine.I2C - 기초 글: 센서 값의 신뢰도, I²C 장치 여러 개 연결하기, 잴 수 있는 탐구 주제 만들기, 브레드보드 처음 쓰기