비정상 심박수 시 즉각 이메일 & SMS 알림 시스템
부품 및 소모품
| 심박수 측정 센서 모듈 |
1개 |
| 아두이노 메가 2560 |
1개 |
| 볼트 IoT 볼트 와이파이 모듈 |
1개 |
| 점퍼 와이어 (일반) |
7개 |
앱 및 온라인 서비스
- 볼트 IoT 볼트 클라우드
- 디지털오션 (DigitalOcean) - 심박수 모니터링 코드 실행을 위한 VPS 서비스
- 메일건 (Mailgun) - 이메일 자동화 서비스
- 트윌리오 (Twilio) SMS 메시징 API
프로젝트 소개
24시간 심박수 모니터링 기기(피트니스 밴드 등)가 요즘 흔하고 하나쯤 가지고 계실 겁니다. 그런데 비정상 심박수 감지 시 SMS나 이메일, 또는 둘 다 보내주는 비슷한 기기를 직접 만들 수 있다면 어떨까요? 기대되시나요? 이 프로젝트는 가장 쉬운 방법으로 그 방법을 보여드립니다.
1단계: 심박수 센서 모듈을 아두이노에 연결
수-암 점퍼 와이어로 다음 연결:
- 아두이노 핀 2 ↔ 심박수 센서 출력 핀
- 아두이노 5V 핀 ↔ 심박수 센서 VCC 핀
- 아두이노 GND 핀 ↔ 심박수 센서 GND 핀
2단계: 아두이노 코딩
아두이노 IDE 설치 후 다음 코드 작성:
unsigned long highCounter = 0;
int pulse = 0;
int val = 0;
int lastPulse = LOW;
unsigned long oldMillis = 0;
void setup() {
pinMode(2, INPUT);
Serial.begin(9600);
}
void loop() {
pulse = digitalRead(2);
if (pulse != lastPulse) {
lastPulse = pulse;
if (pulse == HIGH) highCounter++;
}
// 10초마다 highCounter 출력 및 리셋
if (millis() - oldMillis >= 10000) {
oldMillis = millis();
val = highCounter * 6; // 분당 박동수 계산
if (highCounter > 1) Serial.println(val);
highCounter = 0;
}
}
저장, 검증, 업로드.
이 코드는:
- 심박수 센서에서 데이터 수집
- 심박수 계산
- 값을 출력해 볼트 와이파이 모듈이 시리얼 통신으로 수신 가능하게 함
3단계: 볼트 와이파이 모듈을 아두이노에 연결
수-수 점퍼 와이어로 다음 연결:
- 볼트 와이파이 모듈 3V3 핀 ↔ 아두이노 3.3V 핀
- 볼트 와이파이 모듈 TX 핀 ↔ 아두이노 RX 핀
- 볼트 와이파이 모듈 RX 핀 ↔ 아두이노 TX 핀
이 연결로 볼트 와이파이 모듈에 전원 공급하고 아두이노와 시리얼 통신 수립. 하드웨어 연결 완료.
4단계: 메일건으로 이메일 자동화 서비스 설정
- 메일건 계정 생성
- 전화번호 인증 후
Domains 섹션 → Add Recipient 버튼 클릭
Invite New Recipient 버튼 클릭 → 수신자 이메일 ID 입력
- 이메일 ID 추가 후 새 샌드박스 생성 → 새로 생성된 샌드박스 ID 클릭
- 새 화면에 이메일 전송에 필요한 모든 자격증명 표시 → 복사해 메모장에 저장
5단계: 트윌리오로 SMS 서비스 설정
- 트윌리오 접속 →
Get a Free API Key 클릭해 가입
- 가입 양식 필수 항목 기입
- 전화번호 입력 및 인증
- 화면에서 "Products" 클릭
- Programmable SMS와 Phone Numbers 체크박스 활성화로 SMS 서비스 활성화
- "Continue" 클릭 → 프로젝트 이름 입력 후 다시 "Continue"
- "Skip this step" 클릭 (팀원 초대 건너뛰기)
- "Project Info" 클릭해 계정 자격증명 확인: Account SID와 Auth Token 안전 보관
- 드롭다운에서 "Programmable SMS" 선택 →
Get Started 클릭해 전화번호 생성
Get a number 클릭 → 팝업에서 Choose this number 클릭
- 최종 번호 팝업 표시 → 번호 복사해 안전 보관
6단계: 디지털오션 VPS로 심박수 모니터링 코드 실행
참고: 전용 리눅스 컴퓨터나 가상머신 리눅스로 디지털오션 같은 VPS 대체 가능.
- 디지털오션 계정 가입
- 프로젝트 생성 → 우분투 실행 드로플릿 생성 → PuTTY로 접속
- 이메일로 받은 자격증명으로 우분투 로그인
- 다음 명령 실행:
우분투 패키지 업데이트
sudo apt-get -y update
파이썬3 pip3 설치
sudo apt install python3-pip
pip로 boltiot 라이브러리 설치
sudo pip3 install boltiot
conf.py 파이썬 파일 생성
sudo nano conf.py
다음 코드에 정확한 데이터 입력:
# 트윌리오 자격증명
SID = '트윌리오 대시보드에서 SID 확인'
AUTH_TOKEN = '트윌리오 대시보드에서 확인'
FROM_NUMBER = '트윌리오가 생성한 번호. 트윌리오 대시보드에서 확인'
TO_NUMBER = '본인 번호. 처음에 +91 추가 필수'
# 메일건 자격증명
MAILGUN_API_KEY = '메일건 대시보드에서 확인 가능한 프라이빗 API 키'
SANDBOX_URL = '메일건 대시보드에서 확인'
SENDER_EMAIL = 'test@your SANDBOX_URL 형태'
RECIPIENT_EMAIL = '여기에 본인 이메일 ID 입력'
# 볼트 자격증명
API_KEY = '볼트 클라우드 계정 API 키'
DEVICE_ID = '볼트 디바이스 ID'
conf.py 저장
heart_rate.py 파이썬 파일 생성
sudo nano heart_rate.py
다음 코드 작성:
import conf, json, time
from boltiot import Email, Bolt
from boltiot import Sms, Bolt
minimum_limit = 57 # 심박수 최소 임계값
maximum_limit = 100 # 심박수 최대 임계값
mybolt = Bolt(conf.API_KEY, conf.DEVICE_ID)
mailer = Email(conf.MAILGUN_API_KEY, conf.SANDBOX_URL, conf.SENDER_EMAIL, conf.RECIPIENT_EMAIL)
sms = Sms(conf.SSID, conf.AUTH_TOKEN, conf.TO_NUMBER, conf.FROM_NUMBER)
while True:
response = mybolt.serialRead(2)
data = json.loads(response)
sensor_value = data['value']
try:
sensor_value = data['value']
if sensor_value > maximum_limit or sensor_value < minimum_limit:
response = mailer.send_email("Alert", "The Current Heart Rate is " + str(sensor_value))
response = sms.send_sms("Alert! The Current Heart Rate is " + str(sensor_value))
except Exception as e:
print()
time.sleep(10)
heart_rate.py 저장
실행:
sudo python3 heart_rate.py
심박수가 비정상이면 폰으로 SMS와 이메일이 각각 전송됩니다.
코드
아두이노 코드
펄스 값 계산용 코드
unsigned long highCounter = 0;
int pulse = 0;
int val = 0;
int lastPulse = LOW;
unsigned long oldMillis = 0;
void setup() {
pinMode(2, INPUT);
Serial.begin(9600);
}
void loop() {
pulse = digitalRead(2);
if (pulse != lastPulse) {
lastPulse = pulse;
if (pulse == HIGH) highCounter++;
}
if (millis() - oldMillis >= 10000) {
oldMillis = millis();
val = highCounter * 6;
if (highCounter > 1) Serial.println(val);
highCounter = 0;
}
}
conf.py (파이썬)
볼트, 메일건, 트윌리오 사용을 위한 API 키 등 자격증명 포함
# 트윌리오 자격증명
SID = '트윌리오 대시보드에서 SID 확인'
AUTH_TOKEN = '트윌리오 대시보드에서 확인'
FROM_NUMBER = '트윌리오가 생성한 번호. 트윌리오 대시보드에서 확인'
TO_NUMBER = '본인 번호. 처음에 +91 추가 필수'
# 메일건 자격증명
MAILGUN_API_KEY = '메일건 대시보드에서 확인 가능한 프라이빗 API 키'
SANDBOX_URL = '메일건 대시보드에서 확인'
SENDER_EMAIL = 'test@your SANDBOX_URL 형태'
RECIPIENT_EMAIL = '여기에 본인 이메일 ID 입력'
# 볼트 자격증명
API_KEY = '볼트 클라우드 계정 API 키'
DEVICE_ID = '볼트 디바이스 ID'
heart_rate.py (파이썬)
펄스 값 수집 및 이상 징후 체크
import conf, json, time
from boltiot import Email, Bolt
from boltiot import Sms, Bolt
minimum_limit = 57
maximum_limit = 100
mybolt = Bolt(conf.API_KEY, conf.DEVICE_ID)
mailer = Email(conf.MAILGUN_API_KEY, conf.SANDBOX_URL, conf.SENDER_EMAIL, conf.RECIPIENT_EMAIL)
sms = Sms(conf.SSID, conf.AUTH_TOKEN, conf.TO_NUMBER, conf.FROM_NUMBER)
while True:
response = mybolt.serialRead(2)
data = json.loads(response)
sensor_value = data['value']
try:
sensor_value = data['value']
if sensor_value > maximum_limit or sensor_value < minimum_limit:
response = mailer.send_email("Alert", "The Current Heart Rate is " + str(sensor_value))
response = sms.send_sms("Alert! The Current Heart Rate is " + str(sensor_value))
except Exception as e:
print()
time.sleep(10)
회로도
회로도 이미지 참조 (위 연결 설명대로 구성)