센서 정확도 평가: 외부 온도 vs 체온 비교 실험
부품 및 소모품
부품
수량
Maxim DS18B20 프로그래머블 1-Wire 디지털 온도계
1
DHT11 온도/습도 센서 (3핀)
1
저항 10kΩ
3
점퍼 와이어
10
아다프루트 방수 DS18B20 디지털 온도 센서
1
테스트 프로브 커넥터, 악어 클립
3
USB-A to 미니-USB 케이블
1
아두이노 우노
1
BBC micro:bit 보드
1
앱 및 온라인 서비스
아두이노 IDE
Vittascience 플랫폼 (micro:bit용)
프로젝트 개요
다양한 온도 센서의 한계와 정확도가 다릅니다. 건강 관련 프로젝트에서는 외부 온도와 체온을 정밀하게 측정해 건강 상태를 정확히 파악하는 것이 중요합니다. 이에 가장 대중적인 온도 센서들과 micro:bit 내장 센서의 정밀도를 비교 실험했습니다.
사용 센서: DS18B20, 방수 DS18B20, AM2302(DHT22), 아두이노, micro:bit 보드, 일반 체온계.
실험 구성
센서들을 아두이노 보드에 연결했습니다(회로도 참조). 연결 모습:
아두이노용 코드(코드 섹션 참조)를 업로드했고, micro:bit용 코드는 Vittascience 플랫폼 에서 생성했습니다.
실내 온도 측정 결과 (10회 실험, 대표 데이터 분석)
실내 온도계 기준값: 21°C (가장 정확한 기준값으로 간주)
micro:bit: 27°C (큰 오차)
아두이노 연결 센서 3종: 모두 비교적 정확했으나 AM2302(DHT22)가 가장 높은 정확도 보임
체온 측정 결과 (10회 실험, 대표 데이터 분석)
손에 센서를 고정하기 위해 연장선 사용. 기준 체온계 값: 32.2°C
micro:bit: 34°C
방수 DS18B20 (3번째 열): 32.40°C — 가장 정확
DS18B20 (1번째 열): 31.50°C
AM2302/DHT22 (2번째 열): 33°C
결론
체온 측정용: 방수 DS18B20 이 가장 정밀함
실내 온도 측정용: AM2302(DHT22) 이 가장 적합
코드
아두이노 및 온도 센서용 코드 (C/C++)
micro:bit용 코드 (Python)
아두이노 및 온도 센서용 코드 C/C++
#include <SoftwareSerial.h>
#include <cactus_io_AM2302.h>
#define AM2302_PIN 3
#include "cactus_io_DS18B20.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
AM2302 dht(AM2302_PIN);
int DS18B20_Pin = 4;
DS18B20 ds(DS18B20_Pin);
void setup() {
Serial.begin(9600);
ds.readSensor();
dht.begin();
sensors.begin();
Serial.println("18B20 | AM2302 | DS18B20");
Serial.println("Temp (C) | Temp (C) | Temp (C)");
}
void loop() {
ds.readSensor();
sensors.requestTemperatures();
dht.readTemperature();
if (isnan(dht.humidity) || isnan(dht.temperature_C)) return;
Serial.print(sensors.getTempCByIndex(0));
Serial.print(" ");
Serial.print(dht.temperature_C);
Serial.print(" ");
Serial.println(ds.getTemperature_C());
delay(1500);
}
micro:bit용 코드 Python
from microbit import *
uart.init(baudrate=9600, bits=8, parity=None, stop=1, tx=pin8, rx=pin14)
while True:
if button_a.is_pressed():
uart.write(str(temperature()))
회로도