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