스마트 알츠하이머 동반자: 아두이노 기반 알림·모니터링 시스템
부품 및 소모품
| 부품 |
수량 |
비고 |
| 아두이노 MKR1000 |
1 |
WiFi 내장, 소형 폼팩터 |
| 인피니언 센서 허브 나노 (Infineon Sensor Hub Nano) |
1 |
DPS310 기압/온도/고도 센서 탑재, BLE |
| 노키아 5110 LCD (84x48) |
1 |
저렴하고 구하기 쉬움, 추후 OLED로 교체 권장 |
| HC-05 블루투스 모듈 |
1 |
마스터 모드로 센서 허브와 페어링 |
| 브레드보드 |
1 |
|
| 점퍼 와이어 |
1세트 |
|
| 택트 스위치 12mm |
1 |
응급 호출 버튼용 |
| 부저 |
1 |
알림음 재생용 |
| FT1235 5W 무선 송신기 |
1 |
무선 충전용 (옵션) |
| FT1236 5W 무선 수신기 |
1 |
무선 충전용 (옵션) |
필요 도구
앱 및 온라인 서비스
- 아두이노 IDE
- 블링크 (Blynk) — 스마트폰 대시보드/알림
- IFTTT 메이커 서비스 — 웹훅으로 SMS/전화/이메일 연동
프로젝트 배경
알츠하이머 협회 통계(2017년 기준)에 따르면 환자와 보호자가 겪는 어려움이 엄청납니다. 메이커로서 환자와 보호자 모두를 돕는 착용형 기기를 만들기로 했습니다.
필수 기능
- 일상 과제(약 복용, 운동 등) 알림
- 실내 위치 모니터링 (층/방 단위)
- 응급 상황(낙상 등) 보호자 알림
- 시계 기능 (착용형이므로)
- 휴대성, 고령자도 쉬운 조작
- 저비용
핵심 아이디어: 인피니언 센서 허브 나노
초소형에 BLE 탑재, 고정밀 기압 센서(DPS310)로 낙상 시 급격한 고도 변화 감지 및 실내 층별 위치 추정 가능. 하지만 안드로이드 폰 없이 독립 동작해야 하므로, 아두이노 MKR1000 + HC-05(마스터 모드)로 센서 허브와 직결하는 구조로 설계했습니다.
작동 원리
센서 허브 나노 ↔ HC-05 블루투스 통신
- 센서 허브 나노의 MAC 주소 확인 (안드로이드 앱 'IFX_NANOHUB'로 확인)
- HC-05를 AT 모드로 진입해 설정:
AT+RMAAD (기존 페어링 삭제)
AT+CMODE=0 (지정 MAC만 연결)
AT+ROLE=1 (마스터 모드)
AT+BIND=<MAC> (센서 허브 MAC 바인딩)
AT+UART=115200,0,0 (보드레이트 115200, 스톱비트 1, 패리티 없음)
- 전원 재인가 → 자동 페어링 확인 (LED 점멸 패턴 변화로 확인)
센서 데이터 수신 및 파싱
센서 허브 명령어 예시:
$hello id= // 인사/연결 확인
$info id= // 장치 정보
$sinfo id=1 // 센서 정보
$set_mode sid=1;md=mode;val=bg // 저전력 모드
$set_mode sid=1;md=prs_osr;val=16 // 표준 모드
$set_mode sid=1;md=prs_mr;val=32 // 고정밀 모드
$start_sensor id=1 // 데이터 스트림 시작
$stop id= // 정지
수신 데이터 포맷 (연속 스트림):
$1,t,36.9299,1154206 // 온도 (°C)
$1,p,997.6813,1154206 // 기압 (mBar)
$1,a,130.4305,1154206 // 고도 (m)
아두이노에서 Serial1.readStringUntil()와 parseFloat()로 효율적 파싱:
void getSensorValues() {
String junkVal;
if (Serial1.available()) {
junkVal = Serial1.readStringUntil('\n');
junkVal = Serial1.readStringUntil('t');
t = Serial1.parseFloat();
junkVal = Serial1.readStringUntil('p');
p = Serial1.parseFloat();
junkVal = Serial1.readStringUntil('a');
a = Serial1.parseFloat();
junkVal = Serial1.readStringUntil('\n');
}
}
데이터 전송: 블링크(Blynk) 연동
MKR1000 WiFi로 블링크 서버에 가상 핀(V0:온도, V1:기압, V2:고도) 전송. 블링크 앱에서 실시간 그래프 확인 가능. 카옌(Cayenne)도 시도했으나 MKR1000 핀 선택 버그로 블링크 채택.
기능별 커스터마이징 가이드
낙상 감지 (Fall Detection)
연속 고도 측정값 차이(Δ고도)가 임계값 근접 시 낙상 판정.
- 낙상 임계값:
FALL = 0.7 (m)
- 허용 오차:
CLEARANCE = ±0.2 (m)
- 1초 간격(
interval=1000ms)으로 비교
void checkIfFalling() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
float diff = previousA - a; // 고도 감소량
if (diff >= (FALL - CLEARANCE) && diff <= (FALL + CLEARANCE)) {
fallState = true;
// 블링크 알림, IFTTT 웹훅으로 SMS/전화 발송 등
Blynk.virtualWrite(vFALL_PIN, 255);
showFallMessage(); // LCD 표시
}
previousA = a;
previousMillis = currentMillis;
fallState = false;
Blynk.virtualWrite(vFALL_PIN, 0);
}
}
⚠️ 기압만으로는 오탐/미탐 가능성 있음 → 향후 가속도계 추가 권장.
실내 위치 추정 (층/방 감지)
- 층 감지: 현재 고도 - 이전 고도 차이가 층고(약 3m) 근접 시 층 이동 판정
- 방 감지: 모션 센서 등 보조 센서 필요 (기압만으로는 동일 층 내 방 구분 어려움)
- 블링크 LED 위젯으로 층 표시 가능
온도 알림 (화재 등)
DPS310 온도값이 임계치(예: 45°C) 초과 시 보호자 알림. 센서가 피부 직접 접촉이 아니므로 주변 온도 측정임을 유의.
부저 및 비상 버튼
- 부저:
tone()으로 약 복용/운동 알림 멜로디 재생
- 택트 스위치: 누르면 블링크 이메일/IFTTT 웹훅으로 보호자 호출
void emailOnButtonPress() {
int isButtonPressed = !digitalRead(2); // 액티브 로우
if (isButtonPressed) {
Blynk.email("보호자@메일.com", "비상 버튼", "환자가 비상 버튼을 눌렀습니다.");
// IFTTT 웹훅으로 SMS/전화 연동 가능
}
}
디스플레이 (노키아 5110 / u8g2 라이브러리)
- 기본: 시간(24h) + 날짜 표시 (블링크 RTC 위젯으로 인터넷 동기화)
- 디버그용: 센서 값(온도/기압/고도) 표시 전환 가능
- 알림 시: "약 드실 시간", "운동 시간", "낙상 감지!" 등 메시지 표시
- OLED(SSD1306 등)로 교체 시 u8g2 설정만 변경하면 됨 (해상도/폰트 조정 필요)
블링크 이벤터(Eventor) 위젯으로 스케줄 알림
코드 수정 없이 앱에서 요일/시간 설정 → 가상 핀 값 변경 → 아두이노에서 BLYNK_WRITE(vEVENTOR_PIN)로 감지해 알림 표시/부저 울림.
IFTTT 웹훅 연동으로 SMS/전화/이메일 발송
- 블링크 웹훅 위젯: URL에 IFTTT 웹훅 키/이벤트명 설정, 메서드 GET/POST
- IFTTT: 웹훅 트리거 → SMS/전화/G메일/슬랙 등 액션 연결
- 테스트: IFTTT 웹훅 설정 페이지에서 'Test it'으로 동작 확인
마무리 및 향후 과제
전원 및 충전
- MKR1000 리튬폴리머 배터리 커넥터 내장 → 리포 배터리 직결 가능
- 무선 충전: 퓨타라(Futura) 5W 송/수신기 활용 → 수신기 측 USB 마이크로B 잘라 MKR1000 USB 포트에 연결

