大多数心脏病都与心脏发出的声音有关并由其反映,而诊断心脏功能障碍的最简单和最便宜的方法之一是心脏听诊,即听心音。现在,如果我们谈论的是传统听诊,那需要经验和良好的听力技巧。这就是为什么在这个项目中我们考虑构建一个能够获取人体心率的电子听诊器,并且我们可以在基于蓝牙的串行终端窗口中显示数据。所以事不宜迟,让我们开始吧。
无线数字听诊器如何工作?
在我们继续阅读本文之前,让我们讨论一下这个电路是如何工作的。
为了得到心跳数据,我们先拿一个听诊器,把它切成两半,装上一个电容麦克风,这样我们就可以得到听诊器发出的心跳声了。接下来,我们将制作一个带有运算放大器的放大器,并放大来自麦克风的信号,以便我们可以使用 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数据并检查接收到的值是否在一定范围内,如果是,我们增加计数器,增加计数器意味着我们已经识别到心跳。现在我们重置所有变量并将心跳帐户打印到串口监视器窗口,我们也通过蓝牙发送数据。
if ((unsigned long)(currentMillis2 - previousMillis2) >= interval2) { while ((currentMillis - previousMillis) < 间隔) { 传感器值 = 模拟读取(模拟输入引脚); 如果(传感器值 > 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(计数器);
}
}