一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32的實(shí)時(shí)心率檢測(cè)儀設(shè)計(jì)

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-02-28 14:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

?一、開發(fā)環(huán)境介紹

主控芯片: STM32F103ZET6

代碼編程軟件: keil5

心率檢測(cè)模塊: PulseSensor

WIFI模塊: ESP8266 --可選的。直接使用串口有線傳輸給上位機(jī)也可以。

上位機(jī): C++(QT) 設(shè)計(jì)的。 支持PC機(jī)電腦、Android手機(jī)顯示。

與上位機(jī)的傳輸協(xié)議: 支持串口傳輸、WIFI網(wǎng)絡(luò)傳輸兩種。 如果是PC就可以直接連接串口傳輸數(shù)據(jù),如果不方便可以直接通過WIFI---TCP協(xié)議傳輸。

二、PulseSensor心率模塊介紹

PulseSensor 是一款用于脈搏心率測(cè)量的光電反射式模擬傳感器

可以將其佩戴于手指、耳垂、手腕等處,通過杜邦線--導(dǎo)線將引腳連接到單片機(jī),可將采集到的模擬信號(hào)傳輸給單片機(jī),單片機(jī)配置ADC用來轉(zhuǎn)換為數(shù)字信號(hào),再通過單片機(jī)簡(jiǎn)單計(jì)算后就可以得到心率數(shù)值;為了方便聯(lián)動(dòng)健康管理系統(tǒng),也方便自己了解自己的心率,可將脈搏波形通過串口、WIFI等方式上傳到電腦、手機(jī)顯示波形,然后根據(jù)提前配置的參數(shù),結(jié)合算法確定是否正常。

PulseSensor 是一款開源硬件, 目前國外官網(wǎng)上已有其對(duì)應(yīng)的單片機(jī)程序,也附帶有對(duì)應(yīng)的上位機(jī)Processing 程序, 比較適用于心率方面的科學(xué)研究和教學(xué)演示,也非常適合用于二次開發(fā);上位機(jī)也可以自己開發(fā),根據(jù)自己的需求定制,達(dá)到自己想要的功能。

傳感器的接口一共 3 個(gè),

其中標(biāo)有S的為模擬信號(hào)輸出線

標(biāo)有+的為電源輸入線(中間);

標(biāo)有-的為地線。

總結(jié)一下:

S → 脈搏信號(hào)輸出(要接單片機(jī) AD 接口)

+ → 5v(或 3.3v)電源輸入

- → GND 地

傳感器的硬件參數(shù)介紹:

電路板直徑: 16mm

電路板厚度: 1.2mm

LED 峰值波長(zhǎng): 515nm

供電電壓: 3.3~5v

檢測(cè)信號(hào)類型:光反射信號(hào)(PPG)

輸出信號(hào)類型:模擬信號(hào)

信號(hào)放大倍數(shù): 330 倍

輸出信號(hào)大?。?0~VCC

電流大?。?~4ma(5v 下)

傳統(tǒng)的測(cè)量方法介紹:

傳統(tǒng)的脈搏測(cè)量方法主要有三種:

一是從心電信號(hào)中提取;

二是從測(cè)量血壓時(shí)壓力傳感器測(cè)到的波動(dòng)來計(jì)算脈率;

三是光電容積法。前兩種方法提取信號(hào)都會(huì)限制病人的活動(dòng),如果長(zhǎng)時(shí)間使用會(huì)增加病人生理和心理上的不舒適感。而光電容積法脈搏測(cè)量作為監(jiān)護(hù)測(cè)量中最普遍的方法之一,其具有方法簡(jiǎn)單、佩戴方便、可靠性高等特點(diǎn)。

光電容積法的基本原理是利用人體組織在血管搏動(dòng)時(shí)造成透光率不同來進(jìn)行脈搏測(cè)量的。其使用的傳感器由光源和光電變換器兩部分組成,通過綁帶或夾子固定在病人的手指或耳垂上。光源一般采用對(duì)動(dòng)脈血中氧和血紅蛋白有選擇性的一定波長(zhǎng)(500nm~700nm)的發(fā)光二極管。當(dāng)光束透過人體外周血管,由于動(dòng)脈搏動(dòng)充血容積變化導(dǎo)致這束光的透光率發(fā)生改變,此時(shí)由光電變換器接收經(jīng)人體組織反射的光線,轉(zhuǎn)變?yōu)殡娦盘?hào)并將其放大和輸出。由于脈搏是隨心臟的搏動(dòng)而周期性變化的信號(hào),動(dòng)脈血管容積也周期性變化,因此光電變換器的電信號(hào)變化周期就是脈搏率。

