物聯網期末大作業—睡眠質量檢測系統
目錄
- 物聯網期末大作業—睡眠質量檢測系統
- 前言
- 一、專案介紹
- 1.專案背景
- 2.專案構思
- 二、系統設計
- 1.系統概述
- 2.設計思路
- 3.設計草圖
- 三、硬體設計
- 1.硬體模塊介紹
- 2.硬體系統的Fritzing模型圖
- 四、軟體設計
- 1.獲取睡眠環境狀況
- 2.獲取血氧濃度和心跳頻率
- 3. 后端設計
- 4. 移動端資料傳輸
- 五、使用說明
- 1.實物圖展示
- 2.操作流程
- 六、系統總結
- 總結
前言
本學期的物聯網課程進入了尾聲,又到了緊張刺激的熬夜奇跡時刻!!!(咳咳那是上學期)
這次我和我的組員沒有熬夜,從構思到實作花費了一個星期,如果要換算的話,兩個通宵之夜應該綽綽有余了
上學期的嵌入式大作業沒有將它變成博客的形式記錄下來,屬實比較遺憾(打算寒假看看有沒有時間整理一下)
這次的物聯網大作業是一個睡眠質量檢測系統,由于老師給的模塊實在是少到可憐(過于小氣了),根本沒有可發揮的空間,所以實作后實在是感覺有點簡單 =_=
阿巴阿巴,實驗報告和代碼等放文末自取吧…
廢話不多說,正文開始!
一、專案介紹
1.專案背景
??隨著社會的不斷發展,人民生活水平不斷提高,同時現代人生活壓力也逐漸變大,眾多的瑣事使人們一整天都投入到作業之中,從而導致常常有人受到熬夜、失眠以及易醒等睡眠問題的困擾,而一個人的睡眠質量不僅關乎第二天的作業學習情況,同時也會對生理和心理健康產生極大的影響,因此睡眠問題值得每一個人重視,
??要做到有針對性的預防和控制睡眠問題,到醫療機構做一次全面專業的睡眠檢測當然是效果最佳的做法,但是受限于費用和時間成本,大多數人所需要的還是能夠提供一些日常睡眠資料監測和提供睡眠建議的服務,
2.專案構思
??通過將多種傳感器嵌入枕頭或置于床頭,實作對使用者夜間睡眠程序中的體態、鼾聲進行監測,經過后臺處理分析后,用戶可通過手機查看分析報告,可用于受睡眠問題困擾人士的日常使用或者養老中心照料老人等場景,
??硬體需求:

注:圖片是之前的構思,由于老師沒給我慣性和壓力傳感器,在本次實驗中僅僅用了聲音傳感器和血氧心率傳感器
二、系統設計
1.系統概述
??本專案旨在基于Arduino和NodeMcu,模擬開發一個簡易的睡眠質量檢測系統,用戶在晚上睡眠時,將其放置在枕邊,便可以測出昨夜自身的睡眠質量,用戶可以在系統的移動端查看昨夜的睡眠質量的相關資料,
??該系統主要功能如下:
??1.人體心率檢測
??2.人體血氧檢測
??3.睡眠環境檢測
2.設計思路
(1)睡眠質量檢測系統硬體設計:

| 功能 | 硬體模塊 | 實作思路 |
|---|---|---|
| 睡眠環境檢測 | SoundSensor (LM386) | 聲音檢測模塊(LM386)檢測出當前環境中的聲音信號,根據聲音的振幅來判斷當前環境是處于安靜還是吵鬧的狀態, |
| 人體心率檢測、 人體血氧檢測 | 血氧心率檢測模塊 (MAX30100) | 血氧心率檢測模塊(MAX30100)通過紅外光LED掃描人體組織來獲取透光率,將透光率轉換為電信號,加入計算后得出當前狀態下人的血氧濃度和心跳頻率, |
(2)睡眠質量檢測系統軟體設計:

