5조-와쏘베쏘
목차
- 1 프로젝트 개요
- 2 서론
- 3 설계
- 3.1 설계사양
- 3.2 개념설계안
- 3.3 이론적 계산 및 시뮬레이션
- 3.4 상세설계 내용
- 4 결과 및 평가
프로젝트 개요
기술개발 과제
국문 : 펠티어 소자를 이용한 냉/난방 슈트
영문 : Cooling and Heating Suit Using Peltier Module
과제 팀명
와쏘베쏘
지도교수
이동찬 교수님
개발기간
2025년 9월 ~ 2025년 12월 (총 4개월)
구성원 소개
서울시립대학교 기계정보공학과 20224300** 김**(팀장)
서울시립대학교 기계정보공학과 20194300** 이**
서울시립대학교 기계정보공학과 20204300** 전**
서울시립대학교 기계정보공학과 20224300** 박**
서론
개발 과제의 개요
개발 과제 요약
본 과제는 산업 현장과 일상생활에서 모두 활용 가능한 웨어러블 냉난방 슈트를 개발하는 것을 목표로 한다. 본 슈트는 작업복 원단에 펠티어 기반 모듈형 열전 패치를 부착하고, 제어보드, 교체형 배터리 팩 등을 통합한 구조로 설계된다. 착용자의 등·허리·복부 등에 분산 배치하여 압박감과 활동 제약을 최소화하며, 전자부와 섬유부를 분리 가능한 방수 커넥터로 연결해 세탁과 유지관리가 용이하다. 프로토타입 개발은 부품 단위 벤치 시험에서 시작해 부분 패치, 부분 슈트, 완성 시제품 단계로 점진적으로 고도화되며, 열 쾌적성 확보 및 소음 최소화를 목표 성능으로 한다.
개발 과제의 배경
기후 변화로 인한 폭염과 한파가 빈번해지면서 야외 작업자와 일상 생활에서의 열적 스트레스가 증가하고 있다. 기존의 공랭식(팬) 조끼는 외부 공기가 뜨거울 경우 냉각 효과가 저하되는 '열풍 순환' 문제가 있으며, 발열 조끼는 난방 기능만 제공한다는 한계가 있다. 또한, 상변화 물질(PCM) 방식은 지속 시간이 짧고 무게가 무겁다. 이에 따라 사계절 내내 사용 가능하며, 능동적인 체온 조절이 가능한 통합형 냉난방 솔루션의 필요성이 대두되었다.
개발 과제의 목표 및 내용
- 양방향 온도 제어: 펠티어 소자의 전류 방향 제어를 통해 단일 기기로 냉각과 난방을 모두 수행 (목표 온도 도달 시간 단축).
- 스마트 제어 및 모니터링: 3계층 제어 구조(App-Cloud-Embedded)를 통해 실시간으로 시스템을 모니터링하고, PID 제어를 통해 에너지 효율을 최적화.
- 인체 공학적 열 배치: 척추 라인을 따른 냉각 모듈 배치와 Warm Preference 연구에 기반한 복부 난방 모듈 배치로 적은 에너지로 최대의 쾌적감 제공.
- 안전성 및 편의성: 저온 화상 방지 로직(45도 제한), 방수 커넥터 적용, 2kg 이하 경량화 실현.
관련 기술의 현황
관련 기술의 현황 및 분석(State of art)
기존 웨어러블 온도 조절 기술 유형
1. 공랭식 (Air Cooling)
- 원리: 소형 팬을 이용해 의류 내부로 공기를 순환시켜 땀 증발을 촉진하고 대류 열전달을 유도.
- 한계: 외기 온도가 체온보다 높을 경우 냉각 효과가 급격히 저하되며, 습도가 높은 환경에서는 증발 냉각 효율이 떨어짐.
2. 상변화 물질 (PCM)
- 원리: 고체에서 액체로 변할 때 주위 열을 흡수하는 잠열(Latent Heat)을 이용.
- 한계: 냉각 지속 시간이 짧고(1~2시간), 다시 얼리기 위한 냉동 과정이 필요하며, 결로 현상으로 인해 의류가 젖을 수 있음.
3. 펠티어 (Thermoelectric) 기술
- 원리: 서로 다른 두 반도체(P형, N형) 접합부에 전류를 흘리면 한쪽은 흡열(냉각), 반대쪽은 발열하는 펠티어 효과 이용.
- 장점: 소음과 진동이 적고, 전류의 방향만 바꾸면 냉/난방 전환이 가능하며, PID 제어를 통해 정밀한 온도 유지가 가능함.
- 과제: 발열부(Hot side)의 효율적인 방열 설계가 냉각 성능의 핵심이며, 전력 소모가 상대적으로 큼.
기술 로드맵 (Technology Roadmap)
1. 팬(대류) 기반 착용형 냉각 기술 로드맵
| 시기 | 주요 내용 |
|---|---|
| 2000년대 초반 | 개념 등장 및 산업용 초기 시제품 개발 (Kuchofuku 등) |
| 2010년대 초반 | 리튬이온 배터리 결합 및 사용 시간 증대 |
| 2010년대 후반 | 고성능 모터 적용 및 내환경성(방수/방진) 확보 |
| 2020년대 초반 | 열생리학적 검증 및 공기 유로 최적화 연구 |
| 현재 | 스마트 제어 및 복합 냉각 구조(하이브리드) 등장 |
- 2000년대 초반: 일본 Kuchofuku사가 세계 최초로 팬 내장 작업복 개발. 땀 증발을 이용한 기화열 냉각 원리 도입.
- 2010년대: 배터리 소형화로 대중화 시작. Makita, Hitachi 등 전동공구 기업 진입으로 12시간 연속 작동 및 내구성 확보.
- 현재: IoT 센서와 연동된 자동 풍량 조절, PCM 등 타 냉각 방식과 결합된 복합 구조로 발전 중.
2. 펠티어 기반 웨어러블 냉·난방 기술 로드맵
| 시기 | 주요 내용 |
|---|---|
| 2010년대 초반 | 기초 연구 단계 (피부 온도 조절 가능성 탐색) |
| 2010년대 중반 | 고성능 열전 모듈 개발 및 시제품 제작 |
| 2020년대 초반 | 유연 소자(Flexible) 개발 및 구조적 통합 연구 |
| 2020년대 중반 | 상용화 시작 및 스마트 디바이스 등장 (Sony Reon Pocket 등) |
- 2010년대 초반: Bi₂Te₃ 계열 소형 모듈 기초 연구. 효율이 낮고 방열 구조가 미흡하여 이론 정립에 집중.
- 2010년대 중반: 고성능 소재 개발로 냉각 성능 개선. 2019년 연구에서 피부 온도 최대 8.2℃ 냉각 실증.
- 2020년대 초반: 플렉서블 기판(PET, PI) 적용으로 의류 통합성 향상. 방열판+팬 하이브리드 구조 도입.
- 현재 (상용화): Sony REON POCKET 등 소형 웨어러블 기기 출시. 냉/온 양방향 제어 및 앱 연동 피드백 제어 기술 적용.
특허 조사
관련 특허 분석 및 회피 전략
- 특허 1: 전자 열전모듈에 의한 지능형 항온의복 (KR20060078063A)
- 특징: 펠티어 모듈을 의복에 적용하여 체온 유지.
- 한계: 제어 로직이 단순(On/Off)하여 세밀한 온도 조절 불가, 방열 구조 미흡.
- 특허 2: 펠티어 냉난방 조끼 (KR20100007295U)
- 특징: 조끼 형태의 직접 냉난방 구현.
- 한계: 배터리 교체 및 세탁 편의성 고려 부족, 온도 피드백 제어 부재.
- 본 프로젝트의 차별화 전략
- 분산 배치 및 모듈화: 펠티어 소자를 등과 복부에 분산 배치하고, 유지보수가 쉬운 교체형 배터리 시스템 적용.
- 지능형 제어: 단순 On/Off가 아닌 PID 제어 및 모바일 앱 연동을 통한 사용자 맞춤형 제어 구현.
- 복합 냉각 구조: 펠티어 소자와 능동 송풍 팬(Active Cooling)을 결합한 하이브리드 방열 구조 설계.
시장상황에 대한 분석
경쟁제품 조사 비교
개발과제의 기대효과 및 파급효과
가. 기술적 기대효과
- 양방향 온도 제어 기술 확보: 펠티어 소자의 극성 제어를 통해 단일 하드웨어로 냉각과 가열을 동시에 구현하는 메커니즘 확보. (예상 성능: 외기 대비 ±5℃ 조절)
- 에너지 효율 최적화: CFD 해석(STAR-CCM+)을 통한 방열 구조 최적화와 PID 기반 PWM 제어로 배터리 효율 20% 향상 및 연속 사용 시간(2~3시간) 확보.
- 스마트 제어 시스템: 하드웨어(Arduino/RPi)-서버(Firebase)-사용자(App) 간의 유기적인 데이터 통신 및 제어 아키텍처 구현.
나. 경제적 및 사회적 파급효과
- 산업 안전 및 생산성 향상: 건설, 물류 등 고온/한랭 작업 환경 종사자의 열 스트레스를 줄여 온열 질환 및 안전 사고 예방.
- 시장 확장성: 산업용 보호구 시장뿐만 아니라 레저, 스포츠, 군용 장비 등 다양한 웨어러블 분야로 기술 적용 확대 가능.
- 친환경성: 프레온 가스 등 냉매를 사용하지 않는 친환경 반도체 냉각 방식으로 ESG 가치 실현.
기술개발 일정 및 추진체계
개발 일정
| 단계별 세부개발 내용 | 담당자 | 9월 | 10월 | 11월 | 12월 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 | ||
| 주제 선정 및 자료 조사 | 전원 | ||||||||||||||||
| 하드웨어 설계 | 박** 김** |
||||||||||||||||
| 열 해석 | 전** 김** |
||||||||||||||||
| 하드웨어 구현 | 박** 전** 김** |
||||||||||||||||
| 제어 시스템 개발 | 이** 김** |
||||||||||||||||
| 사용자 인터페이스 개발 | 이** | ||||||||||||||||
| 시스템 통합 | 전원 | ||||||||||||||||
| 테스트 및 수정 | 전원 | ||||||||||||||||
| 사용자 테스트 및 최종 점검 | 전원 | ||||||||||||||||
- 2025.09: 아이디어 구체화, 관련 기술 및 특허 조사, 개념 설계
- 2025.10: 상세 설계, 부품 선정 및 발주, UI/UX 설계, 제어 알고리즘 구현
- 2025.11: 하드웨어 제작(3D 프린팅, 회로 구성), 소프트웨어 연동, 통합 테스트
- 2025.12: 성능 최적화, 최종 보고서 작성 및 발표
구성원 및 추진체계
- 김** (팀장): 열 해석 및 하드웨어 설계/구현
- 이**: 제어 시스템 및 사용자 인터페이스 개발
- 전**: 열 해석 및 하드웨어 구현
- 박**: 하드웨어 설계 및 구현
설계
설계사양
제품의 요구사항
가. 제품 요구사항 및 목적계통도
| 번호 | 요 구 사 항 | D or W | 비고 |
|---|---|---|---|
| 1 | 굴곡, 팔꿈치 등 곡면에도 작동할 것 | D | 상 |
| 2 | 착용 시 피부, 의류 손상을 방지할 것 | D | 상 |
| 3 | 착용 후 사용할 때 불편함을 방지할 것 | D | 중 |
| 4 | 온도 조절이 용이할 것 | D | 중 |
| 5 | 실시간 상태를 화면에 모니터링으로 표시하는지 | D | 하 |
| 6 | 전체 중량이 2kg 이하일 것 | W | 상 |
| 7 | 소음, 진동이 최소화될 것 (40dB 이하) | W | 중 |
| 8 | 어플리케이션 조작이 용이할 것 | W | 중 |
목적계통도 요약
- 안전성: 전기적 절연 구조, 과열 시 자동 차단(PID 제어 및 전류 제한), 저온 화상 방지(45도 제한).
- 기능성: 펠티어 소자 전류 방향 제어로 냉/난방 겸용, 에너지 효율 20% 향상.
- 편의성: 무게 분산 배치(2kg 이하), 덕트형 유로 설계, 앱을 통한 3계층 제어 구조.
개념설계안
구조 설계
온도 전달 방법 및 옷 형식
| 구분 | 조끼 & 열전도 | 바람막이 & 대류 |
|---|---|---|
| 개념도 | |
|
| 장점 | 목표 온도까지 빠르게 도달 가능 | 상대적으로 미세한 온도 조절을 하지 않아도 사용자가 불편함을 느끼지 않음 |
| 단점 | 사용자에게 직접 닿는 만큼 미세한 온도 조절이 필요함 |
목표 온도까지 도달이 상대적으로 느림 |
| 선정 | O (채택) | X |
펠티어 소자 방열판 및 팬 사이즈
| 구분 | 큰 팬 & 큰 방열판 1개 | 작은 팬 & 작은 방열판 여러 개 |
|---|---|---|
| 개념도 | |
|
| 장점 | 목표 온도까지 빠르게 도달 가능 | 가벼움 |
| 단점 | 무거움 | 목표 온도까지 도달이 상대적으로 느림 |
| 선정 | X | O (채택) |
온도 센서 배치
| 구분 | 옷 끝단에 배치 | 좌우 팔 및 옷 전면과 후면에 배치 |
|---|---|---|
| 개념도 | |
|
| 장점 | 외부 온도 변화 감지에 유리 | 체감 온도에 가장 근접하게 측정 가능 |
| 단점 | 등, 목과 같은 핵심 냉난방 구역의 온도 측정 불가 | 사용자의 움직임에 간섭이 있을 수 있음 |
| 선정 | X | O (채택) |
온도 제어 설계
제어 형식
| 구분 | On-off 방식 | PID 제어 |
|---|---|---|
| 개념도 | |
|
| 장점 | 구조가 단순하고 구현이 쉬움 | 온도 안정도가 우수해 사용자의 불쾌감을 덜 수 있음 |
| 단점 | 미세 조정 불가로 사용자에게 불쾌감을 줄 수 있음 | 제어 알고리즘 설계가 복잡함 |
| 선정 | X | O (채택) |
입력 제어 방식
| 구분 | 단계별 입력 방식 | 온도 입력 방식 |
|---|---|---|
| 개념도 | |
|
| 장점 | 조작이 간단하고 직관적임 | 정밀제어 가능 |
| 단점 | 세밀한 온도 조절 불가 | 시스템 복잡성 증가 |
| 선정 | X | O (채택) |
하드웨어 배치 설계
- 냉방 배치 (등): 선행 연구에 따르면 등 부위는 냉각 시 전체 열 쾌적성에 가장 큰 영향을 미치는 부위임. 척추 축을 따라 열 전달이 용이하도록 등 상부에 2개, 등 하부 중앙에 1개의 펠티어 모듈을 배치함.
- 난방 배치 (복부): 인체 부위 중 온열감 선호도(Warm Preference)가 가장 높은 복부에 2개의 난방용 모듈을 배치함.
- 모듈 구조: 3D 프린팅으로 제작된 케이스 내부에 펠티어 소자, 히트싱크(방열판), 마이크로 팬을 적층 구조로 조립. 펠티어의 발열면에서 발생하는 열을 팬을 통해 강제로 외부로 배출시키는 구조.
이론적 계산 및 시뮬레이션
펠티어 효과 및 열전달 모델링
본 시스템의 핵심 구동체인 펠티어 소자(Thermoelectric Cooler, TEC)는 전류의 흐름에 따라 열을 이동시키는 반도체 소자이다. 시스템의 최적 제어를 위해 다음과 같은 열역학적 수식을 기반으로 냉각 용량(Qc)과 소비 전력 간의 상관관계를 모델링하였다.
- 1. 펠티어 효과 (Peltier Effect) - 흡열 메커니즘
- Qp = π · I
- (π: 펠티어 계수 [V], I: 전류 [A])
- 서로 다른 두 반도체(P형, N형) 접합부에 전류가 흐를 때 발생하는 열 이동 현상이다.
- 이 항은 전류에 정비례(Linear)하여 증가하므로, 전류를 많이 흘릴수록 냉각 측에서 더 많은 열을 빼앗아 올 수 있음을 의미한다.
- 2. 줄 발열 (Joule Heating) - 내부 손실
- Qj = I² · R
- (R: 소자 내부의 전기 저항 [Ω])
- 소자에 전류가 흐를 때 내부 저항에 의해 비가역적으로 발생하는 열이다.
- 이 항은 전류의 제곱(Square)에 비례하여 증가한다. 즉, 전류가 증가하면 냉각 효과보다 발열 효과가 훨씬 가파르게 상승하게 된다.
- 따라서 무조건 높은 전류를 공급하는 것이 능사가 아니며, 줄 발열이 펠티어 효과를 압도하지 않는 **최적 전류 지점(Optimal Current)**을 찾는 것이 제어의 핵심이다.
- 3. 열 전도 (Heat Conduction) - 열 역류 현상
- Qcond = K · ΔT
- (K: 열전도율 [W/K], ΔT: 고온부와 저온부의 온도 차)
- 펠티어 소자의 고온부(발열면)에서 저온부(흡열면)로 열이 다시 흘러 들어오는 현상이다.
- 방열 설계가 미흡하여 고온부 온도가 높아지면($\Delta T$ 증가), 냉각 효율이 급격히 저하된다.
- 4. 종합 냉각 능력 (Net Cooling Capacity)
- Q_total = (π · I) - (0.5 · I² · R) - (K · ΔT)
- 실제 냉각 능력은 펠티어 효과에서 '줄 발열의 절반'과 '열 전도 손실'을 뺀 값으로 결정된다.
- 본 프로젝트에서는 이 수식을 바탕으로 PID 제어 알고리즘을 설계하였으며, 줄 발열을 최소화하기 위해 PWM(Pulse Width Modulation) 방식으로 평균 전류를 제어하여 에너지 효율을 최적화하였다.
CFD 열유동 해석 (STAR-CCM+)
펠티어 소자의 성능은 '고온부의 열을 얼마나 빨리 배출하느냐'에 달려 있다. 이를 위해 상용 해석 툴인 STAR-CCM+를 활용하여 방열판(Heat Sink)과 송풍 팬의 조합에 대한 전산유체역학(CFD) 해석을 수행하였다.
- 1. 해석 조건 및 모델링
- 목표: 펠티어 고온부 온도를 외기 온도 +10℃ 이내로 유지하며, 소음을 40dB 이하로 억제.
- 변수: 방열판의 핀(Fin) 간격, 높이, 팬의 회전수(RPM), 유로 형상.
- 경계 조건: 펠티어 발열량 30W 가정, 외기 온도 30℃, 자연 대류 및 강제 대류 조건 적용.
- 2. 해석 결과 및 최적화
- 유동 박리 개선: 초기 모델에서 팬 날개 끝단에서 발생하는 와류(Vortex)로 인해 소음이 발생하는 것을 확인하였다. 이를 개선하기 위해 덕트 형상을 유선형으로 변경하여 공기 저항을 줄였다.
- 방열 효율 20% 향상: 방열판의 핀 간격을 조밀하게 할수록 표면적은 넓어지나 유속이 저하되는 트레이드오프 관계를 분석하였다. 해석 결과 최적의 핀 간격을 도출하여, 기존 대비 열 저항(Rth)을 낮추고 에너지 효율을 20% 향상시켰다.
- 저소음 설계 검증: 4000 RPM 이하의 저속 회전에서도 충분한 풍량이 확보되는 팬-방열판 조합을 선정하여, 목표 소음치인 40dB 이하를 달성할 수 있음을 시뮬레이션으로 검증하였다.
- 3. 슈트 내부 유로 설계
- 국소적인 냉각에 그치지 않고 냉기가 등과 허리 전체로 퍼질 수 있도록 **덕트형 유로(Duct-type Flow path)**를 설계하였다.
- 해석 결과를 통해 냉기가 척추 라인을 따라 하강하며 등 전체의 온도를 균일하게 낮추는 열 분포를 확인하였다.
상세설계 내용
하드웨어 구현 (회로 및 부품)
- 제어부 (MCU & Computer)
- Raspberry Pi 5: 메인 컨트롤러로서 Wi-Fi 통신, 고수준 연산, Firebase 데이터 동기화를 담당. Python 기반 멀티스레딩 환경에서 동작.
- Arduino Mega 2560: 라즈베리파이로부터 명령을 받아 하드웨어(모터 드라이버, 센서)를 직접 제어하는 저수준 컨트롤러.
- 구동부 (Actuator)
- 펠티어 소자 (TEC1-12704): 12V 동작 전압, 최대 4A 소모. 5개를 배치.
- 모터 드라이버 (BTS7960): 고전류(최대 43A)를 제어할 수 있는 H-Bridge 드라이버. PWM 신호를 통해 펠티어 소자의 출력(전압/전류)을 조절하고 극성을 반전시켜 냉/난방 모드를 전환함.
- 센서 및 전원
- 온도 센서: 의복 내부 및 펠티어 표면 온도를 측정하여 PID 제어의 피드백 입력값으로 사용.
- 배터리 팩: 12V 고출력 리튬이온 배터리를 사용하여 전체 시스템에 전력을 공급. SMPS 역할을 하는 전원 분배 보드를 통해 5V(제어부)와 12V(구동부)로 분기.
소프트웨어 구현
- 전체 소스 코드: GitHub - MeiLL3r/CapstoneDesign
3계층 제어 아키텍처 (3-Layer Architecture)
본 시스템은 Android App (UI) ↔ Firebase (DB) ↔ Embedded (Control)의 3계층 구조로 설계되었다. 각 계층은 독립적으로 동작하며, 네트워크 연결이 끊기더라도 안전 모드로 진입하는 Fail-safe 로직을 포함한다.
안드로이드 어플리케이션 (Presentation Layer)
안드로이드 어플리케이션은 사용자가 시스템을 원격으로 제어하고 모니터링하는 인터페이스를 제공한다. MVVM(Model-View-ViewModel)과 같은 복잡한 아키텍처 대신, Activity가 직접 Firebase와 통신하며 UI를 갱신하는 직관적인 구조를 채택하여 데이터 처리의 지연 시간을 최소화하였다.
기기 목록 관리 및 실시간 동기화 메커니즘 (MainActivity)
어플리케이션의 진입점인 MainActivity에서는 등록된 모든 기기의 상태를 실시간으로 동기화한다. 이를 위해 Firebase의 ValueEventListener를 이용한 콜백(Callback) 기반의 비동기 데이터 처리 방식을 사용한다.
- 데이터 수신 및 갱신 알고리즘
- 리스너 등록: onCreate() 생명주기에서 Firebase 데이터베이스의 최상위 devices 경로에 대한 참조(Reference)를 획득하고, addValueEventListener를 등록하여 앱 실행 중 발생하는 모든 하위 데이터 변경을 감지한다.
- 로컬 리스트 초기화: onDataChange 콜백이 트리거되면, 데이터 중복 방지를 위해 메모리에 로드된 기존 기기 목록(deviceList)을 clear() 메소드로 비운다.
- 객체 재생성 및 렌더링: DataSnapshot을 순회하며 추출한 데이터를 기반으로 Device 객체를 재생성하고, notifyDataSetChanged()를 호출하여 UI를 처음부터 다시 그린다. 이 과정을 통해 데이터베이스와 사용자 화면은 항상 밀리초(ms) 단위의 오차로 일치하게 된다.
이중 안전장치(Fail-safe) 하트비트 로직
단순히 데이터베이스의 상태 값을 읽는 것을 넘어, 네트워크 지연이나 컨트롤러의 비정상 종료(전원 차단 등)까지 고려한 '하트비트(Heartbeat)' 알고리즘을 적용하여 신뢰성을 확보하였다.
- 알고리즘 상세 로직
- onDataChange 콜백 내에서 각 기기의 명시적인 상태 필드(status)와 마지막 통신 타임스탬프(last_seen)를 모두 가져온다.
- System.currentTimeMillis()로 현재 시간을 구한 뒤, 다음 조건식을 검사한다.
-
if (status == "online" && (currentTime - lastSeen > OFFLINE_THRESHOLD_MS))
-
- 여기서 OFFLINE_THRESHOLD_MS는 2분(120,000ms)으로 설정되어 있다. 즉, "DB에는 온라인이라고 되어있지만, 2분 이상 신호가 없는가?"를 검증한다.
- 조건이 참(True)이라면 해당 기기의 상태를 강제로 "offline"으로 간주하여 UI에 표시함으로써, 사용자가 통신 두절 상태를 명확히 인지할 수 있도록 한다.
스와이프 제스처 처리 및 커스텀 UI 렌더링
RecyclerView의 ItemTouchHelper 클래스를 확장하여, 단순한 클릭이 아닌 제스처 기반의 직관적인 사용자 경험(UX)을 제공한다.
- 동작 매커니즘
- 제스처 감지: onSwiped 메소드에서 direction 파라미터를 통해 사용자가 왼쪽으로 밀었는지(삭제), 오른쪽으로 밀었는지(수정)를 판단하여 적절한 다이얼로그를 호출한다.
- 동적 캔버스 드로잉: onChildDraw 메소드를 오버라이드하여 스와이프가 진행되는 동안 매 프레임마다 호출한다. 이동 거리(dX)의 부호에 따라 Paint 객체를 사용해 빨간색(삭제) 또는 파란색(수정) 배경과 아이콘을 실시간으로 그려 시각적 피드백을 제공한다.
// 스와이프 시 배경 및 아이콘 그리기 (onChildDraw 발췌)
if (dX < 0) { // 왼쪽 스와이프 (삭제)
paint.color = Color.RED
val background = RectF(
itemView.right.toFloat() + dX, itemView.top.toFloat(),
itemView.right.toFloat(), itemView.bottom.toFloat()
)
c.drawRoundRect(background, cornerRadius, cornerRadius, paint)
// ... 아이콘 그리기 로직 ...
}
통합 데이터 파싱 및 동적 UI 생성 (ControlActivity)
ControlActivity는 특정 기기의 제어를 전담하며, XML에 고정된 레이아웃을 사용하지 않고 데이터에 따라 화면을 실시간으로 구성하는 '동적 UI 생성 알고리즘'을 탑재했다.
- 단일 스트림 수신 및 뷰 객체 생성
- devices/{deviceId} 경로에 리스너를 하나만 등록하여, 해당 기기의 상태, 제어, 설정 정보를 하나의 스냅샷으로 수신한다.
- 파싱된 센서 데이터 리스트(sensorDisplayList)를 순회하며, 코드상에서 TextView 객체를 생성(new TextView)하고 시각적 속성을 설정한다.
- 제약조건(Constraint) 기반 상대 좌표 매핑
- Firebase에 저장된 정규화된 좌표값(posX, posY: 0.0 ~ 1.0)을 읽어온다.
- ConstraintSet을 생성하여 현재 레이아웃을 복제한 뒤, setHorizontalBias와 setVerticalBias 함수에 좌표값을 전달한다.
- 이를 통해 기기의 화면 크기나 비율이 달라져도 의류 이미지 위의 정확한 상대 위치에 센서 아이콘이 배치되도록 보장한다.
데이터 시각화 및 비동기 예외 처리
수치 데이터를 직관적인 색상 정보로 변환하고, 제어 중 발생할 수 있는 네트워크 단절 상황을 방어한다.
- 온도 차이 기반 색상 시각화
- 개별 센서 온도(sensorTemp)와 전체 평균 온도(avgTemp)의 차이(diff)를 계산하고, when 조건문을 사용하여 범위를 분류한다.
- diff > 2.0: 빨간색 (집중 냉각 필요 부위)
- diff < -2.0: 파란색 (과냉각 주의 부위)
- 그 외: 초록색 (적정 온도 유지 중)
- 결정된 색상을 GradientDrawable에 적용하여 뷰의 배경색을 실시간으로 변경한다.
- 개별 센서 온도(sensorTemp)와 전체 평균 온도(avgTemp)의 차이(diff)를 계산하고, when 조건문을 사용하여 범위를 분류한다.
- 실시간 연결 감시 및 강제 종료
- 메인 데이터 흐름과는 별도로, devices/{id}/connection 경로만 전담으로 감시하는 두 번째 ValueEventListener를 등록한다.
- 제어 화면 사용 중 기기의 전원이 꺼지거나 통신이 두절되어 상태가 "offline"으로 변하면, 리스너가 이를 감지하여 Toast 메시지를 띄우고 finish()를 호출해 화면을 강제 종료한다. 이는 오프라인 기기에 대한 잘못된 제어 명령 전송을 원천 차단한다.
데이터 로깅 및 시계열 분석 (LogActivity)
단순한 실시간 제어를 넘어, 과거의 온도 데이터를 분석하여 사용자에게 패턴을 제공하기 위해 별도의 로그 액티비티를 구현하였다. 이 기능은 MPAndroidChart 라이브러리를 활용하여 텍스트 데이터와 시각적 그래프를 동시에 제공한다.
- 비동기 체이닝(Chaining) 데이터 로드 전략
- 로그 데이터에는 'sensor_01'과 같은 ID만 저장되어 있어 사용자가 식별하기 어렵다. 이를 해결하기 위해 **[센서 이름 메타데이터 로드] → [로그 데이터 로드]**의 순차적 비동기 실행 구조를 설계하였다.
- status/sensors 경로에서 현재 설정된 센서의 한글 이름(예: "왼쪽 팔", "등 중앙")을 먼저 가져와 Map 구조에 캐싱한 뒤, 로그 데이터를 로드하여 그래프 범례(Legend)와 리스트에 매핑한다.
- 시계열 차트 동적 렌더링
- LineDataSet을 센서 개수만큼 동적으로 생성하고, 각각 다른 색상(Red, Blue, Green, Orange 순환)을 부여하여 가시성을 높였다.
- X축은 타임스탬프(HH:MM)로 포맷팅하고, 데이터가 없는 구간은 그래프를 끊지 않고 보간(Interpolation)하여 부드러운 곡선으로 표현한다.
// 비동기 체이닝 및 차트 설정 핵심 코드
private fun fetchSensorNamesAndThenLogs(todayStr: String) {
// 1. 메타데이터(센서 이름) 우선 로드
namesRef.get().addOnSuccessListener { snapshot ->
sensorNameMap.clear()
for (child in snapshot.children) {
sensorNameMap[child.key!!] = child.child("name").value.toString()
}
// 2. 이름 로드 완료 후 로그 데이터 로드 시작
fetchLogs(todayStr)
}
}
private fun setupChart() {
// 센서별로 Entry 리스트 분리 및 LineDataSet 생성
entriesMap.forEach { (sensorId, entries) ->
// ID 대신 매핑된 한글 이름 사용
val displayName = sensorNameMap[sensorId] ?: sensorId
val set = LineDataSet(entries, displayName)
// 센서별 고유 색상 자동 할당
set.color = colors[colorIndex % colors.size]
dataSets.add(set)
}
chart.invalidate() // 차트 갱신
}
데이터 레이어 및 파이어베이스 구조 (Data Layer)
본 시스템의 모든 구성 요소(App, Python, Arduino)는 Firebase Realtime Database를 통해 상태를 공유한다. 데이터 무결성을 보장하기 위해 역할별로 노드를 엄격히 분리한 JSON 트리 구조를 설계하였다.
- 데이터베이스 구조 다이어그램
devices
└── {device_id} (예: 123)
├── connection // [연결 상태 관리]
│ ├── status: "online" | "offline"
│ └── last_seen: 1763469384771 (Timestamp)
├── control // [제어 명령: App → Python]
│ ├── global_mode: "cooling" | "heating"
│ └── groups
│ ├── group_1 (전면)
│ │ └── target_temp: 22
│ └── group_2 (후면)
│ └── target_temp: 24
├── status // [현재 상태: Python → App]
│ ├── current_temp: 23 (평균)
│ └── sensors
│ ├── sensor_01
│ │ ├── name: "왼쪽 팔"
│ │ ├── temp: 22
│ │ ├── posX: 0.15
│ │ └── posY: 0.45
│ └── ... (sensor_02 ~ 05)
├── presets // [사용자 설정 저장]
│ └── preset_daily: { ... }
└── logs // [데이터 로깅]
└── 20251214
└── 103000: { "sensor_01": 22, ... }
- 노드별 역할 정의
- connection: 하트비트 알고리즘을 위한 전용 노드. App은 이 값을 감시하여 기기의 오프라인 여부를 판단한다.
- control: 사용자의 '희망 상태(Desired State)'를 저장한다. Python 컨트롤러는 이 값이 변경될 때만 하드웨어를 제어한다(Event-driven).
- status: 하드웨어의 '현재 상태(Current State)'를 저장한다. Arduino가 측정한 센서값이 이곳에 실시간으로 업데이트된다.
- logs: 시계열 데이터 분석을 위해 날짜(YYYYMMDD)/시간(HHMMSS) 구조로 온도 데이터를 영구 저장한다.
임베디드 컨트롤러 (Control Layer - Python)
Raspberry Pi 5에서 구동되는 Python 컨트롤러는 클라우드(Firebase)와 물리적 하드웨어(Arduino) 사이의 이질적인 프로토콜을 변환하고 중개하는 '브리지(Bridge)' 역할을 수행한다. 단일 스레드의 한계를 극복하기 위해 멀티스레딩 아키텍처를 도입하였다.
아키텍처 및 핵심 기능
- 멀티스레딩 기반 비동기 처리 (Multi-threading)
- 네트워크 통신(Firebase)과 시리얼 통신(Arduino)은 각각 지연(Latency)이 발생할 수 있는 작업이다. 이를 메인 루프에서 순차 처리할 경우 시스템 전체가 멈추는 병목 현상이 발생한다.
- 이를 해결하기 위해 firebase_thread와 arduino_thread를 분리하여 병렬로 동작시키고, 메인 프로세스는 이들의 생명주기를 관리하는 구조를 채택했다.
- 양방향 설정 동기화 (Config Sync & Recovery)
- 컨트롤러 부팅 시 로컬의 config.json 파일과 Firebase의 데이터를 대조하는 sync_config_with_firebase 로직이 실행된다.
- 네트워크 단절 상태에서 재부팅되더라도 로컬 설정을 통해 즉시 동작하며, 인터넷 연결 시 최신 설정으로 자동 동기화되는 복구 능력을 갖추었다.
- 프로토콜 변환 및 중개
- Downstream (App → HW): Firebase의 JSON 이벤트를 감지하여 CMD:GROUP:MODE:TEMP 형태의 아두이노 시리얼 프로토콜로 변환해 전송한다.
- Upstream (HW → App): 아두이노에서 수신된 SENSORS:... 문자열을 파싱하여 JSON 객체로 변환한 뒤 Firebase에 업데이트한다.
핵심 코드 구현
단순한 제어뿐만 아니라, 백그라운드 스레드 관리와 설정 동기화 로직을 포함한 핵심 구현부는 다음과 같다.
# 1. 설정 동기화 및 복구 로직 (Config Sync)
def sync_config_with_firebase():
if not firebase_is_connected: return
# 로컬 설정(config.json)과 클라우드 데이터 비교
local_presets = config_data.get('presets', {})
firebase_data = device_ref.get()
# 양방향 동기화: 로컬에 없으면 다운로드, 클라우드에 없으면 업로드
for preset_id, info in firebase_presets.items():
if preset_id not in local_presets:
local_presets[preset_id] = info # 클라우드 -> 로컬 동기화
# 동기화된 데이터로 config.json 파일 갱신 (영속성 확보)
save_config_to_file()
# 2. 백그라운드 스레드 워커 (Background Worker)
def firebase_thread_worker():
while main_loop_running:
if not firebase_is_connected:
connect_firebase() # 재연결 시도
else:
current_time = time.time()
# 5초마다 하트비트(Last Seen) 전송
if current_time - last_heartbeat_time > HEARTBEAT_INTERVAL:
connection_ref.child('last_seen').set(int(time.time() * 1000))
# 60초마다 센서 데이터 로깅 (Logs 노드 저장)
if current_time - last_log_time > LOG_INTERVAL:
log_ref = db.reference(f'devices/{device_id}/logs/{date_str}/{time_str}')
log_ref.set(current_sensors_data)
time.sleep(1) # CPU 점유율 방지
# 3. 제어 명령 리스너 (Event Listener)
def control_listener(event):
if not event.data: return
# Firebase 변경 사항 감지 후 아두이노 프로토콜로 변환
try:
# 예: CMD:A:COOLING:24 (그룹 A를 24도로 냉방하라)
cmd_a = f"CMD:A:{mode}:{temp_g1}\n"
cmd_b = f"CMD:B:{mode}:{temp_g2}\n"
if arduino and arduino.is_open:
arduino.write(cmd_a.encode()) # 시리얼 전송
time.sleep(0.05) # 전송 안정성 확보
arduino.write(cmd_b.encode())
except Exception as e:
print(f"명령 처리 중 오류: {e}")
펌웨어 및 제어 알고리즘 (Control Layer - Arduino)
Arduino Mega는 모터 드라이버를 통해 실제 펠티어 소자와 팬을 제어한다. 안정적인 온도 유지를 위해 P-제어(비례 제어) 알고리즘과 가상 온도 시뮬레이션 로직이 탑재되었다.
- 그룹 기반 제어 (Group Control)
- 5개의 센서를 신체 부위별 특성에 맞춰 2개의 그룹으로 분할 제어한다.
- Group A (전면/복부): Sensor 1, 2 (빠른 난방 응답성 필요)
- Group B (후면/등): Sensor 3, 4, 5 (넓은 면적 냉각 필요)
- P-제어 알고리즘 (Proportional Control)
- 목표 온도와 현재 온도의 차이에 비례하여 PWM 출력을 조절한다.
- 제어 수식: TargetPWM = Kp * (TargetTemp - CurrentTemp)
- 급격한 전류 변화를 막기 위해 목표 PWM까지 점진적으로 출력을 높이는 Soft-Start 로직을 적용하였다.
- 가상 온도 시뮬레이션 (Virtual Sensor Simulation)
- 센서 노이즈를 필터링하고 알고리즘을 검증하기 위해, 펌웨어 내부에서 열역학 모델을 기반으로 온도를 추정한다. 급격한 변화를 막기 위해 LPF(Low Pass Filter)를 적용했다.
- LPF 수식: CurrentSimTemp = (CurrentSimTemp * 0.9) + (TheoreticalTemp * 0.1)
핵심 코드 (C++): 그룹 로직 및 시뮬레이션
// 그룹별 PWM 계산 및 온도 업데이트 로직
void updateGroupLogic(int idx) {
double target = groups[idx].targetTemp;
double current = groups[idx].currentSimTemp;
// 1. P-제어: 오차에 비례하여 PWM 계산 (Kp = 10.0)
int targetPWM = 0;
double error = abs(current - target);
if (error > 0) targetPWM = (int)(error * Kp * 5);
targetPWM = constrain(targetPWM, 0, 255); // PWM 범위 제한
// 2. Soft-Start: 현재 PWM을 목표값까지 부드럽게 이동
if (groups[idx].currentPWM < targetPWM) groups[idx].currentPWM++;
else if (groups[idx].currentPWM > targetPWM) groups[idx].currentPWM--;
// 3. 온도 시뮬레이션 (Low Pass Filter 적용)
// PWM이 높을수록 온도가 변하는 물리 모델 반영
double theoreticalTemp = AMBIENT_TEMP + (groups[idx].currentPWM * TEMP_FACTOR);
groups[idx].currentSimTemp = (groups[idx].currentSimTemp * 0.9) + (theoreticalTemp * 0.1);
}
결과 및 평가
완료 작품의 소개
프로토타입 사진 및 UI
- 하드웨어: 작업복(조끼 및 바람막이) 내부에 3D 프린팅된 펠티어 모듈 5개가 견고하게 부착되었으며, 배선은 의류 내부로 매립되어 착용 시 불편함을 최소화함.
- 소프트웨어: 안드로이드 앱을 통해 사용자가 직관적으로 냉방/난방 모드를 선택하고 온도를 조절할 수 있으며, 배터리 상태와 현재 온도가 실시간으로 시각화됨.
포스터
관련사업비 내역서
내용
완료작품의 평가
성능 평가 결과
내용
향후계획
내용
특허 출원 내용
내용