根據(jù)相關(guān)文獻(xiàn)和實(shí)驗(yàn)結(jié)果, 560nm 波長(zhǎng)左右的波可以反映皮膚淺部微動(dòng)脈信息,適合用來提取脈搏信號(hào)。

本傳感器采用了峰值波長(zhǎng)為 515nm 的綠光 LED,型號(hào)為 AM2520,而光接收器采用了 APDS-9008, 這是一款環(huán)境光感受器,感受峰值波長(zhǎng)為 565nm,兩者的峰值波長(zhǎng)相近,靈敏度較高。此外,由于脈搏信號(hào)的頻帶一般在 0.05~200Hz 之間, 信號(hào)幅度均很小,一般在毫伏級(jí)水平,容易受到各種信號(hào)干擾。在傳感器后面使用了低通濾波器和由運(yùn)放 MCP6001 構(gòu)成的放大器,將信號(hào)放大了 330 倍,同時(shí)采用分壓電阻設(shè)置直流偏置電壓為電源電壓的 1/2,使放大后的信號(hào)可以很好地被單片機(jī)的 AD 采集到。

整個(gè)心率傳感器的結(jié)構(gòu)如下圖:

基于STM32的實(shí)時(shí)心率檢測(cè)儀設(shè)計(jì)

由于傳感器使用的是固定倍數(shù)的放大器, 而人體生理信號(hào)是微弱信號(hào),細(xì)微的差異會(huì)導(dǎo)致放大后的信號(hào)產(chǎn)生巨大的差別。 所以下圖的示波器顯示的波形只是理想情況下的波形,每個(gè)人的實(shí)際效果會(huì)略有區(qū)別。

基于STM32的實(shí)時(shí)心率檢測(cè)儀設(shè)計(jì)

?三、STM32的控制代碼

STM32的采集代碼比較簡(jiǎn)單,因?yàn)榫椭恍枰渲脤?duì)應(yīng)引腳的ADC功能采集即可。

可以采集10次,去掉最大值最小值取平均值,拿到最終結(jié)果再傳遞給上位機(jī)顯示。

3.1 ADC的配置代碼

/*
函數(shù)功能: 初始化ADC1
硬件連接: PA1  --ADC1的通道1
配置的模式:模擬輸入
*/
void ADC1_Init(void)
{
   /*1. 配置GPIO口*/
  RCC->APB2ENR|=1<<2; //開啟PA時(shí)鐘
  GPIOA->CRL&=0xFFFFFF0F;
  GPIOA->CRL|=0x00000000;
  
  /*2. 配置ADC相關(guān)寄存器*/
  RCC->APB2ENR|=1<<9;//開啟ADC1時(shí)鐘
  
  RCC->APB2RSTR|=1<<9;   //開啟ADC1復(fù)位時(shí)鐘
  RCC->APB2RSTR&=~(1<<9);//關(guān)閉ADC1復(fù)位時(shí)鐘
  
  RCC->CFGR&=~(0x3<<14); //清除ADC的時(shí)鐘配置
  RCC->CFGR|=0x2<<14;    //配置6分頻
  
  ADC1->CR2|=1<<20;      //開啟外部事件轉(zhuǎn)換
  ADC1->CR2|=0x7<<17;    //SW開關(guān)方式控制ADC轉(zhuǎn)換(作為外部事件)

  ADC1->SMPR2|=0x7<<3;   //配置通道1的采樣時(shí)間
  
  ADC1->CR2|=1<<0;//開啟ADC并啟動(dòng)轉(zhuǎn)換
  ADC1->CR2|=1<<3;//開啟ADC校準(zhǔn)初始化
  while(ADC1->CR2&1<<3){}//等待初始化完成
  ADC1->CR2|=1<<2;//開啟ADC校準(zhǔn)
  while(ADC1->CR2&1<<2){} //等待ADC校準(zhǔn)完成   
}

/*
函數(shù)功能: 根據(jù)傳入的通道編號(hào)獲取一次該通道的ADC值
*/
u16 ADC1_GetData(u8 ch)
{
   ADC1->SQR3&=0xFFFFFFE0; //0xE0-->11100000 //清除原來的通道編號(hào)
   ADC1->SQR3|=ch<<0; //配置現(xiàn)在即將轉(zhuǎn)換的通道號(hào)
   ADC1->CR2|=1<<22;  //開啟一次ADC規(guī)則通道轉(zhuǎn)換
   while(!(ADC1->SR&1<<1)){} //等待轉(zhuǎn)換完成
   return ADC1->DR;  //讀出ADC的結(jié)果值
}


3.2 ESP8?266 WIFI 配置代碼
#include "esp8266.h"