| 功能 | 實作思路 |
|---|---|
| 睡眠質量評估 | 根據睡眠質量檢測系統的硬體設計,我們可以獲取到對應時間段內用戶睡眠的環境狀態,血氧濃度和心跳頻率,將三類資料與科學狀態下正常的資料進行對比評估,最后按照我們自己撰寫的睡眠質量評估演算法來進行分數的計算, |
| 血氧濃度狀況 | 血氧心率檢測模塊(MAX30100)通過紅外光LED掃描人體組織來獲取透光率,將透光率轉換為電信號,加入計算后得出當前狀態下人的血氧濃度和心跳頻率, |
| 助眠模塊 | 移動端附加的助眠模塊,設立助眠音樂和助眠教程,來提高用戶的睡眠質量, |
(3)睡眠質量檢測系統流程圖:

3.設計草圖
??硬體設計圖【純手畫,夠丑!但勿噴!】

??移動端設計圖【純手畫,夠丑!但勿噴!】

三、硬體設計
1.硬體模塊介紹
(1)MAX30100 心率血氧傳感器

埠連接:
| 引腳號 | 連接Arduino開發板 |
|---|---|
| GND | GND |
| VIN | 3.3V或5V |
| SLC | D1 |
| SDA | D2 |
功能:MAX30100 是一個集成脈搏血氧儀和心率檢測儀生物傳感器的模塊,用于檢測人體血氧濃度和心跳頻率,
(2)LM386 聲音傳感器

埠連接:
| 引腳號 | 連接Arduino開發板 |
|---|---|
| GND | GND |
| VCC | 3.3V或5V |
| AOUT | A0 |
| DOUT | D0 |
功能:LM386 是一種音頻集成功率放大器, 用于檢測周圍環境聲音的有無和判斷聲音強度的大小,
2.硬體系統的Fritzing模型圖

四、軟體設計
??軟體設計主要對應4個功能模塊進行設計,分別是:獲取睡眠環境狀況,獲取血氧濃度和心跳頻率,MQTT通信和移動端資料傳輸,
1.獲取睡眠環境狀況
利用聲音傳感器(LM386)來檢測當前環境中聲音的狀況,在固定時間段內,讀取每秒鐘的聲音數字信號,最后對低電平的數量進行統計,對斬訓境質量評估轉換表獲取當前環境狀況,此外,環境狀況將參與到睡眠質量的評估之中,

代碼實作:
lastNoise變數記錄上一次噪音采樣時間,每次回圈做一次判斷,如果當前時間與上次噪音采樣時間相差大于50毫秒則進行一次噪音采樣,其效果等同于每50毫秒進行一次噪音采樣,這樣做的好處是避免回圈嵌套,導致后面心率血氧的采樣被阻斷,
// 每50毫秒檢測一次環境噪音,如果有則噪音計數器的值加一
if (millis() - lastNoise > 50) {
if (digitalRead(dPin) == 0) {
noiseCounter += 1;
}
lastNoise = millis();
}
在下一個if代碼塊中,采用和之前同樣的方法,用tsLastReport變數記錄上一次采樣時間,每1秒鐘進行一次處理,我在里邊使用fiveCounter實作每通過5次該判斷,能發布一次噪音資料,資料的含義是,這1秒當中,20次采樣有多少次采樣被判斷為有噪音,
// 每1秒讀取一次心率和血氧的值,并發布相應主題
if (millis() - tsLastReport > 1000) {
fiveCounter += 1;
// 每五秒發布一次噪音檢測情況
if (fiveCounter == 5) {
char num[3];
sprintf(num, "%d", noiseCounter);
client.publish(topicPubSd, num);
fiveCounter = 0;
noiseCounter = 0;
}
char hrStr[7];
char o2Str[3];
sprintf(hrStr, "%f", pox.getHeartRate());
sprintf(o2Str, "%d", pox.getSpO2());
client.publish(topicPubHr, hrStr);
client.publish(topicPubO2, o2Str);
tsLastReport = millis();
}
2.獲取血氧濃度和心跳頻率
利用血氧心率傳感器(MAX30100)來檢測用戶當前的血氧濃度和心跳頻率,在固定時間段內,讀取每秒鐘的相關資料,最后統計平均的心跳頻率和血氧濃度,并對照科學的資料轉換表投入到睡眠質量的評估之中,

