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