医疗手术记录项目最初基于一个面向外科医生的微信云开发小程序。
腾讯为微信云开发小程序提供5GB免费云存储空间,足以满足普通用户个人账户的需求,且云存储具备随时随地访问的特性, 随时随地访问。只要有Wi-Fi和流量,拿起手机,打开微信,即可调用自己的小程序访问、查询和统计私人数据。
通过小程序提供的时段查询功能,您可以轻松快速地查询某年或某月的手术数量。通过小程序的综合查询和统计功能,您可以输入不同的“关键词”来统计某家医院、某位 部分、特定治疗技术 以及其他具体描述。
在手术室中,我们更适合使用STONE系列串口屏,该屏幕为医疗设备提供更安全可靠的显示和控制界面。记录医疗手术笔记
如果我们在手术室中需要输入这些手术内容,手术设备的型号和参数当然更容易获取,甚至可以通过系统共享获取,更加准确,并节省二次录入。当然,此类功能需要在设备预先规划,这里我通过STONE串口屏演示了此微信小程序功能(不涉及数据库和云存储)。
感兴趣的读者还可以通过蓝牙配对,实现系统与手机的数据共享,完成本地数据云存储及云数据下载至本地,通过蓝牙还可实现手机对STONE串口屏的控制,以及屏幕向手机端的反馈等。
该Chat 小程序基于 JavaScript,而 STONE 串口屏项目基于 Arduino ESP32 环境。
STONE 接口的医师手术记录项将按以下方式扩展。
描述
- HMI 和控制创建说明
- 接口下载
- 硬件连接与命令测试
- 调试代码
- 附录:ASCII 码表
1、串口屏HMI与控制创建说明
如图 (2) 所示,通过不同按钮可访问手术记录(图 (3))、时间段查询(图 (5))和综合查询功能(图 (7))。
如图(3)所示,手术记录界面首先通过文本选择控件选择手术时间:年、月、日,然后选择手术部位,接着通过编辑控件填写手术地点、手术所用关键设备及手术描述,完成后点击保存按钮,系统将弹出记录成功界面(如图(4)所示)。
图(2) 电源开启功能界面
图(3)手术记录界面
点击图(4)屏幕上的返回按钮可返回图(2)的功能界面。若选择时间段查询,将进入图(5)界面,在此也可通过文本选择控件选择查询的起始日期和结束日期的年、月、日,然后点击红色按钮进入图(6)的查询结果显示界面。
图(4)记录成功界面
图(5)时间段查询界面
图(6)将显示指定时间段内总共记录的手术数量,并在屏幕中部显示第一例手术的内容,点击“下一例”按钮将依次显示第二例和第三例的内容。这些内容通过ESP32控制表与STONE串口屏通信,传递至标签控件,并通过HScroll_label滚动控件显示。年、月、日及总程序数均为标签控件,其余均为HScroll_label控件,用于滚动显示更多内容。点击“返回”按钮可返回功能界面(图 (2)中的功能界面。若在图(2)中选择综合查询功能,将进入图(7)的界面。
图(6) 时间段查询结果界面
图(7) 综合查询功能界面
在图(7)中,通过编辑输入关键词,点击读取按钮进入图(8)的结果界面,点击返回按钮返回图(2)。
在图(8)中,与图(6)类似,显示与关键词匹配的手术总数,并提供“下一页”按钮以显示所有手术内容。点击“返回”按钮可返回图(2)。
上述涉及编程需求的各界面控件名称、范围及内容以统一方式展示,便于编程时快速查阅。
图(8)集成查询结果界面
编程控件名称。
手术记录界面保存按钮:名称 = b12
手术记录内容文本选择器,名称为: 年 = ts11,月 = ts12,日 = ts13,部位 = ts14
其中。
ts11(2000 – 2099),ts12(1 – 12)月,ts13(1 – 31)日。
ts14(1:左肾;2:右肾;3:左输尿管;4:右输尿管;5:膀胱;6:尿道;7:其他;)
手术记录内容编辑,名称为。
位置 = e11,设备 = e12,描述 = e13
手术时间段查询阅读按钮:名称 = b32
开始日期:年 = ts31,月 = ts32,日 = ts33
结束日期:年 = ts34,月 = ts35,日 = ts36
范围同上。
时间段查询结果下一页按钮:名称 = b42
标签显示名称如下。
年 = l41,月 = l42,日 = l43,总数 = l44
Hscroll 标签显示名称分别如下。
位置 = hl41,设备 = hl42,部分 = hl43,描述 = hl44,期间 = hl45
关键词读取按钮: 名称 = b52,编辑名称 = e51
关键词查询结果 下一页按钮:名称 = b62
标签显示名称如下。
年 = l61,月 = l62,日 = l63,总数 = l64
Hscroll 标签分别显示名称。
位置 = hl61,设备 = hl62,部件 = hl63,描述 = hl64,期间 = hl65
2、接口下载
请参考充电桩项目中的方法 B 成功下载接口。
3. 硬件连接与命令测试
图 (9) 串口助手命令测试 V1.2 适配器板跳线连接图
STONE 软件的新版本正在持续升级和优化,使用过程中发现部分功能与手册描述存在差异,因此在编程前需验证需使用的命令。根据图(9)连接,并通过串口助手检查 STONE 的反馈,验证命令的有效性。
本项目涉及的控制元件包括按钮、标签、HScroll_Label、编辑框和文本选择器,共五种,我们将逐一测试并验证。
按钮相关:
0x1001 按钮键值主动发送
键值(数据段的最后一个字节):
0x01 按下按钮
0x02 释放按钮(按钮触发点击事件完成)
示例:
手术记录屏幕的保存按钮(名称=b12)被按下以主动发送命令。
ST<0x10 0x01 0x00 0x04 b12 0x01>ET
串口助手返回十六进制数据: 验证通过
53 54 3C 10 01 00 04 62 31 32 01 3E 45 54 5C 4F
按钮释放(按钮点击操作完成) 主动命令
ST<0x10 0x01 0x00 0x04 b12 0x02>ET
串口助手返回十六进制数据: 验证通过
53 54 3C 10 01 00 04 62 31 32 02 3E 45 54 18 4F
注:按钮 b12(ASCII 码 0x62 0x31 0x32)。
标签相关:
set_text 设置标签显示的文本
示例:
设置文本:(关键词查询总数 = l64)
ST<{“cmd_code”: “set_text”, “type”: “label”, “widget”: “l64”, ‘text’: “520”}>ET 验证顶部屏幕是否正常
hscroll_label 相关:
set_text 设置 hscroll_label 显示的文本
示例:
设置文本:
ST<{“cmd_code”: “set_text”, “type”: “hscroll_label”, “widget”: “hl61”, “text”: “ShenZhen”}>ET NG
ST<{“cmd_code”: “set_text”, “type”: “label”, “widget”: “hl61”, ‘text’: “ShenZhen”}>ET OK
注意:NG 是手册中给出的命令格式,OK 是本人成功尝试在屏幕上显示时使用的命令格式!这是验证中的重要发现!记录医疗手术笔记
编辑相关:
get_text 获取编辑框中显示的内容
0x1070 编辑文本发布 (主动-被动发送可在编辑数据更改后主动发送,或通过 get_text 主动触发)
文本:“控制名称”:文本内容 数据长度不得超过 1024 字节(冒号后面的文本内容)
示例:
获取文本:(编辑控制名称 = e11,位于手术记录位置)
ST<{“cmd_code”: “get_text”, “type”: “edit”, ‘widget’: “e11”}>ET
串口助手反馈的十六进制数据如下。
53 54 3C 10 70 00 0C 22 65 31 31 22 3A 61 62 63 64 65 66 3E 45 54 20 FF
编辑文本数据以发送命令: 验证 OK
ST< 0x10 0x70 0x00 0x0C “e11”: abcdef >ET e11 文本数据:abcdef
文本选择器相关:
get_text 获取文本选择器的当前文本
get_value 获取文本选择器的当前值
get_selected 获取文本选择器当前选中项的序列号(获取当前选中项的序列号)
0x1080 文本选择器文本下行 (被动发送,MCU使用get_text主动获取)
0x1081 文本选择器值发送 (整数类型,主动/被动发送:MCU使用get_value命令获取)
0x1082 文本选择器序列号发送 (整数类型 被动:MCU 使用 get_selected 命令获取)
数据格式:
文本文本:“控制名称”:文本内容 长度不超过 1024 字节(控制名称后跟数字的文本内容)
值值:数据段的最后四个字节
索引值:数据段的最后四个字节
示例 1:(现场控制名称为 ts14,当前程序记录为 “1:left renal;”,序列号为 0)
获取文本选择器 t14 的当前文本:
ST<{“cmd_code”: “get_text”, “type”: “text_selector”, ‘widget’: “ts14”}>ET
串口助手反馈的十六进制数据为。
53 54 3C 10 80 00 11 22 74 73 31 34 22 3A 6C 65 66 74 20 72 65 6E 61 6C 3E 45 54 F1 FE
屏幕上显示的指令为。
ST< 0x10 0x80 0x00 0x11 “ts14”:left renal >ET ts14 文本数据: 左肾正常
获取文本选择器 t14 的当前值:
ST<{“cmd_code”: “get_value”, “type”: “text_selector”, ‘widget’: “ts14”}>ET
串行助手反馈的十六进制数据为。
53 54 3C 10 81 00 08 74 73 31 34 00 00 00 01 3E 45 54 DE CA OK
屏幕上显示的指令为。
ST<0x10 0x81 0x00 0x08 ts14 0x00 0x00 0x00 0x00 0x01 >ET ts14 当前值数据:1
获取文本选择器 t14 的当前序列号:
ST<{“cmd_code”: “get_selected”, “type”: “text_selector”, ‘widget’: “ts14”}>ET
串行助手反馈的十六进制数据为:(ts14 为 “1:left renal;”,序列号为 0)
53 54 3C 10 82 00 08 74 73 31 34 00 00 00 00 3E 45 54 21 C8 OK
屏幕上显示的指令为。
ST<0x10 0x82 0x00 0x08 ts14 0x00 0x00 0x00 0x00 0x00 0x00 >ET ts14 当前序列号:0
注:ts14 的选项为。
1:左肾;2:右肾;3:左输尿管;4:右输尿管;5:膀胱;6:尿道;7:其他;
*** 该代码使用 get_value 获取数值,并使用 get_selected 获取当前选中项的序列号(从 0 开始)。
示例 2:(手术记录名称的年份控制,选项:2000-2099,当前值:2022)
获取文本选择器 t11 的当前文本:
ST<{“cmd_code”: “get_text”, “type”: “text_selector”, ‘widget’: “ts11”}>ET
序列号助手反馈的十六进制数据为: (ts11 是 2022)
53 54 3C 10 80 00 0B 22 74 73 31 31 22 3A 32 30 32 32 3E 45 54 D7 37
屏幕上显示的指令为:
ST< 0x10 0x80 0x00 0x0B “ts11”:2022 >ET ts11 当前文本:2022 OK
获取文本选择器 t11 的当前值:
ST<{“cmd_code”: “get_value”, “type”: “text_selector”, ‘widget’: “ts11”}>ET
串口助手反馈的十六进制数据为。
53 54 3C 10 81 00 08 74 73 31 31 00 00 07 E6 3E 45 54 95 89 OK
屏幕上显示的指令为。
ST<0x10 0x81 0x00 0x08 ts11 0x00 0x00 0x07 0xE6 >ET ts11的当前值:2022 = 7E6
获取文本选择器t11的当前序列号:
ST<{“cmd_code”: “get_selected”, “type”: “text_selector”, ‘widget’: “ts11”}>ET
串口助手反馈的十六进制数据为: (0x16 = 22)
53 54 3C 10 82 00 08 74 73 31 31 00 00 00 16 3E 45 54 56 0C OK
屏幕上显示的指令为:
ST<0x10 0x82 0x00 0x08 ts11 0x00 0x00 0x00 0x00 0x16 >ET ts11 当前串口编号:0x16 = 22
通过上述命令测试后,下一步是编程外科医生记录、查询和统计功能。当然,首先仍需确保硬件连接。我们使用ESP32开发板实现与STONE串口屏幕的通信。
如图(10)所示,NodeMCU-32S开发板的TX0、RX0和GND引脚需与STONE屏幕适配器板的对应引脚连接,详见图 (11)所示,以完成人机界面(HMI)信息交互。STONE屏幕接口为232信号,通过V1.2适配器板进入MCU接口时需转换为TX、RX信号,以实现电平匹配。图 (11) 显示 NodeMCU-32S 开发板位于左侧,蓝色(TX0)和红色(RX0)导线连接至 V1.2 适配器板的跳线位置(移除蓝色跳线后),黑色导线连接至 GND。
图(10) NodeMCU-32S开发板的TX0和RX0位置示意图
图(11) NodeMCU-32S开发板与V1.2适配器板的通信连接示意图
4、调试代码
由于空间限制,本项目重点在于按钮解码及查询统计编程。关于系统规划前的记录输入或数据共享,或手机蓝牙导入等细节解码,在此不做展开。以下收集的程序代码已验证,具体运行效果请参考视频。记录医疗手术笔记
/*
Frank for Doctor T in 2022.05.01
use ESP32 of NodeMCU-32s in arduino 1.8.13
use STONE HMI in shenzhen
*/
//------Doctor T use----------2022.05.01------
int iSave = 0; // 1 = save key is true, 0 = save key is false.
int iReadTime = 0; // 1 = read time find is true, 0 = false.
int iNextTime = 0; // 1 = read time next is true, 0 = false.
int iReadWord = 0; // 1 = read word find is true, 0 = false.
int iNextWord = 0; // 1 = read word next is true, 0 = false.
int yearStart,monthStart,dayStart,yearEnd,monthEnd,dayEnd; //int (-32768,32767) unsigned int(0,65535)
String iwordIn,iwordBuf; // note: S is big of s.
int years[10],months[10],days[10];
String locations[10],equipments[10],parts[10],descriptions[10];
int totalTime,totalWord;
int iNumRecord = 0; // record num!
int nowNumWord = -1; //
int nowNumTime = -1; //
int i3;
int LED_blue = 2; // IO2, turn the LED on (HIGH is the voltage level)
int ii = 0;
int iii = 0;
//------------
unsigned int time_1s=0;
unsigned int time_1m=0;
unsigned int time_1h=0;
void setup() {
Serial.begin(115200);
pinMode(LED_blue, OUTPUT);
}
void loop() {
int inChar;
// Read the information sent by the serial port and simply decode it:
if (Serial.available() > 0) {inChar = Serial.read();}
if (inChar == 0x62)
{
if (Serial.available() > 0){inChar = Serial.read();}
if (inChar == 0x31) {
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x32)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x02)
{
iSave = 1; //62 31 32 02 is save key ok!
iReadWord = 0;
iReadTime = 0;
iNextWord = 0;
iNextTime = 0;
}
}
} else if (inChar == 0x33)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x32)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x02)
{
iReadWord = 0;
iReadTime = 1; //62 33 32 02 is time read key ok!
iNextWord = 0;
iNextTime = 0;
i3 = 0;
totalTime = 0;
nowNumTime = 0;
}
}
} else if (inChar == 0x34)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x32)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x02)
{
iNextWord = 0;
iNextTime = 1; //62 34 32 02 is time Next key ok!
}
}
} else if (inChar == 0x35)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x32)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x02)
{
iReadWord = 1; //62 35 32 02 is word read key ok!
iReadTime = 0;
iNextWord = 0;
iNextTime = 0;
i3 = 0;
totalWord = 0;
nowNumWord = 0;
}
}
} else if (inChar == 0x36)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x32)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x02)
{
iNextWord = 1; //62 36 32 02 is word find Next key ok!
iNextTime = 0;
}
}
}
}
//-------------test------begin----------------
years[0]=2021;
months[0]=1;
days[0]=1;
locations[0]="ShenZhen PinLe";
equipments[0]="holmic laser light";
parts[0]="left renal";
descriptions[0]="0.6cm";
years[1]=2021;
months[1]=2;
days[1]=2;
locations[1]="ShenZhen PinLe";
equipments[1]="holmic laser light";
parts[1]="right renal";
descriptions[1]="0.8cm";
iNumRecord = 2;
yearStart = 2021;
monthStart = 1;
dayStart = 1;
yearEnd = 2022;
monthEnd = 5;
dayEnd = 1;
iwordIn = "left";
//-------------test-----end-----------------
if(iReadTime == 1) // the time find!
{
iReadTime = 0;
for(int i = 0; i < iNumRecord; i++) // look totalTime
{
if(yearEnd > years[i] && years[i] > yearStart){
totalTime += 1;
if(nowNumTime == -1){ nowNumTime = i; }
}
else if(yearEnd == years[i]){
if(months[i] < monthEnd)
{
totalTime += 1;
if(nowNumTime == -1){ nowNumTime = i; }
}
else if(months[i] == monthEnd && days[i] <= dayEnd)
{
totalTime += 1;
if(nowNumTime == -1){ nowNumTime = i; }
}
}
else if(years[i] == yearStart)
{
if(months[i] > monthStart){
totalTime += 1;
if(nowNumTime == -1){ nowNumTime = i; }
}
else if(months[i] == monthStart && days[i] >= dayStart){
totalTime += 1;
if(nowNumTime == -1){ nowNumTime = i; }
}
}
}
if(nowNumTime >= 0)
{
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l41\",\"text\":\"");
Serial.print(years[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l42\",\"text\":\"");
Serial.print(months[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l43\",\"text\":\"");
Serial.print(days[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l44\",\"text\":\"");
Serial.print(totalTime);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl41\",\"text\":\"");
Serial.print(locations[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl42\",\"text\":\"");
Serial.print(equipments[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl43\",\"text\":\"");
Serial.print(parts[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl44\",\"text\":\"");
Serial.print(descriptions[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl45\",\"text\":\"");
Serial.print(String(yearStart)+"." +String(monthStart)+"." +String(dayStart)+"--"+String(yearEnd)+"." +String(monthEnd)+"." +String(dayEnd));
Serial.println("\"}>ET");
}
}
if(iNextTime == 1 && nowNumTime >= 0 )
{
int i4 = nowNumTime + 1;
iNextTime = 0;
for(int i = i4; i < iNumRecord; i++) // look Next
{
if(yearEnd > years[i] && years[i] > yearStart){
if(nowNumTime < i4){ nowNumTime = i; }
}
else if(yearEnd == years[i]){
if(months[i] < monthEnd)
{
if(nowNumTime < i4){ nowNumTime = i; }
}
else if(months[i] == monthEnd && days[i] <= dayEnd)
{
if(nowNumTime < i4){ nowNumTime = i; }
}
}
else if(years[i] == yearStart)
{
if(months[i] > monthStart){
if(nowNumTime < i4){ nowNumTime = i; }
}
else if(months[i] == monthStart && days[i] >= dayStart){
if(nowNumTime < i4){ nowNumTime = i; }
}
}
}
if(nowNumTime >= i4)
{
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l41\",\"text\":\"");
Serial.print(years[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l42\",\"text\":\"");
Serial.print(months[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l43\",\"text\":\"");
Serial.print(days[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l44\",\"text\":\"");
Serial.print(totalTime);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl41\",\"text\":\"");
Serial.print(locations[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl42\",\"text\":\"");
Serial.print(equipments[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl43\",\"text\":\"");
Serial.print(parts[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl44\",\"text\":\"");
Serial.print(descriptions[nowNumTime]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl45\",\"text\":\"");
Serial.print(String(yearStart)+"." +String(monthStart)+"." +String(dayStart)+"--"+String(yearEnd)+"." +String(monthEnd)+"." +String(dayEnd));
Serial.println("\"}>ET");
}
}
if(iReadWord == 1) // the word find!
{
iReadWord = 0;
for(int i = 0; i < iNumRecord; i++) // look totalWord
{
if(locations[i].indexOf(iwordIn) >= 0 || equipments[i].indexOf(iwordIn) >= 0 )
{
totalWord += 1;
if(nowNumWord == -1){ nowNumWord = i; }
} else if(parts[i].indexOf(iwordIn) >= 0 || descriptions[i].indexOf(iwordIn) >= 0)
{
totalWord += 1;
if(nowNumWord == -1){ nowNumWord = i; }
}
}
if(nowNumWord >= 0)
{
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l61\",\"text\":\"");
Serial.print(years[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l62\",\"text\":\"");
Serial.print(months[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l63\",\"text\":\"");
Serial.print(days[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l64\",\"text\":\"");
Serial.print(totalWord);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl61\",\"text\":\"");
Serial.print(locations[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl62\",\"text\":\"");
Serial.print(equipments[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl63\",\"text\":\"");
Serial.print(parts[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl64\",\"text\":\"");
Serial.print(descriptions[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl65\",\"text\":\"");
Serial.print(iwordIn);
Serial.println("\"}>ET");
}
}
if(iNextWord == 1 && nowNumWord >= 0 )
{
int i5 = nowNumWord + 1;
iNextWord = 0;
for(int i = i5; i < iNumRecord; i++) // look Next
{
if(locations[i].indexOf(iwordIn) >= 0 || equipments[i].indexOf(iwordIn) >= 0 ){
if(nowNumWord < i5){ nowNumWord = i; }
}
else if(parts[i].indexOf(iwordIn) >= 0 || descriptions[i].indexOf(iwordIn) >= 0)
{
if(nowNumWord < i5){ nowNumWord = i; }
}
}
if(nowNumWord >= i5)
{
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l61\",\"text\":\"");
Serial.print(years[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l62\",\"text\":\"");
Serial.print(months[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l63\",\"text\":\"");
Serial.print(days[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l64\",\"text\":\"");
Serial.print(totalWord);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl61\",\"text\":\"");
Serial.print(locations[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl62\",\"text\":\"");
Serial.print(equipments[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl63\",\"text\":\"");
Serial.print(parts[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl64\",\"text\":\"");
Serial.print(descriptions[nowNumWord]);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl65\",\"text\":\"");
Serial.print(iwordIn);
Serial.println("\"}>ET");
}
}
//--time ++ ------
ii = ii + 1;
if(ii > 29){
time_1s = time_1s + 1;
ii = 0;
if(iii == 0){
digitalWrite(LED_blue, HIGH);
iii = 1;
}else{
iii = 0;
digitalWrite(LED_blue, LOW);
}
}
if(time_1s >= 60){
time_1s = 0;
time_1m = time_1m + 1;
if(time_1m >= 60){
time_1m = 0;
time_1h = time_1h + 1;
}
}
delay(10);
}
Query Description.
The combined query's include keyword determines the use of the String object's indexOf() method (the position of a string within another string!)
Syntax: string.indexOf(val)
string.indexOf(val, from)
Parameters: string: A variable of type String
val: the value to search for - char or String
from: the index to start the search from
Return value: the position in which, otherwise -1
Example:
stringOne = "<HTML><HEAD><BODY>";
int bodyTag = stringOne.indexOf("<BODY>");
记录医疗手术笔记:
如在开发过程中遇到任何问题,请在我们的询盘表单下咨询