정밀 온도 제어 숯불 스모커 키트: 나만의 BBQ 마스터피스 만들기
부품 및 소모품
| 부품 |
수량 |
| 아두이노 MKR1000 (내장 WiFi, LiPo 충전 지원) |
1 |
| 5V 브러시리스 블로워 팬 |
1 |
| MOSFET IRF520N 드라이버 모듈 |
1 |
| 100kΩ NTC 서미스터 (고온용 실리콘 와이어 타입 권장) |
1+ |
| 브레드보드 |
1 |
| 점퍼 와이어 |
1 |
| 3.7V LiPo 배터리 (≥700mAh) |
1 |
앱 및 온라인 서비스
- 아두이노 IDE
- Microsoft Visual Studio 2015 (유니버설 윈도우 앱 개발용)
프로젝트 배경
진정한 BBQ 애호가들은 숯불 특유의 풍미를 위해 숯을 고집하지만, 온도 유지가 어렵습니다. 환기구 조절을 수시로 해야 하고 숯 양이 줄어들면 다시 조정해야 합니다. 이 프로젝트는 스모커 내부 온도를 자동으로 모니터링하고 블로워 팬으로 공기 유입량을 조절하여 설정 온도를 유지하며, 원격에서 스모커 온도와 고기 심부 온도를 모니터링할 수 있게 합니다.
하드웨어 설계
온도 센서 (서미스터)
- 100kΩ NTC 서미스터를 전압 분배 회로로 구성 (고정 저항 10kΩ, 3.3V 기준)
- 일반적인 스모커 온도(225°F ≈ 107°C)에서 서미스터 저항이 ~10kΩ 근처가 되어 측정 감도 최적
- 50°F~300°F 이상 측정 가능
- 스테인리스 튜브(1/4인치 이하)에 센서 삽입 후 단부 압착 밀봉, 열수축 튜브로 마감 → 프로브 완성
- A0: 스모커 그레이트 온도 측정용 (짧은 프로브)
- A1~A6: 고기 심부 온도 측정용 추가 프로브 연결 가능
블로워 팬 제어
- 스모커 환기구에 스테인리스 강아지 밥그릇을 덮고 바닥에 구멍 내어 블로워 장착
- 환기구 완전 차단 + 블로워 열격리 효과
- N채널 MOSFET(IRF520N 모듈)로 팬 PWM 제어 (게이트 → 아두이노 디지털 핀)
- LiPo 배터리를 MOSFET 모듈 전원 입력에 연결, JST 플러그로 MKR1000 충전 잭과 연동
브레드보드 프로토타이핑
테스트용으로 가변저항(10kΩ)을 추가하여 서미스터 입력 시뮬레이션 가능하게 구성. 팬 동작 표시용 LED(330Ω 저항 직렬) 핀 0에 연결.
소프트웨어 구조
아두이노 스케치 (웹 서버 방식)
- Simon Monk 저 "Programming Arduino Next Steps"의 WiFi 서버 예제 기반
- 고정 IP 할당 (192.168.123.90) → DHCP 없이도 접속 가능
- 루프에서 클라이언트 요청 대기 → 웹 페이지 서빙
- URL 파라미터 't'로 목표 온도 설정 가능
- 현재 온도 읽기 → 목표 온도 미만 시 팬 ON, 초과 시 OFF
- 서미스터 온도 계산: 전압 분배 → 전류 계산 → 서미스터 저항 → Beta 공식으로 온도 변환
Beta 공식 (Steinhart-Hart 근사)
1/T = 1/T0 + (1/Beta) * ln(R/R0)
// T, T0: 켈빈 온도, R: 현재 저항, R0: T0에서의 저항
웹 페이지 구성
- HTML 테이블로 스모커 온도 + 프로브 1~6 온도 표시
- 목표 온도 입력 폼 (GET 방식)
- 자동 새로고침 또는 수동 요청으로 업데이트
윈도우 유니버설 앱 (원격 모니터링)
윈도우 10 기기(PC, 태블릿, 폰)에서 실행 가능한 앱으로:
- 주기적으로 스모커 웹 페이지 요청 및 파싱
- 스모커 온도, 프로브 온도들 실시간 표시
- 목표 온도 원격 설정 기능
- 소파에서 편하게 모니터링하며 음료와 스포츠 경기 관람 가능 😄
소스 코드 및 자료
아두이노 스케치 (주요 부분)
// sketch_12_04_server_wifi
#include <SPI.h>
#include <WiFi101.h>
char ssid[] = "BeeBar2";
char pass[] = "9254582716";
WiFiServer server(80);
WiFiClient client;
IPAddress server_IP(192,168,123,90);
float targetTemperature = 225;
float smokerTemperature = 225;
float v0;
void setup() {
Serial.begin(9600);
while (!Serial) {}
for (int i = 0; i < 10; i++) pinMode(i, OUTPUT);
analogReadResolution(12); // 12비트 ADC (MKR1000)
if (WiFi.begin(ssid, pass)) {
WiFi.config(server_IP);
printWifiStatus();
} else {
Serial.println("Could not connect to network");
}
server.begin();
}
void loop() {
client = server.available();
if (client) {
if (client.connected()) {
// HTTP 헤더 읽기, 목표 온도 파라미터 파싱
// 웹 페이지 응답 전송
}
}
int reading = analogRead(0);
v0 = (float)reading / 1241.0; // 12비트 ADC: 4095/3.3V ≈ 1241
smokerTemperature = ThermisterTemp(v0, 100000, 10000, 3950, 25);
digitalWrite(0, smokerTemperature < targetTemperature); // 팬 제어
}
float ThermisterTemp(float Vtherm, int R0therm, int Rfixed, int Beta, int T0) {
double I = (3.3 - Vtherm) / Rfixed;
double Rtherm = Vtherm / I;
T0 += 273.15;
double T = 1.0 / ((1.0 / (double)Beta) * log(Rtherm / (double)R0therm) + (1.0 / (double)T0));
return (float)((9 * (T - 273.15)) / 5) + 32; // 화씨 변환
}
// ... 웹 페이지 생성 함수들 생략 ...
전체 코드 저장소
GitHub: github.com/DuncanBarbee/SmokerController (스케치 + 유니버설 앱 전체 코드)
회로도
프리칭(Fritzing) 파일 제공 (MKR1000은 나노로 대체되어 표현됨). 서미스터 전압 분배, MOSFET 드라이버, 블로워, 배터리 연결 포함.
향후 개선 방향
- PID 제어로 온도 오버슈트/언더슈트 최소화
- 여러 프로브 동시 모니터링 UI 개선
- 배터리 잔량 모니터링 및 저전압 알림
- 데이터 로깅 (SD 카드 또는 클라우드)
- 전용 PCB 제작으로 소형화 및 내구성 향상