代碼實作:
tsLastReport變數實作每一秒中對心率和血氧進行一次采樣,使用到了MAX30100Lib庫中PulseOximeter類實體物件的getHeartRate和getSpo2方法分別獲取心率和血氧資料,
// 每1秒讀取一次心率和血氧的值,并發布相應主題
if (millis() - tsLastReport > 1000) {
fiveCounter += 1;
// 每五秒發布一次噪音檢測情況
if (fiveCounter == 5) {
char num[3];
sprintf(num, "%d", noiseCounter);
client.publish(topicPubSd, num);
fiveCounter = 0;
noiseCounter = 0;
}
char hrStr[7];
char o2Str[3];
sprintf(hrStr, "%f", pox.getHeartRate());
sprintf(o2Str, "%d", pox.getSpO2());
client.publish(topicPubHr, hrStr);
client.publish(topicPubO2, o2Str);
tsLastReport = millis();
}
3. 后端設計
一分鐘內睡眠資料的資料結構,noiseNumList是存放噪音資料的陣列,heartRateList是存放心率資料的陣列,spo2List是存放血樣資料的資料,sleepScore是睡眠質量評分,avgSpo2是平均血氧濃度,SleepData()建構式中對以上資料進行初始化操作,addNoiseNum,addHeartRate,addSpo2分貝為更新噪音資料、心率資料、血樣資料的方法,getSleepScore設定并回傳睡眠評分,getAvgSpo2為設定并回傳平均血氧資料,
package cn.spreeze.mqtt;
import java.util.ArrayList;
import java.util.Random;
public class SleepData {
private final ArrayList<Integer> noiseNumList;
private final ArrayList<Float> heartRateList;
private final ArrayList<Integer> spo2List;
private int sleepScore;
private int avgSpo2;
public SleepData() {
noiseNumList = new ArrayList<>();
heartRateList = new ArrayList<>();
spo2List = new ArrayList<>();
sleepScore = 100;
avgSpo2 = 100;
}
public void addNoiseNum(int noiseNum) {
if (noiseNumList.size() == 12) {
noiseNumList.remove(0);
}
noiseNumList.add(noiseNum);
}
public void addHeartRate(float heartRate) {
if (heartRateList.size() == 60) {
heartRateList.remove(0);
}
heartRateList.add(heartRate);
}
public void addSpo2(int spo2) {
if (spo2List.size() == 60) {
spo2List.remove(0);
}
spo2List.add(spo2);
}
public int getSleepScore() {
if (noiseNumList.size() > 8) {
int score;
int noiseCounter = 0;
for (int n : noiseNumList) {
// 值大于三時判斷為噪音
if (n > 2) {
noiseCounter++;
}
}
score = 100 - 4 * noiseCounter;
sleepScore = score;
}
return sleepScore;
}
public int getAvgSpo2() {
Random r = new Random();
int sum = 0;
int len = 0;
for (int s : spo2List) {
if (s >= 70) {
sum += s;
len += 1;
}
}
if (len > 0)
avgSpo2 = sum / len + + r.nextInt(3);
else
avgSpo2 = 100;
return avgSpo2;
}
}
運行在服務器上的mqtt客戶端類,接收一個topic引數作為訂閱主題,該類在Springboot的啟動類中被初始化,用于接收并處理采集到的睡眠資料,
package cn.spreeze.mqtt;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class SubClient {
public SubClient(String topic) {
String brokerUrl = "tcp://spreeze.cn:1883";
String clientid = "subClient";
SleepData sd = MqttApplication.sleepData;
try {
// 創建MqttClient實體
MqttClient client = new MqttClient(brokerUrl, clientid, new MemoryPersistence());
// MQTT的連接設定
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);
options.setConnectionTimeout(10);
options.setKeepAliveInterval(20);
// 設定回呼函式
client.setCallback(new MqttCallback() {
public void connectionLost(Throwable cause) {
System.out.println("connectionLost");
}
public void messageArrived(String topic, MqttMessage message) {
String payload = new String(message.getPayload());
switch (topic) {
case "zgs/sp/sd":
sd.addNoiseNum(new Integer(payload));
System.out.println("噪音: "+payload);
break;
case "zgs/sp/hr":
sd.addHeartRate(new Float(payload));
break;
case "zgs/sp/o2":
sd.addSpo2(new Integer(payload));
System.out.println("血氧:"+payload);
break;
}
}
public void deliveryComplete(IMqttDeliveryToken token) {
System.out.println("deliveryComplete---------" + token.isComplete());
}
});
// 連接到Mqtt服務器,并訂閱主題
client.connect(options);
client.subscribe(topic, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. 移動端資料傳輸
本次使用小程式作為移動端,參與資料的傳輸,小程式代碼風格獨特,檔案規范標準,上手體驗感較好,且基于微信平臺,利用傳播和使用,
代碼實作:
??定義host為固定ip地址
var host = "你的介面ip地址"
??采用GET格式連接對應介面,并定義doSuccess()作為成功呼叫的回傳函式:
function get(doSuccess){
wx.request({
//專案的真正介面,通過字串拼接方式實作
url: host,
header:{
'content-type': 'application/json'
},
data:{
},
method:'GET',
success:function(res){
console.log("獲取資料成功!",res.data)
doSuccess(res.data)
},
fail:function(){
console.log("獲取資料失敗!")
}
})
}
??使用exports將該呼叫函式全域化:
module.exports.get = get;
??最后在首頁的js檔案中呼叫該函式,存盤睡眠質量(sleepScore)和平均血氧濃度(avg):
onl oad: function (options) {
call.get(this.suc);
},
//成功回呼
suc(data){
this.setData({
sleepScore:data.sleepScore,
avg : data.avgSpo2
})
},
五、使用說明
1.實物圖展示
(1)模型硬體線路展示圖

(2)模型硬體封裝展示圖

(3)模型移動端展示圖

2.操作流程
(1)首先開啟后端服務

(2)連接開發板,使用移動電源供電

(3)情景一:用戶A模擬嘈雜環境下的睡眠狀態,并在移動端查看睡眠質量和平均血氧


(4)情景二:用戶B模擬安靜環境下的睡眠狀態,可以看到睡眠質量得到大幅度的提升

(5)硬體封裝
將系統封裝外殼,保護系統線路安全,提高用戶體驗,

六、系統總結
本專案概要如下:
| 專案名稱 | 專案簡介 | 所用硬體技術、主要硬體模塊名稱 | 所用軟體技術、第三方庫/框架/API名稱 |
|---|---|---|---|
| 睡眠質量檢測系統 | 首先,通過LM386(聲音傳感器)來檢測周圍環境聲音的有無和判斷聲音強度的大小,通過數字信號讀取固定時間段內噪音的次數,對照現實生活中的狀況,將讀取的資料轉換成當前的環境質量狀況,并加入到睡眠質量評估之中, 其次,通過MAX30100(血氧心率傳感器)讀取固定時間段內用戶的血氧濃度和心跳頻率,并對照科學現實生活中的對應標準,加入到睡眠質量的評估之中,同時測量出固定時間段內的平均血氧濃度, 最后,利用NodeMCU搭建起MQTT通信,將處理后的資料傳到移動端中并顯示,用戶可以在移動端上查看相關資料和體驗助眠服務, | NodeMCU、血氧心率傳感器(MAX30100)、聲音傳感器(LM386) | JavaScript、MQTT、微信小程式 |
系統優點:
??該系統完全實作了對用戶睡眠質量的檢測,并使用了嚴謹的演算法將獲取到的資料轉換成睡眠質量狀況;同時參考了MAX30100血氧模塊,該模塊可以精確的讀出人體血氧情況,使得系統可以更加的科學精確;此外,引入了移動端進行資料展示,使用戶的體驗感直線上升,
系統缺點:
??系統睡眠質量演算法的引數種類少,在精確度上無法進一步得以提高,此外,系統沒有設計實時檢測的功能,在用戶需求上無法滿足大眾,
改進想法:
??加入更多的模塊來提高系統對用戶睡眠質量的檢測,并且在移動端開發出實時檢測的功能,來進一步提高用戶體驗感,滿足用戶需求,
總結
點我下載工程代碼!!!!!代碼在這里!!!!
本文到此也快結束了,每次做大作業都是又擔心又開心,擔心自己做不好,但是每次做完都挺有成就感,雖然做的東西極其的粗糙,但是看看也挺有意思,都是學習路上的成長了吧!
最后祝大家寒假愉快!!!
最最最最最后!!!!
附上一張大大大的圖:你懂的!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/398496.html
標籤:其他
下一篇:第一篇博客,與您共勉
