便携式显示器 STONE 串行触摸屏和 ESP32

运用 STONE 串口触摸屏便携监护仪,硬件部门决定采用NXP的32位微处理器芯片作为整机监测、心电分析、控制中心,通过心电生物电采集放大、右腿驱动、导入MIT心电数据库做算法,但是还可监测SpO2传感器电信号、血压、呼吸电信号放大、滤波处理,通过高速波特率通讯,驱动 STONE 串行 触摸 屏幕 实时显示波形和参数变化,并与参考值比较判断,监测和报警人体参数变化。 如果有范围偏差,它会自动发出语音提示。

新版本的 STONE 串口触摸屏完美支持曲线描绘和显示,通讯协议简单易记,单片机工程师阅读手册后即可使用,命令集中有很多驱动示例,直接复制修改名称和参数即可使用。 串口连接简单,可以使用官方转接板,无论是直接串口还是USB转串口,都非常方便好用。 显示器同时显示多组生命参数,尤其是动态绘制的3条曲线,同时显示非常流畅,应该可以同时绘制多组曲线图形,可以根据需要尝试. 当然命令集曲线功能有多个数据同时推送的例子,但是目前硬件实际使用没有反应,希望官方能尽快优化。 也可以通过更新固件来解决。 对于这个新版的绘制曲线功能,我先试了下怎么调不出来,最后得知串口屏有新固件,刷了新固件看看“山真面目”。 看到刷完固件的串口屏出来的流畅心电曲线,心情好开心,呵呵……

本项目设计图如图(1)所示。 该界面基于 STWI101WT-01 分辨率为1024*600的串口屏,左侧显示2/3波形曲线,右侧1/3显示数值。

本文将重点介绍曲线图视图的创建和描绘。 完全按照项目demo的制作流程,没有分类,可能你会觉得乱七八糟,但它是真实开发的真实流程。

首先,我们决定修复心电图的曲线描绘。

 

图(1)项目设计预期界面
图(1)项目设计预期界面

本演示模拟75bpm的心率,相当于800ms的心跳,即每40ms一个点,每20点一个周期,基于整个图表视图控制X轴等分100等份,每屏4s波形,屏幕刷新速率25Hz,看起来很流畅。 此图表视图控件的线系列元素设置为smooth = false(ECG 波形锐利),不显示下包络线,也不显示点标记。 区域。 这里看图(4),Y轴为min=0,max=140,程序中给出的最大值为130,范围比较满。 图表视图2及其元素X轴7、Y轴1、条形系列1、线型系列2设置的其他参数见图(1)-图(1)。 我们选择透明 rgba(0,0,0,0) 作为图表视图控件的 bg 颜色,它显示了基色(黑色),其他控件,例如视图,具有相同的特性。

图(2)图表视图1的属性设置
图(2)图表视图1的属性设置
图(3)图表view1的X轴1属性设置
图(3)图表view1的X轴1属性设置
图(4)图表视图1的Y轴1属性设置
图(4)图表视图1的Y轴1属性设置
图(5)图表view1的bar series1属性设置
图(5)图表view1的bar series1属性设置
图(6)图表view1的line series111属性设置
图(6)图表view1的line series111属性设置
图(7)图表视图1的line series12属性设置
图(7)图表视图1的line series12属性设置

根据以上设置模拟心电波形(75bpm)的编程代码如下。

首先,定义两个变量如下。

  Int num19_1 = 0;
  Int num19_2 = 0;
Then generally in the main loop main.c, the ECG curve is depicted by the following code.
  delay(10);   
  
  num19_1 += 1;
  if(num19_1 >= 4){ // Draw one point every 40ms.
    num19_1 = 0;
    num19_2 += 1;
    if(num19_2 == 3){
      Serial.println("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series1\",\"mode\":\"push\",\"value\" :10}>ET");
    }else if(num19_2 == 4){
      Serial.println("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series1\",\"mode\":\"push\",\"value\" :130}>ET");
    }else{
      Serial.println("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series1\",\"mode\":\"push\",\"value\" :40}>ET");
    }
    if(num19_2 >= 20){  //every 20 data is a cycle
      num19_2 = 0;
    }
  }

然后你要处理 CO2 曲线,重点是扫描同步。

 

该项目的 3 条曲线,图表视图 2 用于 SpO2 血氧传感器,图表视图 3 用于 CO2 呼吸。

Chart view2,chart view3 X轴均设置min = 0,max = 100,和ECG chart view1一样,曲线扫描保持同步,chart view2 Y轴2 max = 100,所以编写程序的Y轴值给出最大为 95,算法如以下程序代码所示。

First, define 3 variables as follows.
Int num19_3 = 0;
Int num19_4 = 0;
Int num19_5 = 0;
The CO2 curve is then generally depicted in the main loop, main.c, by the following code.
num19_3 += 1;
if(num19_3 >= 4){ //one point every 40ms
num19_3 = 0;
num19_4 += 1;
if(num19_4 <= 10){
num19_5 = num19_4*9; //the first 10 points increase linearly
Serial.print("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series3\",\"mode\":\"push\",\"value\":" );
Serial.print(num19_5);
Serial.println("}>ET");
}else if(num19_4 <= 40){ // the last 30 points decrease linearly
num19_5 = 95 - (num19_4 - 10)*3;
Serial.print("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series3\",\"mode\":\"push\",\"value\":" );
Serial.print(num19_5);
Serial.println("}>ET");
}else{
num19_4 = 0;
Serial.println("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series3\",\"mode\":\"push\",\"value\" :5}>ET");
} }

