心率异常即时邮件/短信报警:Arduino + Bolt WiFi + 云端 Python 监控
项目概述
基于心率传感器模块采集脉搏,Arduino Mega 计算心率并通过串口透传给 Bolt WiFi 模块上传云端。Python 脚本运行在 DigitalOcean VPS(或任意 Linux 服务器)上,周期性轮询 Bolt Cloud API 获取心率,若超出阈值(默认 57~100 bpm),自动调用 Mailgun 发送邮件、Twilio 发送短信双通道报警。适合远程看护老人、康复患者等场景。
硬件连接
| 模块 | 引脚 | Arduino Mega 引脚 |
|---|---|---|
| 心率传感器 | OUT | D2 (外部中断 INT0) |
| 心率传感器 | VCC/GND | 5V / GND |
| Bolt WiFi | TX | RX0 (D0) |
| Bolt WiFi | RX | TX0 (D1) |
| Bolt WiFi | 3V3 | 3.3V |
注意:Bolt 模块 3.3V 供电,TX/RX 直连 Mega 硬件串口 0(与 USB 串口共用),上传代码时需暂时断开 Bolt TX/RX。

Arduino 固件:脉搏计数与心率计算
/* Heart Rate → Serial (for Bolt)
* D2 接传感器 OUT,上升沿计数,10 秒窗口输出 BPM
*/
volatile unsigned long highCounter = 0;
int lastPulse = LOW;
unsigned long oldMillis = 0;
void setup() {
pinMode(2, INPUT);
Serial.begin(9600); // 与 Bolt 通信波特率
}
void loop() {
int pulse = digitalRead(2);
if (pulse != lastPulse) {
lastPulse = pulse;
if (pulse == HIGH) highCounter++;
}
if (millis() - oldMillis >= 10000) { // 10 秒窗口
oldMillis = millis();
int bpm = highCounter * 6; // 10 秒 * 6 = 1 分钟
if (highCounter > 1) Serial.println(bpm); // 仅有效脉搏上传
highCounter = 0;
}
}
云端服务配置
1. Mailgun(邮件)
- 注册账号 → 验证手机 → Domains → Add Recipient → Invite New Recipient(填收件邮箱)。
- 生成 Sandbox 域名,记录:API Key、Sandbox URL、发件地址 `test@sandbox...`。
2. Twilio(短信)
- 注册 → 验证手机 → Get Free API Key → 启用 Programmable SMS 与 Phone Numbers。
- 获取 Account SID、Auth Token、生成的发件号码(`+1...`)。
- 收件号码需加国家代码(如中国 `+86...`)。
3. Bolt Cloud
- 注册 Bolt 账号,绑定设备,获取 API Key 与 Device ID。
- 确保 Bolt 连上 WiFi,云端显示在线。
4. DigitalOcean VPS(或任意 Linux)
# 部署步骤
sudo apt-get update && sudo apt-get install -y python3-pip
sudo pip3 install boltiot
# 创建配置文件 conf.py
cat > conf.py << 'EOF'
# Twilio
SID = 'your_account_sid'
AUTH_TOKEN = 'your_auth_token'
FROM_NUMBER = '+1xxxxxxxxxx' # Twilio 分配
TO_NUMBER = '+861xxxxxxxxxx' # 接收报警手机
# Mailgun
MAILGUN_API_KEY = 'key-xxxxxxxx'
SANDBOX_URL = 'sandboxxxxx.mailgun.org'
SENDER_EMAIL = 'test@sandboxxxxx.mailgun.org'
RECIPIENT_EMAIL = 'your@email.com'
# Bolt
API_KEY = 'your_bolt_api_key'
DEVICE_ID = 'BOLTxxxxxx'
EOF
# 创建监控脚本 heart_rate.py
cat > heart_rate.py << 'EOF'
import conf, json, time
from boltiot import Bolt, Email, Sms
MIN_HR = 57
MAX_HR = 100
bolt = 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.SID, conf.AUTH_TOKEN, conf.TO_NUMBER, conf.FROM_NUMBER)
while True:
try:
resp = bolt.serialRead(2) # 读取最近 2 字节?实际应读完整行
data = json.loads(resp)
hr = int(data['value'])
if hr > MAX_HR or hr < MIN_HR:
msg = f"Alert! Heart rate: {hr} bpm"
mailer.send_email("Heart Rate Alert", msg)
sms.send_sms(msg)
except Exception as e:
print("Error:", e)
time.sleep(10)
EOF
python3 heart_rate.py &
关键点与改进建议
- 串口读取:Bolt `serialRead(2)` 仅读 2 字节,心率可能 2~3 位数。建议改用 `serialRead(10)` 或循环读取直到换行,再 `strip()` 解析。
- 去抖动:传感器输出可能含噪声,Arduino 端可加硬件滤波(RC)或软件去抖(最小脉冲间隔 300ms)。
- 报警抑制:连续超限会重复发送,建议加入“报警冷却时间”(如 5 分钟内不重复)。
- 安全性:`conf.py` 含明文密钥,生产环境应使用环境变量或密钥管理服务。
- 本地化:若无公网服务器,可在树莓派/本地 Linux 运行 Python 脚本,甚至移植到 ESP32 直接调用 HTTP API,省去 VPS 费用。
效果演示


参考文献
Uddin, M. S., Alam, J. B., & Banu, S. (2017). Real time patient monitoring system based on internet of things. ICAEE 2017. DOI: 10.1109/ICAEE.2017.8255410
制造工艺