24小時(shí)聯(lián)系電話(huà):18217114652、13661815404
中文
行業(yè)資訊
健身手環(huán):使用 NodeMCU 和脈沖傳感器的物聯(lián)網(wǎng)項目
健身手環(huán):使用 NodeMCU 和脈沖傳感器的物聯(lián)網(wǎng)項目
我們這一代人已經(jīng)非常適應久坐不動(dòng)的生活方式,現在很難回到健康的生活方式。因此,現在控制我們的活動(dòng)比以往任何時(shí)候都更加重要。為了適應健康的生活方式,重要的是要注意我們每天消耗和燃燒的卡路里量。建議除了我們身體燃燒的卡路里之外,每天至少燃燒500至600卡路里的熱量,以調節身體機能。健身帶幫助我們注意每天燃燒的卡路里數量,從而席卷了市場(chǎng)。這個(gè)概念性的健身手環(huán)是一個(gè)物聯(lián)網(wǎng)項目,它使用心跳來(lái)計算燃燒的卡路里并幫助用戶(hù)使用智能手機應用程序監控他/她的活動(dòng)水平。
健身帶的工作原理:
該健身手環(huán)系統使用心跳傳感器以每分鐘心跳次數 (BPM) 為單位測量心臟活動(dòng)。心跳是了解身體活動(dòng)的關(guān)鍵參數。當進(jìn)行任何體力活動(dòng)時(shí),我們的心率會(huì )升高,而當我們放松時(shí),心跳會(huì )恢復正常。這使得心跳成為了解燃燒卡路里數量的重要參數。除了心跳率,我們還需要其他參數,例如用戶(hù)的性別、年齡和體重。這些參數將幫助我們推斷給定時(shí)間內燃燒的卡路里。
當系統開(kāi)啟時(shí),NodeMCU 將等待來(lái)自 Blynk 應用程序的啟動(dòng)指令,該應用程序通過(guò) WiFI 與 NodeMCU 連接到本地網(wǎng)絡(luò )。然后用戶(hù)需要輸入個(gè)人資料詳細信息,例如性別、年齡和體重。完成后,用戶(hù)可以使用 Blynk 應用程序中的“設備開(kāi)啟”按鈕打開(kāi)健身手環(huán)?,F在 NodeMCU 將開(kāi)始讀取心跳模擬數據并跟蹤時(shí)間。
這款健身手環(huán)使用PLSNSR1 脈搏傳感器來(lái)測量心跳速率。輸入的心跳被轉換為每分鐘的心跳次數和 NodeMCU 中燃燒的卡路里。結果輸出數據被傳輸回 Blynk 應用程序以顯示在用戶(hù)界面中。
在用戶(hù)界面中,BPM(每分鐘節拍數)將每秒更新一次,燃燒的卡路里量將每 10 秒更新一次,以幫助用戶(hù)監控他/她的健身計劃的強度水平。
會(huì )話(huà)完成后,用戶(hù)需要使用 Blynk 應用程序界面關(guān)閉系統?,F在,一封包含燃燒卡路里量和會(huì )話(huà)持續時(shí)間的電子郵件將發(fā)送到用戶(hù)電子郵件,以幫助記錄他們燃燒的卡路里。
物聯(lián)網(wǎng)健身帶特點(diǎn):
以 BPM(每分鐘比特數)計算平均心跳率。
每 10 秒確定并更新云中燃燒的總卡路里。
用戶(hù)可以通過(guò)物聯(lián)網(wǎng)應用程序或智能手機控制何時(shí)開(kāi)始和停止健身帶活動(dòng)。
向用戶(hù)發(fā)送關(guān)于平均心跳 (BPM) 和燃燒卡路里的警報電子郵件。
LED 指示燈根據用戶(hù)心跳速度閃爍。
所需硬件:
節點(diǎn)單片機
脈搏傳感器(PLSNSR1)
引領(lǐng)
電阻器(220 歐姆)
跳線(xiàn)
該應用程序采用以下三個(gè)輸入
性別
年齡
重量
在給出有效輸入后,系統可以被打開(kāi)。ON 或 OFF 按鈕用作樂(lè )隊的 ON/OFF 開(kāi)關(guān)。當用戶(hù)激活此按鈕時(shí),上述三個(gè)參數將通過(guò)云發(fā)送到 NodeMCU,從而實(shí)現卡路里計算。當年齡和體重字段中給出無(wú)效輸入時(shí),即為零,則健身追蹤器系統將保持關(guān)閉狀態(tài)。
NodeMCU 在處理完傳感器數據后會(huì )更新應用程序界面字段,例如 – BPM(每秒更新一次)和卡路里消耗(每 10 秒更新一次)。這將幫助用戶(hù)實(shí)時(shí)監測他們燃燒的卡路里并評估他們的健身計劃的強度。
公式:
將心跳率轉換為燃燒的卡路里所需的公式是: –
男用
卡路里消耗 = ((-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 – 鍛煉的持續時(shí)間(以小時(shí)為單位)
原型:
將健身手環(huán)連接到物聯(lián)網(wǎng)云:
在代碼中添加您的智能手機 SSID 和密碼并上傳到 NodeMCU。在代碼中使用從 Blynk 應用程序生成的授權令牌。等待 NodeMCU 與您的智能手機連接。當設備配對后,NodeMCU 將等待來(lái)自用戶(hù)的 Device ON 命令。
BPM 的計算和更新,卡路里燃燒將一直執行,直到 NodeMCU 收到 Device OFF 命令。如果您打算更換要用于與手環(huán)配對的智能手機,則必須在替換目標設備的 SSID 和密碼的代碼中進(jìn)行更改。
算法:
等待與 Blynk 應用程序的連接。
讀取來(lái)自 Blynk 用戶(hù)界面的輸入——來(lái)自用戶(hù)的年齡、體重和性別。
等待 Device ON 按鈕被激活,如果它被激活,請轉到步驟 6。
如果激活了 ON 按鈕,則將當前系統時(shí)間保存在一個(gè)變量中。
讀取傳感器模擬輸入數據(心跳)并將它們轉換為每分鐘節拍數 (BPM)。將 BPM 上傳到 Blynk UI。
計算每 10 秒燃燒的卡路里。將燃燒的卡路里上傳到 Blynk UI。
重復該過(guò)程,直到取消激活 (OFF) ON 按鈕。
在 Blynk UI 中顯示最終燃燒的卡路里和 BPM。
代碼 :
將必要的頭文件包含到您的 Arduino IDE 目錄中:ESP8266WiFi.h、BlynkSimpleEsp8266.h。該健身手環(huán)項目由 Nihar Gupta 構建和測試。您可以在此處找到Fitness Band – Github 存儲庫。
// 包含頭文件
#define BLYNK_PRINT 串行
#include<ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
// 由 Blynk 生成的身份驗證令牌
char auth[] = "gTJf3EcGRGacgcW24I-OWcmj70OlwjZ2";
// 您的 WiFi 憑據。
// 對于開(kāi)放網(wǎng)絡(luò ),將密碼設置為“”。
char ssid[] = "你的 SSID"; //替換為你的SSID
char pass[] = "您的密碼"; //替換為你的密碼
// 外部 LED
int led_pin = D6;
// 校準所需的變量
const int postInterval = 10 * 1000;
內率[10];
unsigned long sampleCounter = 0;
無(wú)符號長(cháng) 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;
無(wú)符號長(cháng)起始時(shí)間=0;//設備的啟動(dòng)時(shí)間,以毫秒為單位
布爾郵件發(fā)送=假;
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;
浮動(dòng)卡路里燃燒;
浮動(dòng)時(shí)間_持續時(shí)間=0;
浮動(dòng) total_calorie_burn=0;
// 設置塊
無(wú)效設置(){
// 把你的設置代碼放在這里,運行一次:
Serial.begin(115200);
//引腳模式
引腳模式(A0,輸入);
pinMode(led_pin,輸出);
//BLynk設置
Blynk.begin(auth, ssid, pass);
}
無(wú)效循環(huán)(){
// 把你的主要代碼放在這里,重復運行:
Blynk.run(); // Blynk 將持續運行
// 這里 if 塊將在 blynk 中的啟動(dòng)按鈕打開(kāi)時(shí)執行
if(start_button==1 && time_noted==true){
if(check_if_data_is_correct()==false) 繼續;// 在打開(kāi)設備之前檢查用戶(hù)是否輸入了年齡、性別和體重
//Serial.println("BPM 正在計算中");
計算 bpm();
if(millis()-starting_time>=10000){
計算卡路里_10秒();// 計算每 10 分鐘燃燒的卡路里
}
}
// else if 塊將在開(kāi)始按鈕關(guān)閉時(shí)執行
否則如果(郵件發(fā)送==真){
計算卡路里_10秒();
發(fā)電子郵件();
郵件發(fā)送=假;
reset_bpm(); // 當設備關(guān)閉時(shí)重置變量
}
}
// 在打開(kāi)設備之前檢查用戶(hù)是否輸入了年齡、性別和體重
bool check_if_data_is_correct(){
如果(體重<=0 || 年齡<=0){
Blynk.virtualWrite(V9, 低);
開(kāi)始按鈕=0;
時(shí)間注意=假;
reset_bpm();
返回假;
}
返回真;
}
// 該函數每10秒計算一次消耗的卡路里,并更新為blynk
void calculate_calories_10sec(){
開(kāi)始時(shí)間=毫秒();
heart_rate=average_bpm/bpm_counted;
如果(男==真){
Serial.println("男");
卡路里燃燒=(浮點(diǎn)數)(((-55.0969+(0.6309*心率)+(0.1988*體重)+(0.2017*年齡))/4.184)*60*0.00277778);
}
別的{
Serial.println("女");
卡路里燃燒=(浮動(dòng))(((-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);
}
// 此函數用于在設備下線(xiàn)時(shí)向用戶(hù)發(fā)送有關(guān)其狀態(tài)的電子郵件
void send_email()
{
如果(does_mail_send == 0){
String msg="Hi Nihar Gupta。你的平均心跳是:"+(String)heart_rate+"。你的"+(String)calorie_burn+"卡路里是在"+(String)time_duration+"Hrs"的時(shí)間內燃燒的;
Blynk.email("youremail@yourdomain.com", "心跳通知", msg); //替換為您的電子郵件
do_mail_send = 1;
}
}
// 當設備下車(chē)時(shí)重置變量
void reset_bpm(){
average_bpm=0;
bpm_counted=0;
total_calorie_burn=0;
Blynk.virtualWrite(V7,0);
Blynk.virtualWrite(V1,0);
}
// 此函數將負責初始化 BPM
無(wú)效計算_bpm(){
如果(QS ==真){
Serial.println("BPM: "+ String(BPM));
Blynk.virtualWrite(V1,BPM);
average_bpm+=BPM;
bpm_counted++;
QS = 假;
} else if (millis() >= (lastTime + 2)) {
讀脈沖();
lastTime = 毫秒();
}
}
// 此函數將讀取模擬數據并將數據校準為 BPM
無(wú)效讀脈沖(){
信號 = 模擬讀?。?span>A0);
模擬寫(xiě)入(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 = 真;
}
}
無(wú)效檢測集高低(){
如果(信號<閾值&& N>(IBI / 5)* 3){
如果(信號 < T){
T = 信號;
}
}
如果(信號 > 閾值 && 信號 > P){
P = 信號;
}
}
// 此校準是在檢測到脈沖時(shí)
無(wú)效脈沖檢測(){
脈沖 = 真;
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中的開(kāi)始按鈕是開(kāi)/關(guān)
BLYNK_WRITE(V9)
{
start_button = param.asInt();
if(start_button==1 && time_noted==false){
開(kāi)始時(shí)間=毫秒();
郵件發(fā)送=假;
do_mail_send=0;
time_noted = true;
}
否則 if(start_button==0 && time_noted==true){
郵件發(fā)送 = 真;
時(shí)間注意=假;
}
}
// 改變性別時(shí)更新性別
BLYNK_WRITE(V2){
開(kāi)關(guān)(參數.asInt()){
情況 1:{ 男=真;
休息;
}
情況2:{男性=假;
休息;
}
}
}
// 在 Blynk 中更改權重時(shí)更新權重
BLYNK_WRITE(V3){
重量 = param.asInt();
}
// 在 Blynk 中更改年齡時(shí)更新年齡
BLYNK_WRITE(V4){
年齡=param.asInt();
}