图(8)顶部为心电图波形,底部为CO2波形(符号圆半径=4)
图(8)顶部为心电图波形,底部为CO2波形(符号圆半径=4)
图(9)顶部为心电图波形,底部为CO2波形(符号圆半径=30)
图(9)顶部为心电图波形,底部为CO2波形(符号圆半径=30)

下面图(2)中的CO8波形是上面程序在line series4属性符号round radius=3时的效果。 我们尝试修改symbol round radius = 30,希望曲线过渡更圆润,但测试结果与图(8)没有区别,见图(9),可见点越密集时,圆角效果不明显。 这只能通过改变点坐标来实现。

图 (10) 坐标分隔轴
图 (10) 坐标分隔轴

我们通过图(3)来看看图(10)中X轴的属性。 在图(3)中,当show = true为分割线时,会显示长竖条(分隔条); 当 show = true for line 时,将显示 X 轴的水平线(如顶部图表视图底部的水平线); 当 show = true 为 tick 时,将显示 X 轴水平线下方的刻度细线; 当label为show = true时,将显示X轴水平线下方的数字(数据中填写的值)。 = true,它将显示X轴水平线下方的数字(数据中填写的值)。 就这样。

现在它下降到 SpO2 曲线并决定使用 AD 转换。

曲线模拟使用 ESP32 ADC,12位,满量程4096。图表视图2 Y轴最大值=255,ADC读入值除以20,可以满足曲线显示。 满量程SPO2显示为100%,所以在label20中可以显示ADC读入的值除以2.55再除以2,程序由于是整数运算,算法修正,请看实际测试好的程序代码。 使用Arduino中的analogRead(32)函数直接读取ESP32的GPIO4(也叫ADC-CH32)的AD转换值。 测试可以通过电位器进行,也可以简单的将ADC-CH4脚接GND,接+3.3V,接+5V,或者悬垂看干扰波形,看视频效果(接地时显示低,接+3.3V、+5V同为高全幅,悬垂为杂散曲线),右侧label2控件适时显示ADC电压变化。 代码和算法代码如下。

//--------ADC-------
int adcPin = 32; // GPIO32, also ADC-CH4
int adcValue = 0;
int num19_6 = 0;
 delay(10);   
 adcValue = analogRead(adcPin); // Read in the value of the AD conversion
 adcValue = adcValue/20;
  //-----SPO2 curve plotting ------
  num19_6 += 1;
  if(num19_6 >= 4){ // one point every 40ms
    num19_6 = 0;
        Serial.print("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series2\",\"mode\":\"push\",\"value\":" );
    Serial.print(adcValue);
    Serial.println("}>ET");      
    adcValue = (adcValue*10)/21;
        Serial.print("ST<{\"cmd_code\":\"set_value\",\"type\":\"label\",\"widget\":\"label2\",\"value\":");
    Serial.print(adcValue);
    Serial.println("}>ET");      
  }

图(11)实际完成的3组曲线部分
图(11)实际完成的3组曲线部分

实物图的局部截图见图(11),电脑中的设计界面见图(12)。 如图(3),当图表view2的X轴2的分割线show=false时,图(2)中间黄色SPO12区域的分隔条会关闭显示(如实图片); 视频显示的平滑波形完全可以像实时示波器一样完成。

图(12)计算机完成的3组曲线
图(12)计算机完成的3组曲线

参考点

  • 的结构 STONE 设计器平台图表视图控件如图(13)所示。 官方用户手册8.1中有详细说明,包括各个属性和参数的说明; 指令集4.24给出了数据推送的方法,见图(14),这里有程序中用到的指令示例。
图(13)曲线控件的图表视图结构
图(13)曲线控件的图表视图结构
图(14)曲线控件图表视图使用说明
图(14)曲线控件图表视图使用说明

2. Arduino的analogRead()读取函数进行模拟AD转换。 在Arduino 1.8.13版本菜单“Help”—“Reference”—“learning”—“Analog I/O”中,可以看到analogRead()函数的说明如下。

AnalogRead()

详情描述

Arduino 板包含一个 6 通道(Mini 和 Nano 上 8 个通道,Mega 上 16 个)、10 位模数转换器。 这意味着它将 0 到 5 伏之间的输入电压映射为 0 到 1023 之间的整数值。这会产生 5 伏/1024 单位或每单位 0049 伏 (4.9 mV) 的读数之间的分辨率。 类比参考 ()。

读取模拟输入大约需要 100 微秒(0.0001 秒),因此最大读取速率约为每秒 10,000 次。

句法

模拟读取(引脚)

参数

pin:要读取的模拟输入引脚的数量(大多数板上为 0 到 5,Mini 和 Nano 上为 0 到 7,Mega 上为 0 到 15)

退货须知

整数(0 到 1023)

备注

如果模拟输入引脚未连接任何东西,则由analogRead() 返回的值将根据许多因素(例如其他模拟输入的值、您的手离电路板的距离等)而波动。

但请注意,这里 ESP4 的 ADC-CH32 为 12 位,返回值将是 0 到 4096。更多详细信息请参考原文章中的相关链接和 ESP32 手册。

stone_tft_lcd_module_touch_screen_display_hmi_display (23)

stone_tft_lcd_module_touch_screen_display_hmi_display (23)

滚动到顶部