迪文科技论坛

 找回密码
 立即注册
搜索
查看: 124|回复: 0

【2023.2.18获奖项目】七条波形心电监护仪

[复制链接]

567

主题

167

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11978
发表于 2024-1-11 09:21:29 | 显示全部楼层 |阅读模式
【开源】七条波形心电检测仪

1.背景介绍
迪文屏的波形一共拥有8个通道,最近刚好有测试项目要用到七个通道,正好就做一下项目的模板,设计了一款七条波的心电监护仪。

2.方案设计
首先是系统的整体框架设计,最近迷上了ESP32,所以想借用一下ESP32作为和迪文屏通信的中间桥梁,整体框架如下图1所示。



图1 整体框架

3.通讯方式
那么迪文屏和ESP32采用什么通信呢?当然是串口,ESP32和手机/PC采用HTTP通信。硬件间的通信如下图2所示。


图2 硬件间的通信

4.DGUS开发
(1)首先准备素材,这里主要是一个背景图和报警时的图像,如下图3和4所示。



图3 背景图

图4 报警背景

(2)之后就开始在迪文软件上进行设计,心电波形采用【动态曲线】控件,电池电量显示采用【基本图形控件】,其余均采用【文本显示】控件,设计完如下图5所示。


图5 设计结果

5.程序代码设计
之后编写ESP32的WEB网页,设计报警显示、心电波形的数据显示及其他生命体征的显示逻辑。
这里有一个设计事项,本来想直接通过8283让屏幕显示波形,但是屏幕波形有七条,且刷新速率较快,所以我自定义了一个84协议,代码如下。

  1. <font size="3" face="宋体">void ReceiveDate3()
  2. {                        
  3.         u8 N=0;        bit Flog=1;
  4.         while(Flog)
  5.         {               
  6.                 if((R_u3[N]==DTHD1)&&(R_u3[N+1]==DTHD2))   //5A A5 07 82 1000 0001 0002
  7.                 {            
  8.                         if(R_u3[N+3]==0x82)     
  9.                         {           
  10.                                 u8 i=0;
  11.                                 for(i=0;i<((R_u3[N+2]-3)/2);i++)
  12.                                 Write_Dgus(((R_u3[N+4]<<8)+R_u3[N+5]+i),((R_u3[N+6+2*i]<<8)+R_u3[N+7+2*i]));
  13.                         }                                                                   // 0         1        2  3  4        5  6  7        8  9 10
  14.                         else if(R_u3[N+3]==0x83)                    //5A A5 08 83 1000 02 0001 0002
  15.                         {            
  16.                                 u8 i=0;u16 Temp=0;
  17.                                 for(i=0;i<R_u3[N+6];i++)
  18.                                 {
  19.                                         Temp=Read_Dgus(((R_u3[N+4]<<8)+R_u3[N+5]+i));
  20.                                         R_u3[N+7+2*i]=(u8)(Temp>>8);
  21.                                         R_u3[N+8+2*i]=(u8)(Temp);
  22.                                 }
  23.                                 R_u3[N+2]=(2*R_u3[N+6])+4;
  24.                                 for(i=0;i<(R_u3[N+2]+3);i++)
  25.                                 OneSendData3(R_u3[N+i]);
  26.                         }
  27.                         else if(R_u3[N+3]==0x84 && R_u3[N+2] == R_CN3-3)
  28.                         {
  29.                                 u16 y0, y1, y2, y3, y4, y5, y6;
  30.                                 y0 = R_u3[N+4];
  31.                                 y1 = R_u3[N+5];
  32.                                 y2 = R_u3[N+6];
  33.                                 y3 = R_u3[N+7];
  34.                                 y4 = R_u3[N+8];
  35.                                 y5 = R_u3[N+9];
  36.                                 y6 = R_u3[N+10];
  37.                                 t5l_write_chart(0, y0, y1, y2, y3, y4, y5, y6);
  38.                         }
  39.                         N++;
  40.                 }
  41.                 if(N<(R_CN3-4))
  42.                         N++;
  43.                 else            
  44.                         Flog=0;
  45.         }
  46. }

  47. //=======================================
  48. #define CHART_ADDR        0x0310
  49. #define POINT_NUM        0x01
  50. #define CHART_NUM        0x07

  51. void t5l_write_chart(u8 chart_id, u16 y1, u16 y2, u16 y3, u16 y4, u16 y5, u16 y6, u16 y7)
  52. {
  53.         u8 chart_cmd[4 + 2 * CHART_NUM + CHART_NUM*POINT_NUM*2] = {0x5A, 0xA5, CHART_NUM, 0x00};

  54.         chart_cmd[4] = chart_id;
  55.         chart_cmd[5] = POINT_NUM;
  56.         chart_cmd[6] = (u8)(y1 >> 8);
  57.         chart_cmd[7] = (u8)(y1);
  58.         chart_cmd[8] = chart_id+1;
  59.         chart_cmd[9] = POINT_NUM;
  60.         chart_cmd[10] = (u8)(y2 >> 8);
  61.         chart_cmd[11] = (u8)(y2);
  62.         chart_cmd[12] = chart_id+2;
  63.         chart_cmd[13] = POINT_NUM;
  64.         chart_cmd[14] = (u8)(y3 >> 8);
  65.         chart_cmd[15] = (u8)(y3);
  66.         chart_cmd[16] = chart_id+3;
  67.         chart_cmd[17] = POINT_NUM;
  68.         chart_cmd[18] = (u8)(y4 >> 8);
  69.         chart_cmd[19] = (u8)(y4);
  70.         chart_cmd[20] = chart_id+4;
  71.         chart_cmd[21] = POINT_NUM;
  72.         chart_cmd[22] = (u8)(y5 >> 8);
  73.         chart_cmd[23] = (u8)(y5);
  74.         chart_cmd[24] = chart_id+5;
  75.         chart_cmd[25] = POINT_NUM;
  76.         chart_cmd[26] = (u8)(y6 >> 8);
  77.         chart_cmd[27] = (u8)(y6);
  78.         chart_cmd[28] = chart_id+6;
  79.         chart_cmd[29] = POINT_NUM;
  80.         chart_cmd[30] = (u8)(y7 >> 8);
  81.         chart_cmd[31] = (u8)(y7);

  82.         //写入命令
  83.         write_dgusii_vp(CHART_ADDR, chart_cmd, 2 + CHART_NUM + CHART_NUM * POINT_NUM);
  84. }</font>
复制代码

6.效果展示
将文件页面下载到迪文屏幕中,ESP32代码也下载到开发板上,迪文屏开机时的页面如下所图6所示。


图6 开机界面




使用手机连接ESP32服务器,迪文屏界面显示如下图7所示。



图7 连接手机后迪文屏界面

使用手机打开报警选项,对应的超标参数就会出现黄色或红色的背景闪烁,如下图8所示。


图8 报警状态
7.结论
该设计也体验了迪文屏的超强性能,能够如此流畅的显示7条波形还是非常厉害的,采用ESP32控件是为了能够更好的在不同的终端下进行对迪文屏的控制。大家可以在该基础上进行扩展。





备注说明:如需源码,请参考此链接:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=7516&highlight=%E7%9B%91%E6%8A%A4%E4%BB%AA&_dsign=44e7eef7





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-24 08:35 , Processed in 0.065376 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表