24小時聯系電話:18217114652、13661815404
中文
行業資訊
健身手環:使用 NodeMCU 和脈沖傳感器的物聯網項目
健身手環:使用 NodeMCU 和脈沖傳感器的物聯網項目
我們這一代人已經非常適應久坐不動的生活方式,現在很難回到健康的生活方式。因此,現在控制我們的活動比以往任何時候都更加重要。為了適應健康的生活方式,重要的是要注意我們每天消耗和燃燒的卡路里量。建議除了我們身體燃燒的卡路里之外,每天至少燃燒500至600卡路里的熱量,以調節身體機能。健身帶幫助我們注意每天燃燒的卡路里數量,從而席卷了市場。這個概念性的健身手環是一個物聯網項目,它使用心跳來計算燃燒的卡路里并幫助用戶使用智能手機應用程序監控他/她的活動水平。
健身帶的工作原理:
該健身手環系統使用心跳傳感器以每分鐘心跳次數 (BPM) 為單位測量心臟活動。心跳是了解身體活動的關鍵參數。當進行任何體力活動時,我們的心率會升高,而當我們放松時,心跳會恢復正常。這使得心跳成為了解燃燒卡路里數量的重要參數。除了心跳率,我們還需要其他參數,例如用戶的性別、年齡和體重。這些參數將幫助我們推斷給定時間內燃燒的卡路里。
當系統開啟時,NodeMCU 將等待來自 Blynk 應用程序的啟動指令,該應用程序通過 WiFI 與 NodeMCU 連接到本地網絡。然后用戶需要輸入個人資料詳細信息,例如性別、年齡和體重。完成后,用戶可以使用 Blynk 應用程序中的“設備開啟”按鈕打開健身手環?,F在 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("youremail@yourdomain.com", "心跳通知", 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
無效讀脈沖(){
信號 = 模擬讀?。?span>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();
}