24小时联系电话:18217114652、13661815404
中文
行业资讯
健身手环:使用 NodeMCU 和脉冲传感器的物联网项目
健身手环:使用 NodeMCU 和脉冲传感器的物联网项目
我们这一代人已经非常适应久坐不动的生活方式,现在很难回到健康的生活方式。因此,现在控制我们的活动比以往任何时候都更加重要。为了适应健康的生活方式,重要的是要注意我们每天消耗和燃烧的卡路里量。建议除了我们身体燃烧的卡路里之外,每天至少燃烧500至600卡路里的热量,以调节身体机能。健身带帮助我们注意每天燃烧的卡路里数量,从而席卷了市场。这个概念性的健身手环是一个物联网项目,它使用心跳来计算燃烧的卡路里并帮助用户使用智能手机应用程序监控他/她的活动水平。
健身带的工作原理:
该健身手环系统使用心跳传感器以每分钟心跳次数 (BPM) 为单位测量心脏活动。心跳是了解身体活动的关键参数。当进行任何体力活动时,我们的心率会升高,而当我们放松时,心跳会恢复正常。这使得心跳成为了解燃烧卡路里数量的重要参数。除了心跳率,我们还需要其他参数,例如用户的性别、年龄和体重。这些参数将帮助我们推断给定时间内燃烧的卡路里。
当系统开启时,NodeMCU 将等待来自 Blynk 应用程序的启动指令,该应用程序通过 WiFI 与 NodeMCU 连接到本地网络。然后用户需要输入个人资料详细信息,例如性别、年龄和体重。完成后,用户可以使用 Blynk 应用程序中的“设备开启”按钮打开健身手环。现在 NodeMCU 将开始读取心跳模拟数据并跟踪时间。
这款健身手环使用PLSNSR1 脉搏传感器来测量心跳速率。输入的心跳被转换为每分钟的心跳次数和 NodeMCU 中燃烧的卡路里。结果输出数据被传输回 Blynk 应用程序以显示在用户界面中。
在用户界面中,BPM(每分钟节拍数)将每秒更新一次,燃烧的卡路里量将每 10 秒更新一次,以帮助用户监控他/她的健身计划的强度水平。
会话完成后,用户需要使用 Blynk 应用程序界面关闭系统。现在,一封包含燃烧卡路里量和会话持续时间的电子邮件将发送到用户电子邮件,以帮助记录他们燃烧的卡路里。
物联网健身带特点:
以 BPM(每分钟比特数)计算平均心跳率。
每 10 秒确定并更新云中燃烧的总卡路里。
用户可以通过物联网应用程序或智能手机控制何时开始和停止健身带活动。
向用户发送关于平均心跳 (BPM) 和燃烧卡路里的警报电子邮件。
LED 指示灯根据用户心跳速度闪烁。
所需硬件:
节点单片机
脉搏传感器(PLSNSR1)
引领
电阻器(220 欧姆)
跳线
该应用程序采用以下三个输入
性别
年龄
重量
在给出有效输入后,系统可以被打开。ON 或 OFF 按钮用作乐队的 ON/OFF 开关。当用户激活此按钮时,上述三个参数将通过云发送到 NodeMCU,从而实现卡路里计算。当年龄和体重字段中给出无效输入时,即为零,则健身追踪器系统将保持关闭状态。
NodeMCU 在处理完传感器数据后会更新应用程序界面字段,例如 – BPM(每秒更新一次)和卡路里消耗(每 10 秒更新一次)。这将帮助用户实时监测他们燃烧的卡路里并评估他们的健身计划的强度。
公式:
将心跳率转换为燃烧的卡路里所需的公式是: –
男用
卡路里消耗 = ((-55.0969 + (0.6309*HR) + (0.1988*W) + (0.2017*A))/4.184 )*60*T
女用
卡路里消耗 = ((-20.4022+(0.4472*HR) – (0.1263*W) + (0.074*A))/4.184)*60*T
其中
HR – 心跳率(以 BPM 为单位)
W – 体重(以千克为单位)
A – 年龄(以年为单位)
T – 锻炼的持续时间(以小时为单位)
原型:
将健身手环连接到物联网云:
在代码中添加您的智能手机 SSID 和密码并上传到 NodeMCU。在代码中使用从 Blynk 应用程序生成的授权令牌。等待 NodeMCU 与您的智能手机连接。当设备配对后,NodeMCU 将等待来自用户的 Device ON 命令。
BPM 的计算和更新,卡路里燃烧将一直执行,直到 NodeMCU 收到 Device OFF 命令。如果您打算更换要用于与手环配对的智能手机,则必须在替换目标设备的 SSID 和密码的代码中进行更改。
算法:
等待与 Blynk 应用程序的连接。
读取来自 Blynk 用户界面的输入——来自用户的年龄、体重和性别。
等待 Device ON 按钮被激活,如果它被激活,请转到步骤 6。
如果激活了 ON 按钮,则将当前系统时间保存在一个变量中。
读取传感器模拟输入数据(心跳)并将它们转换为每分钟节拍数 (BPM)。将 BPM 上传到 Blynk UI。
计算每 10 秒燃烧的卡路里。将燃烧的卡路里上传到 Blynk UI。
重复该过程,直到取消激活 (OFF) ON 按钮。
在 Blynk UI 中显示最终燃烧的卡路里和 BPM。
代码 :
将必要的头文件包含到您的 Arduino IDE 目录中:ESP8266WiFi.h、BlynkSimpleEsp8266.h。该健身手环项目由 Nihar Gupta 构建和测试。您可以在此处找到Fitness Band – Github 存储库。
// 包含头文件
#define BLYNK_PRINT 串行
#include<ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
// 由 Blynk 生成的身份验证令牌
char auth[] = "gTJf3EcGRGacgcW24I-OWcmj70OlwjZ2";
// 您的 WiFi 凭据。
// 对于开放网络,将密码设置为“”。
char ssid[] = "你的 SSID"; //替换为你的SSID
char pass[] = "您的密码"; //替换为你的密码
// 外部 LED
int led_pin = D6;
// 校准所需的变量
const int postInterval = 10 * 1000;
内率[10];
unsigned long sampleCounter = 0;
无符号长 lastBeatTime = 0;
unsigned long lastTime = 0, N;
INT BPM = 0;
INT IBI = 0;
整数 P = 512;
INT = 512;
整数阈值 = 512;
国际放大器 = 100;
整数信号;
布尔脉冲 = 假;
布尔值 firstBeat = true;
布尔 secondBeat = true;
布尔 QS = 假;
//需要计算的变量
布尔 time_noted=false;
无符号长起始时间=0;//设备的启动时间,以毫秒为单位
布尔邮件发送=假;
unsigned long average_bpm=0; // 存储平均 bpm
unsigned long bpm_counted=0; // 存储计算 bpm 的次数
布尔男性=真;
整数权重=0;
整数年龄=0;
int start_button=0;
int do_mail_send =0;
int heart_rate=0;
浮动卡路里燃烧;
浮动时间_持续时间=0;
浮动 total_calorie_burn=0;
// 设置块
无效设置(){
// 把你的设置代码放在这里,运行一次:
Serial.begin(115200);
//引脚模式
引脚模式(A0,输入);
pinMode(led_pin,输出);
//BLynk设置
Blynk.begin(auth, ssid, pass);
}
无效循环(){
// 把你的主要代码放在这里,重复运行:
Blynk.run(); // Blynk 将持续运行
// 这里 if 块将在 blynk 中的启动按钮打开时执行
if(start_button==1 && time_noted==true){
if(check_if_data_is_correct()==false) 继续;// 在打开设备之前检查用户是否输入了年龄、性别和体重
//Serial.println("BPM 正在计算中");
计算 bpm();
if(millis()-starting_time>=10000){
计算卡路里_10秒();// 计算每 10 分钟燃烧的卡路里
}
}
// else if 块将在开始按钮关闭时执行
否则如果(邮件发送==真){
计算卡路里_10秒();
发电子邮件();
邮件发送=假;
reset_bpm(); // 当设备关闭时重置变量
}
}
// 在打开设备之前检查用户是否输入了年龄、性别和体重
bool check_if_data_is_correct(){
如果(体重<=0 || 年龄<=0){
Blynk.virtualWrite(V9, 低);
开始按钮=0;
时间注意=假;
reset_bpm();
返回假;
}
返回真;
}
// 该函数每10秒计算一次消耗的卡路里,并更新为blynk
void calculate_calories_10sec(){
开始时间=毫秒();
heart_rate=average_bpm/bpm_counted;
如果(男==真){
Serial.println("男");
卡路里燃烧=(浮点数)(((-55.0969+(0.6309*心率)+(0.1988*体重)+(0.2017*年龄))/4.184)*60*0.00277778);
}
别的{
Serial.println("女");
卡路里燃烧=(浮动)(((-20.4022+(0.4472*心率)-(0.1263*体重)+(0.074*年龄))/4.184)*60*0.00277778);
}
total_calorie_burn+=calorie_burn;
Serial.println(重量);
Serial.println(年龄);
Serial.println(average_bpm);
Serial.println(bpm_counted);
Serial.println(calorie_burn);
Serial.println(time_duration);
Serial.println(starting_time);
Blynk.virtualWrite(V7,total_calorie_burn);
}
// 此函数用于在设备下线时向用户发送有关其状态的电子邮件
void send_email()
{
如果(does_mail_send == 0){
String msg="Hi Nihar Gupta。你的平均心跳是:"+(String)heart_rate+"。你的"+(String)calorie_burn+"卡路里是在"+(String)time_duration+"Hrs"的时间内燃烧的;
Blynk.email("[email protected]", "心跳通知", msg); //替换为您的电子邮件
do_mail_send = 1;
}
}
// 当设备下车时重置变量
void reset_bpm(){
average_bpm=0;
bpm_counted=0;
total_calorie_burn=0;
Blynk.virtualWrite(V7,0);
Blynk.virtualWrite(V1,0);
}
// 此函数将负责初始化 BPM
无效计算_bpm(){
如果(QS ==真){
Serial.println("BPM: "+ String(BPM));
Blynk.virtualWrite(V1,BPM);
average_bpm+=BPM;
bpm_counted++;
QS = 假;
} else if (millis() >= (lastTime + 2)) {
读脉冲();
lastTime = 毫秒();
}
}
// 此函数将读取模拟数据并将数据校准为 BPM
无效读脉冲(){
信号 = 模拟读取(A0);
模拟写入(led_pin,信号);
样本计数器 += 2;
int N = sampleCounter - lastBeatTime;
检测设置高低();
如果(N > 250){
if ( ((信号 > 阈值) && (Pulse == false) && (N > (IBI / 5) * 3) )
脉冲检测();
}
如果(信号<阈值&&脉冲==真){
脉冲=假;
安培 = P - T;
阈值 = amp / 2 + T;
P = 阈值;
T = 阈值;
}
如果(N > 2500){
阈值 = 512;
P = 512;
T = 512;
lastBeatTime = 采样计数器;
firstBeat = 真;
secondBeat = 真;
}
}
无效检测集高低(){
如果(信号<阈值&& N>(IBI / 5)* 3){
如果(信号 < T){
T = 信号;
}
}
如果(信号 > 阈值 && 信号 > P){
P = 信号;
}
}
// 此校准是在检测到脉冲时
无效脉冲检测(){
脉冲 = 真;
IBI = sampleCounter - lastBeatTime;
lastBeatTime = 采样计数器;
如果(firstBeat){
firstBeat = 假;
返回;
}
如果(第二次节拍){
secondBeat = 假;
for (int i = 0; i <= 9; i++) {
率[i] = IBI;
}
}
单词 runningTotal = 0;
for (int i = 0; i <= 8; i++) {
比率[i] = 比率[i + 1];
runningTotal += rate[i];
}
率[9] = IBI;
runningTotal += rate[9];
运行总计 /= 10;
BPM = 60000 / runningTotal;
QS = 真;
}
//要知道blynk中的开始按钮是开/关
BLYNK_WRITE(V9)
{
start_button = param.asInt();
if(start_button==1 && time_noted==false){
开始时间=毫秒();
邮件发送=假;
do_mail_send=0;
time_noted = true;
}
否则 if(start_button==0 && time_noted==true){
邮件发送 = 真;
时间注意=假;
}
}
// 改变性别时更新性别
BLYNK_WRITE(V2){
开关(参数.asInt()){
情况 1:{ 男=真;
休息;
}
情况2:{男性=假;
休息;
}
}
}
// 在 Blynk 中更改权重时更新权重
BLYNK_WRITE(V3){
重量 = param.asInt();
}
// 在 Blynk 中更改年龄时更新年龄
BLYNK_WRITE(V4){
年龄=param.asInt();
}