大多數(shù)心臟病都與心臟發(fā)出的聲音有關(guān)并由其反映,而診斷心臟功能障礙的最簡單和最便宜的方法之一是心臟聽診,即聽心音。現(xiàn)在,如果我們談?wù)摰氖莻鹘y(tǒng)聽診,那需要經(jīng)驗和良好的聽力技巧。這就是為什么在這個項目中我們考慮構(gòu)建一個能夠獲取人體心率的電子聽診器,并且我們可以在基于藍牙的串行終端窗口中顯示數(shù)據(jù)。所以事不宜遲,讓我們開始吧。
無線數(shù)字聽診器如何工作?
在我們繼續(xù)閱讀本文之前,讓我們討論一下這個電路是如何工作的。
為了得到心跳數(shù)據(jù),我們先拿一個聽診器,把它切成兩半,裝上一個電容麥克風(fēng),這樣我們就可以得到聽診器發(fā)出的心跳聲了。接下來,我們將制作一個帶有運算放大器的放大器,并放大來自麥克風(fēng)的信號,以便我們可以使用 Arduino 的 ADC 讀取它。但在讀取信號之前,我們會將其通過一個低通濾波器,該濾波器將拒絕所有不必要的噪聲和信號,我們將在輸出端獲得純心跳信號。接下來,我們將借助 HC-05 藍牙模塊將此數(shù)據(jù)發(fā)送到藍牙終端窗口。
構(gòu)建無線聽診器所需的組件
構(gòu)建無線聽診器所需的組件非常通用,您可以在當(dāng)?shù)氐膼酆蒙痰曛姓业狡渲械拇蟛糠帧O旅娼o出了組件列表。
Arduino UNO
HC-05 藍牙模塊
NE5532 運算放大器 - 1
雙極性電源
穿孔板 - 1
1K 電阻 - 2
3.3K電阻1
10K 電阻 - 3
100K 電阻 - 1
470nF 電容 - 1
2.2uF電容 - 1
無線聽診器示意圖
無線聽診器的示意圖非常簡單易懂。首先,心跳由電容麥克風(fēng)拾取,我們有一個 1uF 隔直電容器來阻擋輸出信號的所有直流分量。接下來,我們有一個增益設(shè)置為 100X 的同相放大器。我們借助 1k 和 100K 電阻器將增益設(shè)置為 100X,以放大麥克風(fēng)接收到的信號。一旦信號被放大,我們將它通過一個低通濾波器,低通濾波器拒絕所有高于 300 HZ 的信號分量,只通過該信號范圍。之后我們有一個分壓器電路,因為我們使用 12-0-12 V 變壓器為實際電路供電,運算放大器的輸出會有所不同,因此您需要根據(jù)此調(diào)整分壓器,因此原理圖中未給出 R1 和 R2 的值。完成后,我們在 ADC 的幫助下轉(zhuǎn)換信號,并根據(jù) ADC 信號計算心跳,并在連接的藍牙模塊的幫助下發(fā)送數(shù)據(jù)。
基于藍牙的無線聽診器代碼
基于藍牙的無線聽診器的代碼非常簡單易懂。我們通過包含所有必需的庫來開始我們的代碼。對于這個項目,我們只需要一個庫來與藍牙模塊通信,它是軟件串行庫,
?
#include
?
接下來,我們需要包含所需的變量。我們定義了變量來存儲 ADC 值和一個計數(shù)器,用于保存特定時間段內(nèi)的脈沖數(shù)。我們還有一個包含毫秒值的區(qū)間變量,我們將使用該變量對心跳進行采樣,然后計算變量的平均值。我們還有一個名為?previousMillis的變量,它保存計數(shù)器數(shù)據(jù)并用于與毫秒計數(shù)器進行比較。
?
常量 int 類比輸入引腳 = A0;// 電位器連接到的模擬輸入引腳 int 傳感器值 = 0; 無符號長計數(shù)器 = 0; 整數(shù)間隔 = 5000; unsigned long previousMillis = 0;
?
接下來,我們初始化了softserial并創(chuàng)建了一個名為BTserial的實例。通過這個,我們可以和藍牙串口模塊進行通信。
?
SoftwareSerial BTserial(3, 4); // 接收 | 德克薩斯州
?
接下來,我們有我們的設(shè)置功能。在 setup 函數(shù)中,我們以9600 baud調(diào)用serial 和BTserial實例的begin 方法。這樣我們就可以通過Arduino進行調(diào)試,同時與藍牙模塊進行通信。
?
無效設(shè)置(){ 序列號.開始(9600); BTserial.begin(9600); }
?
接下來,我們有循環(huán)功能。在循環(huán)函數(shù)中,我們聲明了兩個變量currentMillis和currentMillis2。這些將保存兩個當(dāng)前時間戳,稍后在代碼中將很有用。
?
無符號長 currentMillis = millis(); 無符號長 currentMillis2 = millis();
?
接下來,我們有一個if 語句。在 if 語句中,我們檢查是否超過了 30 秒,如果是,則進入下一個 while 循環(huán)。在while循環(huán)中,我們獲取ADC數(shù)據(jù)并檢查接收到的值是否在一定范圍內(nèi),如果是,我們增加計數(shù)器,增加計數(shù)器意味著我們已經(jīng)識別到心跳。現(xiàn)在我們重置所有變量并將心跳帳戶打印到串口監(jiān)視器窗口,我們也通過藍牙發(fā)送數(shù)據(jù)。
?
if ((unsigned long)(currentMillis2 - previousMillis2) >= interval2) { while ((currentMillis - previousMillis) < 間隔) { 傳感器值 = 模擬讀取(模擬輸入引腳); 如果(傳感器值 > 130 && 傳感器值 < 250) { 計數(shù)器++; } } 以前的Millis = currentMillis; 以前的Millis2 = currentMillis2; Serial.println(計數(shù)器); BTserial.write(計數(shù)器); } }
?
這標(biāo)志著我們的代碼部分的結(jié)束,我們可以繼續(xù)下一部分,這是本文的測試部分。
測試無線聽診器電路
電路構(gòu)建完成后,我們將聽診器放入并檢查波形。為此,我們首先用手指敲擊聽診器的隔膜,然后產(chǎn)生如下所示的結(jié)果 -
接下來,我將聽診器放在胸前觀察波形,如下圖所示——
從上圖中可以看出,從運算放大器出來的 peek-to-peek 電壓約為 14.6V。
接下來,我們打開串口監(jiān)視器窗口,檢查串口數(shù)據(jù)是否準(zhǔn)確,數(shù)據(jù)是否準(zhǔn)確打印在串口監(jiān)視器窗口上。
接下來,我們將藍牙與手機配對,下載藍牙串口終端安卓應(yīng)用,將藍牙與串口終端連接。一切完成后,您可以看到我們能夠在串行終端窗口中獲??取數(shù)據(jù)。
我們在構(gòu)建過程中遇到的問題
在構(gòu)建過程中,我們遇到了很多問題,其中最重要的一個是將麥克風(fēng)安裝到聽診器的管道上。為此,我們不得不將聽診器的管道刮很多,然后加熱以使管道更大,然后我們使用強力膠將麥克風(fēng)與聽診器的管道固定在一起。
下一個大問題是噪音。聽診器的管道與衣服摩擦?xí)r會產(chǎn)生隨機噪聲,因此我們需要在運放級的輸出端加一個低通濾波器。
接下來,我們必須使用軟件對 ADC 數(shù)據(jù)進行過濾,使用for 循環(huán)對數(shù)據(jù)進行平均,以使模塊的輸出穩(wěn)定。
代碼
#include
常量 int 類比輸入引腳 = A0;// 電位器連接到的模擬輸入引腳
int 傳感器值 = 0;
無符號長計數(shù)器 = 0;
整數(shù)間隔 = 5000;
整數(shù)間隔2 = 5000;
unsigned long previousMillis = 0;
unsigned long previousMillis2 = 0;
SoftwareSerial BTserial(3, 4); // 接收 | 德克薩斯州
無效設(shè)置(){
??序列號.開始(9600);
??BTserial.begin(9600);
}
無效循環(huán)(){
??無符號長 currentMillis = millis();
??無符號長 currentMillis2 = millis();
??if ((unsigned long)(currentMillis2 - previousMillis2) >= interval2)
??{
????while ((currentMillis - previousMillis) < 間隔)
????{
??????傳感器值 = 模擬讀取(模擬輸入引腳);
??????如果(傳感器值 > 130 && 傳感器值 < 250)
??????{
????????計數(shù)器++;
??????}
????}
????以前的Millis = currentMillis;
????以前的Millis2 = currentMillis2;
????Serial.println(計數(shù)器);
????BTserial.write(計數(shù)器);
??}
}
評論
查看更多