/*
函數(shù)功能:向ESP82668266發(fā)送命令
函數(shù)參數(shù):
				cmd:發(fā)送的命令字符串
				ack:期待的應(yīng)答結(jié)果,如果為空,則表示不需要等待應(yīng)答
				waittime:等待時(shí)間(單位:10ms)
返 回 值:
				 0,發(fā)送成功(得到了期待的應(yīng)答結(jié)果)
         1,發(fā)送失敗
*/
u8 ESP8266_SendCmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	USART3_RX_CNT=0;
	UsartStringSend(USART3,cmd);//發(fā)送命令
	if(ack&&waittime)		//需要等待應(yīng)答
	{
		while(--waittime)	//等待倒計(jì)時(shí)
		{
			DelayMs(10);
			if(USART3_RX_STA)//接收到期待的應(yīng)答結(jié)果
			{
				if(ESP8266_CheckCmd(ack))
				{
					res=0;
					//printf("cmd->ack:%s,%s\r\n",cmd,(u8*)ack);
					break;//得到有效數(shù)據(jù) 
				}
				USART3_RX_STA=0;
				USART3_RX_CNT=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
}


/*
函數(shù)功能:ESP8266發(fā)送命令后,檢測(cè)接收到的應(yīng)答
函數(shù)參數(shù):str:期待的應(yīng)答結(jié)果
返 回 值:0,沒有得到期待的應(yīng)答結(jié)果
				 其他,期待應(yīng)答結(jié)果的位置(str的位置)
*/
u8* ESP8266_CheckCmd(u8 *str)
{
	char *strx=0;
	if(USART3_RX_STA)  //接收到一次數(shù)據(jù)了
	{ 
		USART3_RX_BUF[USART3_RX_CNT]=0;//添加結(jié)束符
		strx=strstr((const char*)USART3_RX_BUF,(const char*)str); //查找是否應(yīng)答成功
		//printf("RX=%s",USART3_RX_BUF);
	}
	return (u8*)strx;
}

/*
函數(shù)功能:向ESP8266發(fā)送指定數(shù)據(jù)
函數(shù)參數(shù):
				data:發(fā)送的數(shù)據(jù)(不需要添加回車)
				ack:期待的應(yīng)答結(jié)果,如果為空,則表示不需要等待應(yīng)答
				waittime:等待時(shí)間(單位:10ms)
返 回 值:0,發(fā)送成功(得到了期待的應(yīng)答結(jié)果)luojian
*/
u8 ESP8266_SendData(u8 *data,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	UsartStringSend(USART3,data);//發(fā)送數(shù)據(jù)
	if(ack&&waittime)		//需要等待應(yīng)答
	{
		while(--waittime)	//等待倒計(jì)時(shí)
		{
			DelayMs(10);
			if(USART3_RX_STA)//接收到期待的應(yīng)答結(jié)果
			{
				if(ESP8266_CheckCmd(ack))break;//得到有效數(shù)據(jù) 
				USART3_RX_STA=0;
				USART3_RX_CNT=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
}
	
	

/*
函數(shù)功能:ESP8266退出透?jìng)髂J?返 回 值:0,退出成功;
         1,退出失敗
*/
u8 ESP8266_QuitTrans(void)
{
	while((USART3->SR&0X40)==0);	//等待發(fā)送空
	USART3->DR='+';      
	DelayMs(15);					//大于串口組幀時(shí)間(10ms)
	while((USART3->SR&0X40)==0);	//等待發(fā)送空
	USART3->DR='+';      
	DelayMs(15);					//大于串口組幀時(shí)間(10ms)
	while((USART3->SR&0X40)==0);	//等待發(fā)送空
	USART3->DR='+';      
	DelayMs(500);					//等待500ms
	return ESP8266_SendCmd("AT\r\n","OK",20);//退出透?jìng)髋袛?
}

/*
函數(shù)功能:獲取ESP8266模塊的連接狀態(tài)
返 回 值:0,未連接;1,連接成功.
*/
u8 ESP8266_ConstaCheck(void)
{
	u8 *p;
	u8 res;
	if(ESP8266_QuitTrans())return 0;			  //退出透?jìng)?
	ESP8266_SendCmd("AT+CIPSTATUS\r\n",":",50);	//發(fā)送AT+CIPSTATUS指令,查詢連接狀態(tài)
	p=ESP8266_CheckCmd("+CIPSTATUS\r\n:"); 
	res=*p;																	//得到連接狀態(tài)	
	return res;
}

/*
函數(shù)功能:獲取ip地址
函數(shù)參數(shù):ipbuf:ip地址輸出緩存區(qū)
*/
void ESP8266_GetWanip(u8* ipbuf)
{
	  u8 *p,*p1;
		if(ESP8266_SendCmd("AT+CIFSR\r\n","OK",50))//獲取WAN IP地址失敗
		{
			ipbuf[0]=0;
			return;
		}		
		p=ESP8266_CheckCmd(""");
		p1=(u8*)strstr((const char*)(p+1),""");
		*p1=0;
		sprintf((char*)ipbuf,"%s",p+1);	
}

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

四、QT設(shè)計(jì)的上位機(jī)代碼

4.1 軟件運(yùn)行效果圖

軟件有兩個(gè)版本: 1. 網(wǎng)絡(luò)版本 2. 串口版本

網(wǎng)絡(luò)版本主要是通過TCP協(xié)議傳輸數(shù)據(jù)顯示,串口版本直接通過串口傳輸。

基于STM32的實(shí)時(shí)心率檢測(cè)儀設(shè)計(jì)

  ?  基于STM32的實(shí)時(shí)心率檢測(cè)儀設(shè)計(jì)

?4.2 widget.cpp代碼

基于STM32的實(shí)時(shí)心率檢測(cè)儀設(shè)計(jì)

代碼較多,這里就主UI的部分代碼。#include "widget.h"

#include "ui_widget.h"

#define AppFontName "Microsoft YaHei"
#define AppFontSize 9

#define TextColor QColor(255,255,255)
#define Plot_NoColor QColor(0,0,0,0)

//曲線1的顏色
#define HeartRate_Plot_DotColor QColor(236,110,0)
#define HeartRate_Plot_LineColor QColor(246,98,0)
#define HeartRate_Plot_BGColor QColor(246,98,0,80)

//曲線2的顏色
#define HeartRate_Plot_DotColor_2 Qt::blue
#define HeartRate_Plot_LineColor_2 Qt::blue
#define HeartRate_Plot_BGColor_2 Qt::blue

#define TextWidth 1
#define LineWidth 2
#define DotWidth 5

//一個(gè)刻度里的小刻度數(shù)量--太小的話顯示的時(shí)間會(huì)重疊
#define HeartRate_Plot_Count 5
//Y軸最大范圍值
#define HeartRate_Plot_MaxY 3000

/*
 * 設(shè)置QT界面的樣式
*/
void Widget::SetStyle(const QString &qssFile) {
    QFile file(qssFile);
    if (file.open(QFile::ReadOnly)) {
        QString qss = QLatin1String(file.readAll());
        qApp->setStyleSheet(qss);
        QString PaletteColor = qss.mid(20,7);
        qApp->setPalette(QPalette(QColor(PaletteColor)));
        file.close();
    }
    else
    {
        qApp->setStyleSheet("");
    }
}

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    /*服務(wù)器線程*/
    //開始信號(hào)
    connect(this,SIGNAL(StartServerThread()),&tcp_server_class,SLOT(run()));
    //日志信號(hào)
    connect(&tcp_server_class,SIGNAL(LogSend(QString)),this,SLOT(Log_Display(QString)));
    //移動(dòng)到線程
    tcp_server_class.moveToThread(&tcp_server_thread);
    tcp_server_thread.start(); //啟動(dòng)線程
    StartServerThread(); //創(chuàng)建服務(wù)器

    this->setWindowTitle("萬邦易嵌-健康監(jiān)控管家");

    //波形圖界面初始化
    InitForm();
    InitPlot();
    HeartRate_InitPlot();
    HeartRate_LoadPlot();
    SetStyle(":/blue.css");
    //開始加載數(shù)據(jù)
    plot_timer->start(100);
}

Widget::~Widget()
{
    delete ui;
}

//日志顯示
void Widget::Log_Display(QString text)
{
    QPlainTextEdit *plainTextEdit_log=ui->plainTextEdit_log;
    //設(shè)置光標(biāo)到文本末尾
    plainTextEdit_log->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
    //當(dāng)文本數(shù)量超出一定范圍就清除
    if(plainTextEdit_log->toPlainText().size()>1024*4)
    {
        plainTextEdit_log->clear();
    }
    plainTextEdit_log->insertPlainText(text);
    //移動(dòng)滾動(dòng)條到底部
    QScrollBar *scrollbar = plainTextEdit_log->verticalScrollBar();
    if(scrollbar)
    {
        scrollbar->setSliderPosition(scrollbar->maximum());
    }
}

//查看服務(wù)器狀態(tài)
void Widget::on_toolButton_server_stat_clicked()
{
    QString text="TCP服務(wù)器IP地址列表:\n";
    QList list = QNetworkInterface::allAddresses();
    for(int i=0;isocketDescriptor()==-1)
        {
            text+="設(shè)備未連接\n";
        }
        else
        {
            text+="設(shè)備連接成功\n";
        }
    }
    else
    {
        text+="設(shè)備未連接\n";
    }

    text+="數(shù)據(jù)協(xié)議:\n";
    text+="A:心電數(shù)據(jù)1,B:新電數(shù)據(jù)2,C:運(yùn)動(dòng)步數(shù),D:運(yùn)動(dòng)距離,E:體表溫度\n";
    text+="例如: "A:1633215,B:1833215,C:45,D:28,E:66.55"";

    QMessageBox::about(this,"狀態(tài)信息",text);
}


//窗口關(guān)閉事件
void Widget::closeEvent(QCloseEvent *event)
{
    tcp_server_thread.quit();
    tcp_server_thread.wait();
}

void Widget::InitForm()
{
    //初始化隨機(jī)數(shù)種子
    QTime time = QTime::currentTime();
    qsrand(time.msec() + time.second() * 1000);

    //初始化動(dòng)態(tài)曲線定時(shí)器
    plot_timer = new QTimer(this);
    connect(plot_timer, SIGNAL(timeout()), this, SLOT(HeartRate_LoadPlot()));

    plots.append(ui->plot2);
}

void Widget::InitPlot()
{
    //設(shè)置縱坐標(biāo)名稱
    plots.at(0)->yAxis->setLabel("心電數(shù)據(jù)(單位:%)");
    //設(shè)置縱坐標(biāo)范圍
    plots.at(0)->yAxis->setRange(0, HeartRate_Plot_MaxY);
    //設(shè)置支持鼠標(biāo)移動(dòng)縮放波形界面
    plots.at(0)->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
    //設(shè)置背景顏色
#if 1
    foreach (QCustomPlot *plot, plots)
    {
        //設(shè)置字體大小
        QFont font = QFont(AppFontName, AppFontSize - 2);
        plot->legend->setFont(font);
        plot->xAxis->setLabelFont(font);
        plot->yAxis->setLabelFont(font);
        plot->xAxis->setTickLabelFont(font);
        plot->yAxis->setTickLabelFont(font);

        //設(shè)置坐標(biāo)顏色/坐標(biāo)名稱顏色
        plot->yAxis->setLabelColor(TextColor);
        plot->xAxis->setTickLabelColor(TextColor);
        plot->yAxis->setTickLabelColor(TextColor);
        plot->xAxis->setBasePen(QPen(TextColor, TextWidth));
        plot->yAxis->setBasePen(QPen(TextColor, TextWidth));
        plot->xAxis->setTickPen(QPen(TextColor, TextWidth));
        plot->yAxis->setTickPen(QPen(TextColor, TextWidth));
        plot->xAxis->setSubTickPen(QPen(TextColor, TextWidth));
        plot->yAxis->setSubTickPen(QPen(TextColor, TextWidth));

        //設(shè)置畫布背景色
        QLinearGradient plotGradient;
        plotGradient.setStart(0, 0);
        plotGradient.setFinalStop(0, 350);
        plotGradient.setColorAt(0, QColor(80, 80, 80));
        plotGradient.setColorAt(1, QColor(50, 50, 50));
        plot->setBackground(plotGradient);

        //設(shè)置坐標(biāo)背景色
        QLinearGradient axisRectGradient;
        axisRectGradient.setStart(0, 0);
        axisRectGradient.setFinalStop(0, 350);
        axisRectGradient.setColorAt(0, QColor(80, 80, 80));
        axisRectGradient.setColorAt(1, QColor(30, 30, 30));
        plot->axisRect()->setBackground(axisRectGradient);

        //設(shè)置圖例提示位置及背景色
        plot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignTop | Qt::AlignRight);
        plot->legend->setBrush(QColor(255, 255, 255, 200));
        plot->replot();
    }
#endif
}


void Widget::HeartRate_InitPlot()
{
    plots.at(0)->addGraph();

    plots.at(0)->graph(0)->setName("心電數(shù)據(jù)1");
    plots.at(0)->graph(0)->setPen(QPen(HeartRate_Plot_LineColor, LineWidth));
    plots.at(0)->graph(0)->setScatterStyle(
        QCPScatterStyle(QCPScatterStyle::ssCircle,
                        QPen(HeartRate_Plot_DotColor, LineWidth),
                        QBrush(HeartRate_Plot_DotColor), DotWidth));
    //設(shè)置動(dòng)態(tài)曲線的橫坐標(biāo)格式及范圍
    plots.at(0)->xAxis->setTickLabelType(QCPAxis::ltDateTime);
    plots.at(0)->xAxis->setDateTimeFormat("HH:mm:ss");
    plots.at(0)->xAxis->setAutoTickStep(true);
    plots.at(0)->xAxis->setTickStep(0.5);
    plots.at(0)->xAxis->setRange(0, HeartRate_Plot_Count, Qt::AlignRight);

    plots.at(0)->addGraph();//相當(dāng)于添加一條新的曲線
    plots.at(0)->graph(1)->setName("心電數(shù)據(jù)2");
    plots.at(0)->graph(1)->setPen(QPen(HeartRate_Plot_LineColor_2, LineWidth));
    plots.at(0)->graph(1)->setScatterStyle(
        QCPScatterStyle(QCPScatterStyle::ssCircle,
                        QPen(HeartRate_Plot_DotColor_2, LineWidth),
                        QBrush(HeartRate_Plot_DotColor_2), DotWidth));


    //設(shè)置是否需要顯示曲線的圖例說明
    foreach (QCustomPlot *plot, plots)
    {
        plot->legend->setVisible(true);
        plot->replot();
    }


    //得到數(shù)據(jù)指針
    mData_0 = plots.at(0)->graph(0)->data();
    mData_1 = plots.at(0)->graph(1)->data();
}

void addToDataBuffer(QCPDataMap *mData,double x, double y)
{
    QCPData newData;

    newData.key = x;
    newData.value = y;

    mData->insert(x, newData);
}


//加載曲線數(shù)據(jù)
void Widget::HeartRate_LoadPlot()
{
    int i;
    bool flag=false;

    for(i=0;i<5;i++)
    {
        //得到秒單位的時(shí)間
        HeartRate_plot_key = QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000.0;
        //心電數(shù)據(jù)1
        HeartRate_plot_value=uart_queue_data.read_queueA();
        if(HeartRate_plot_value>0)
        {
            flag=true;
            addToDataBuffer(mData_0,HeartRate_plot_key,HeartRate_plot_value);
        }

        //心電數(shù)據(jù)2
        HeartRate_plot_value=uart_queue_data.read_queueB();
        if(HeartRate_plot_value>0)
        {
            flag=true;
            addToDataBuffer(mData_1,HeartRate_plot_key,HeartRate_plot_value);
        }
    }
    if(flag)
    {
        plots.at(0)->xAxis->setRange(HeartRate_plot_key, HeartRate_Plot_Count , Qt::AlignRight);
        plots.at(0)->rescaleAxes(false);  //設(shè)置圖表完全可見
        plots.at(0)->replot();

    }

    /*
    A:心電數(shù)據(jù)1,B:新電數(shù)據(jù)2,C:運(yùn)動(dòng)步數(shù),D:運(yùn)動(dòng)距離,E:體表溫度
    例如: "A:1633215,B:1833215,C:45,D:28,E:66.55"
    */
    int val=uart_queue_data.read_queueC();
    if(val>0)
    {
        ui->lcdNumber_bumber->display(val);
    }

    val=uart_queue_data.read_queueD();
    if(val>0)
    {
        ui->lcdNumber_len->display(val);
    }

    double tmp_val=uart_queue_data.read_queueE();
    if(tmp_val>0)
    {
        ui->lcdNumber_temp->display(tmp_val);
    }
}

void Widget::on_toolButton_src_data_clicked()
{
    ui->stackedWidget->setCurrentIndex(0);
}

void Widget::on_toolButton_image_data_clicked()
{
    ui->stackedWidget->setCurrentIndex(1);
}

void Widget::on_toolButton_clear_clicked()
{
    mData_0->clear();
    mData_1->clear();
}

void Widget::on_commandLinkButton_clicked()
{
    QDesktopServices::openUrl(QUrl("https://blog.csdn.net/xiaolong1126626497/article/details/116694318"));
}

();i++)>

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2565

    文章

    52935

    瀏覽量

    766934
  • STM32
    +關(guān)注

    關(guān)注

    2293

    文章

    11031

    瀏覽量

    364527
  • 檢測(cè)儀
    +關(guān)注

    關(guān)注

    5

    文章

    4252

    瀏覽量

    44093
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    氣密性檢測(cè)儀的核心應(yīng)用范疇及其所針對(duì)的檢測(cè)目標(biāo)

    在工業(yè)生產(chǎn)與質(zhì)量控制領(lǐng)域,氣密性檢測(cè)儀是保障產(chǎn)品品質(zhì)與性能的關(guān)鍵設(shè)備。以下將圍繞氣密性檢測(cè)儀的核心應(yīng)用范疇及其所針對(duì)的檢測(cè)目標(biāo)展開介紹,以下是對(duì)上述關(guān)于氣密性檢測(cè)儀內(nèi)容的梳理與總結(jié):
    的頭像 發(fā)表于 06-27 15:03 ?130次閱讀
    氣密性<b class='flag-5'>檢測(cè)儀</b>的核心應(yīng)用范疇及其所針對(duì)的<b class='flag-5'>檢測(cè)</b>目標(biāo)

    煙氣檢測(cè)儀是如何工作的?工作原理大揭秘

    煙氣檢測(cè)儀是一種先進(jìn)的煙氣檢測(cè)設(shè)備,在工業(yè)生產(chǎn)、環(huán)保監(jiān)測(cè)等眾多領(lǐng)域當(dāng)中有著廣泛的應(yīng)用。它就像一雙敏銳的眼睛,能夠捕捉煙氣中的各種成分和參數(shù),幫助用戶了解燃燒狀況、評(píng)估環(huán)境質(zhì)量。那么,煙氣檢測(cè)儀究竟是
    發(fā)表于 06-16 16:10

    基于STM32的數(shù)據(jù)采集+心率檢測(cè)儀(原理圖、PCB、程序源碼等)實(shí)例項(xiàng)目下載

    基于STM32的數(shù)據(jù)采集+心率檢測(cè)儀(原理圖、PCB、程序源碼等)實(shí)例項(xiàng)目推薦下載!
    發(fā)表于 05-29 21:33

    煙氣檢測(cè)儀是什么?這里為你精準(zhǔn)揭秘!

    檢測(cè)儀是一種用于檢測(cè)煙氣中各種成分和參數(shù)的設(shè)備。它就像是環(huán)境和工業(yè)生產(chǎn)的“健康衛(wèi)士”,能夠實(shí)時(shí)、準(zhǔn)確地測(cè)量煙氣中的多種物質(zhì),如一氧化碳、二氧化碳、二氧化硫、氮氧化物等有害氣體的濃度,以及煙氣的溫度、壓力
    發(fā)表于 05-26 13:59

    基于STM32的數(shù)據(jù)采集+心率檢測(cè)儀(原理圖、PCB、程序源碼等)

    基于STM32的數(shù)據(jù)采集+心率檢測(cè)儀(原理圖、PCB、程序源碼等) 項(xiàng)目實(shí)例下載! 純分享帖,需要者可點(diǎn)擊附件免費(fèi)獲取完整資料~~~【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,
    發(fā)表于 05-23 20:47

    氣密性檢測(cè)儀校準(zhǔn)規(guī)范詳解

    氣密性檢測(cè)儀是工業(yè)生產(chǎn)中確保產(chǎn)品質(zhì)量和安全性的重要設(shè)備,其準(zhǔn)確性和穩(wěn)定性至關(guān)重要。為了確保氣密性檢測(cè)儀的精度和可靠性,定期校準(zhǔn)是必不可少的步驟。以下是氣密性檢測(cè)儀校準(zhǔn)規(guī)范的詳細(xì)介紹:一、校準(zhǔn)前的準(zhǔn)備
    的頭像 發(fā)表于 03-26 15:54 ?535次閱讀
    氣密性<b class='flag-5'>檢測(cè)儀</b>校準(zhǔn)規(guī)范詳解

    如何使用燈具外殼氣密性檢測(cè)儀?教程來了

    對(duì)于新入手氣密性檢測(cè)儀的用戶來說,掌握正確的使用方法至關(guān)重要。這不僅關(guān)系到檢測(cè)結(jié)果的準(zhǔn)確性,還直接影響到產(chǎn)品的質(zhì)量控制和生產(chǎn)效率。以下是一份詳細(xì)的燈具外殼氣密性檢測(cè)儀使用教程,旨在幫助新手用戶快速
    的頭像 發(fā)表于 03-22 11:55 ?370次閱讀
    如何使用燈具外殼氣密性<b class='flag-5'>檢測(cè)儀</b>?教程來了

    電機(jī)外殼氣密性檢測(cè)儀的使用方法

    在電機(jī)生產(chǎn)過程中,電機(jī)外殼的氣密性至關(guān)重要,它直接影響著電機(jī)的性能和使用壽命。作為氣密性檢測(cè)儀工廠,我們的電機(jī)外殼氣密性檢測(cè)儀能精準(zhǔn)檢測(cè)電機(jī)外殼的氣密性能。下面為您詳細(xì)介紹其使用方法。(1)
    的頭像 發(fā)表于 03-19 14:36 ?348次閱讀
    電機(jī)外殼氣密性<b class='flag-5'>檢測(cè)儀</b>的使用方法

    影響氣密性檢測(cè)儀價(jià)格的5個(gè)因素,你知道幾個(gè)

    氣密檢測(cè)儀是一種用于檢測(cè)產(chǎn)品包裝材料的氣密設(shè)備。該設(shè)備已廣泛應(yīng)用于包裝行業(yè)和食品行業(yè)。氣密檢測(cè)儀的價(jià)格受多種因素影響,下面我將詳細(xì)介紹影響氣密檢測(cè)儀價(jià)格的五個(gè)因素。(1)品牌和產(chǎn)地氣密
    的頭像 發(fā)表于 02-07 11:27 ?439次閱讀
    影響氣密性<b class='flag-5'>檢測(cè)儀</b>價(jià)格的5個(gè)因素,你知道幾個(gè)

    LED顯示屏氣密性檢測(cè)儀的使用小技巧

    LED顯示屏作為現(xiàn)代顯示技術(shù)的核心組件,其穩(wěn)定性和耐用性至關(guān)重要。氣密性檢測(cè)儀作為一種專業(yè)的檢測(cè)設(shè)備,在確保LED顯示屏質(zhì)量方面發(fā)揮著重要作用。本文將詳細(xì)介紹如何正確使用LED顯示屏氣密性檢測(cè)儀
    的頭像 發(fā)表于 01-08 13:36 ?541次閱讀
    LED顯示屏氣密性<b class='flag-5'>檢測(cè)儀</b>的使用小技巧

    恒流焊接實(shí)時(shí)檢測(cè)儀:確保焊接質(zhì)量與安全的關(guān)鍵設(shè)備

    焊接實(shí)時(shí)檢測(cè)儀應(yīng)運(yùn)而生,成為確保焊接質(zhì)量和安全的關(guān)鍵設(shè)備。本文將詳細(xì)介紹恒流焊接實(shí)時(shí)檢測(cè)儀的工作原理、技術(shù)特點(diǎn)及其在實(shí)際應(yīng)用中的重要性。 ### 工作原理 恒流焊
    的頭像 發(fā)表于 01-07 11:43 ?599次閱讀

    汽車水箱氣密性檢測(cè)儀的使用與維護(hù)技巧

    汽車水箱作為車輛冷卻系統(tǒng)的重要組成部分,其氣密性直接關(guān)系到汽車的正常運(yùn)行與安全。汽車水箱氣密性檢測(cè)儀作為一種專業(yè)設(shè)備,能夠高效、準(zhǔn)確地檢測(cè)水箱是否存在泄漏問題。為了確保檢測(cè)儀能夠長(zhǎng)期穩(wěn)定運(yùn)行并發(fā)
    的頭像 發(fā)表于 12-23 14:36 ?569次閱讀
    汽車水箱氣密性<b class='flag-5'>檢測(cè)儀</b>的使用與維護(hù)技巧

    從暴雨到積水,地埋式路面檢測(cè)儀實(shí)時(shí)掌握路面情況

    地埋式路面檢測(cè)儀通過嵌入式傳感器對(duì)路面情況進(jìn)行實(shí)時(shí)監(jiān)測(cè),特別在暴雨、積水等復(fù)雜天氣條件下,能夠幫助交通管理部門實(shí)時(shí)掌握路面狀況,及時(shí)采取措施減少交通事故,提高道路安全性。
    的頭像 發(fā)表于 12-21 10:27 ?548次閱讀
    從暴雨到積水,地埋式路面<b class='flag-5'>檢測(cè)儀</b><b class='flag-5'>實(shí)時(shí)</b>掌握路面情況

    電池箱氣密性檢測(cè)儀使用方案

    電池箱作為儲(chǔ)能設(shè)備的關(guān)鍵部分,其氣密性直接關(guān)系到設(shè)備的安全性和性能。因此,使用電池箱氣密性檢測(cè)儀進(jìn)行定期檢測(cè),是確保設(shè)備質(zhì)量的重要手段。以下是關(guān)于電池箱氣密性檢測(cè)儀的使用方案。首先,在使用前需確保
    的頭像 發(fā)表于 11-08 11:50 ?508次閱讀
    電池箱氣密性<b class='flag-5'>檢測(cè)儀</b>使用方案

    深入解析:汽車水箱氣密性檢測(cè)儀的工作原理與優(yōu)勢(shì)

    氣密性檢測(cè)儀的工作原理基于壓力測(cè)試和泄漏檢測(cè)技術(shù)。測(cè)試過程中,檢測(cè)儀會(huì)對(duì)水箱內(nèi)部施加一定的壓力,并實(shí)時(shí)監(jiān)測(cè)水箱內(nèi)部的壓力變化。若水箱存在泄漏問題,其內(nèi)部壓力將會(huì)有
    的頭像 發(fā)表于 07-23 13:37 ?575次閱讀
    深入解析:汽車水箱氣密性<b class='flag-5'>檢測(cè)儀</b>的工作原理與優(yōu)勢(shì)