인클로저 (케이스)
시계형 웨어러블 디자인 구상 중. 레이저 커터/3D 프린터 접근 시 STL 공개 예정.

향후 개선 사항
- 제작 가능한 인클로저 완성
- 블루투스 4.0(BLE) 모듈로 교체 (HC-05 대신)
- 센서 허브 나노 대신 DPS310 단독 사용으로 비용/크기 절감
- 가속도계 + 모션 센서 추가로 낙상/위치 정확도 향상
- 맥박 센서 추가 (건강 모니터링 확장)
- OLED 디스플레이 적용 (그래픽/한글 폰트 지원)
- MKR1000 딥슬립 모드로 배터리 수명 연장
소스 코드
1. AT 명령어 설정용 스케치 (AT_Commands.ino)
char c = ' ';
void setup() {
Serial.begin(9600);
Serial.println("Arduino with HC-05 is ready");
Serial1.begin(38400); // HC-05 AT 모드 기본 보드레이트
Serial.println("Serial1 started at 38400");
}
void loop() {
if (Serial1.available()) { c = Serial1.read(); Serial.write(c); }
if (Serial.available()) { c = Serial.read(); Serial.write(c); Serial1.write(c); }
}
2. 메인 스케치 (Alzheimer's_Assistant.ino)
전체 코드는 원문 참조. 주요 구성:
BlynkSimpleMKR1000, WidgetRTC, WiFi101, U8g2lib 라이브러리 사용
- 인증 토큰, WiFi SSID/비번 입력 필요
BlynkTimer로 주기적 태스크 스케줄링 (플러드 에러 방지)
- 함수:
sendCommand(), initSensorHub(), getSensorValues(), sendSensorValues(), checkIfFalling(), showTimeAndDate(), showPillReminder(), showExerciseReminder(), showFallMessage() 등
BLYNK_WRITE(vEVENTOR_PIN)로 이벤터 위젯 연동
BLYNK_CONNECTED()에서 RTC 재동기화
회로도
- HC-05 AT 모드 진입/설정용 배선도
- 베어본 프로젝트 전체 프리칭 배선도
- HC-05 AT 명령어 리스트 문서
커스텀 파트/인클로저
디자인 컨셉용 STL (비율 미조정, 참고용)