简要
目前,我需要使用Arduino Uno和STONE HMI来完成一个医疗呼吸机项目。
STONE HMI串口显示屏,非常适合呼吸机的显示屏。此外,我需要一个单片微控制器来处理STONE HMI屏幕发出的指令,并实时上传一些波形数据。 在此,我选择了一款更通用且易于使用的单片机——Arduino UNO单片机,该设备广泛应用且支持众多库文件。
以下将详细描述Arduino Uno STONE HMI医疗呼吸机项目的开发流程
效果图如下:
在本项目中,您可以通过STONE HMI串口屏幕控制Arduino UNO开发板,并通过串口通信实现数据命令交互。Arduino Uno开发板可上传一系列波形数据并在串口屏幕上显示。该项目对制作呼吸机智能屏具有重要参考价值。
ARDUINO UNO STONE HMI医疗呼吸机项目概述
我在此开发的呼吸机项目在通电后将显示启动动画效果,随后进入启动初始化界面并显示“打开”字样。点击后触发语音提示,提示打开呼吸机,并跳转至页面选择界面。该界面将显示动画效果,展示人体呼吸过程,并提供两个选项:第一个是呼吸波形监测图表。第二种是氧饱和度和呼吸频率监测图表。如何同时显示多个波形图是需要解决的问题。点击确认后,STONE HMI 将发送特定指令控制 MCU 开始上传波形数据。
功能说明:
- 实现按钮设置;
- 实现语音功能;
- 实现页面切换;
- 实现实时波形传输。
项目所需模块:
- STONE TFT LCD;
- Arduino Uno 模块;
- 语音播放模块。
项目模块图:
硬件介绍与原理
扬声器
由于 STONE HMI 具备音频驱动器并预留了对应接口,可使用最常见的磁铁扬声器(即普通扬声器)。扬声器是一种将电信号转换为声信号的换能器。扬声器的性能对声音质量有很大影响。扬声器是音频设备中最薄弱的组件,对于音频效果而言,它是最重要的组件。扬声器种类繁多,价格差异较大。音频电能通过电磁、压电或静电效应,使纸盆或振膜振动并与周围空气共振(共鸣)产生声音。
STONE STVC101WT-01
- 1英寸 1024×600 工业级 TFT 面板和 4 线电阻式触摸屏;
- 亮度为 300cd/m²,LED 背光;
- RGB色彩为65K;
- 可视区域为7mm × 125.3mm;
- 可视角度为70°/70°/50°/60°;
- 工作寿命为20000小时。32位Cortex-M4 200Hz CPU;
- CPLD EPM240 TFT-LCD控制器;
- 128MB(或1GB)闪存;
- USB接口(U盘)下载;
- STONE工具箱软件用于图形用户界面设计,简单强大的十六进制指令。
STONE HMI基本功能
- 触摸屏控制/显示图像/显示文本/显示曲线/读写数据/播放视频和音频。适用于各种行业。
- UART接口为RS232/RS485/TTL;
- 电压范围:6V-35V;
- 功耗:0W;
- 工作温度:-20℃ / +70℃;
- 环境湿度:60% 至 90%。
STVC101WT-01 LCD 模块通过串口与 MCU 通信,本项目中需使用该模块。只需通过上层计算机的菜单栏选项将设计的UI图片添加到按钮、文本框、背景图片及页面逻辑中,生成配置文件,最后将其下载至显示屏运行。
除数据手册外,还提供用户手册、常用开发工具、驱动程序、部分简单示例程序、视频教程及测试项目文件。
Arduino UNO
参数
- 型号 Arduino Uno
- 微控制器 atmega328p
- 工作电压 5 V
- 输入电压(推荐) 7-12 V
- 输入电压(限制) 6-20 V
- 数字 I/O 引脚 14
- PWM 通道 6
- 模拟输入通道(ADC) 6
- 每个 I/O 的直流输出 20 mA
- 3V 端口输出容量 50 mA
- 闪存 32 KB(其中 5 KB 用于引导程序)
- SRAM 2 KB
- EEPROM 1 KB
- 时钟频率 16 MHz
- 板载 LED 引脚 13
- 长度6 mm
- 宽度4 mm
- 重量 25 g
开发步骤
Arduino UNO
Download IDE Link: https://www.arduino.cc/en/Main/Software
这里,因为我的电脑是Win10,我选择第一个并点击
仅下载
安装Arduino
下载后双击安装。需要注意的是,Arduino IDE依赖于Java开发环境,需要在电脑上安装Java JDK并配置环境变量。如果双击启动失败,可能是电脑未安装JDK。
代码
在此处需设置命令以识别串口界面,具体为:
Enterbreathwave 是从识别界面发送的按钮命令,用于进入呼吸界面
Breatbacktobg 是从识别界面发送的按钮命令,用于退出呼吸界面
Enterhearto2wave 是从识别界面发送的按钮命令,用于进入氧气界面
Hearto2backtobg 是从识别界面发送的按钮命令,用于退出氧气界面
Start wave 是发送至屏幕的初始波形数据。
Cleanwave 用于清除发送至屏幕的波形数据。
然后点击勾选框进行编译。编译完成后,点击第二个箭头图标将代码下载至开发板。
STONE TOOLbox(图形化设计软件)
添加图片
使用已安装的 STONE 工具箱,点击左上角的“新建项目”,然后点击“确定”。
随后将生成一个默认项目,背景为蓝色。选中该项目并右键点击,选择“删除”以移除背景。然后右键点击图片文件并点击“添加”以添加自定义图片背景,如下所示:
设置图片功能
首先设置开机图片,工具 -> 屏幕配置,如下所示
随后需要添加视频控制以实现开机页面停止后自动跳转。
这里设置为开机页面停止后跳转到页面0,重复次数为0,表示不重复。
选择界面设置
这里设置第一个按钮图标。按钮效果采用页面6,跳转到页面3。同时向Arduino Uno MCU发送0x0001值以触发数据生成。第二个按键的设置类似,但键值命令不同。
动画效果设置
在此处添加预先制作的1_breath.ico图标,并设置动画停止值和开始值,以及停止图片为1和开始图片为4,并设置不显示背景。这还不够。如果需要动画自动移动,需要进行以下设置:
添加音频文件
开机后,点击打开时实现语音提示功能,需添加音频文件,其中音频文件编号为0。
实时曲线
此处制作了两个波形。为实现独立控制,采用两个数据通道,即通道1和通道2。建议设置Y_Central和YD_Central的值及颜色。命令如下:
uint8_t StartBreathWave[7] = {0xA5, 0x5A, 0x04, 0x84, 0x01, 0x01, 0xFF};
uint8_t CleanBreathWave[6] = {0xA5, 0x5A, 0x03, 0x80, 0xEB, 0x56};
uint8_t StartHeartO2Wave[9] = {0xA5, 0x5A, 0x06, 0x84, 0x06, 0x00, 0xFF, 0x00, 0x22};
uint8_t CleanHeartO2Wave[6] = {0xA5, 0x5A, 0x03, 0x80, 0xEB, 0x55};
设置完成后,编译、下载并升级到U盘。
连接
代码
/*
Serial
*/
//#include
#include "stdlib.h"
int incomedate = 0;
//#define UBRR2H
//HardwareSerial Serial2(2);
uint8_t i = 0, count = 0;
uint8_t StartBreathWaveFlag = 0;
uint8_t StartHeartO2WaveFlag = 0;
uint8_t EnterBreathWave[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00, 0x12, 0x01, 0x00, 0x01};//
uint8_t BreathBackToBg[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00, 0x14, 0x01, 0x00, 0x02};//
uint8_t EnterHeartO2Wave[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00, 0x13, 0x01, 0x00, 0x03};//
uint8_t HeartO2BackToBg[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00, 0x15, 0x01, 0x00, 0x04};//
uint8_t RecievedTemp[9] = {0};
uint8_t StartBreathWave[7] = {0xA5, 0x5A, 0x04, 0x84, 0x01, 0x01, 0xFF};//
uint8_t CleanBreathWave[6] = {0xA5, 0x5A, 0x03, 0x80, 0xEB, 0x56};//
uint8_t StartHeartO2Wave[9] = {0xA5, 0x5A, 0x06, 0x84, 0x06, 0x00, 0xFF, 0x00, 0x22};//
uint8_t CleanHeartO2Wave[6] = {0xA5, 0x5A, 0x03, 0x80, 0xEB, 0x55};//
void setup() {
Serial.begin(115200); //115200
}
void loop() {
if (Serial.available() == 9)//
{
for(count = 0; count < 9; count ++)
{
RecievedTemp[count] = Serial.read();
}
if(RecievedTemp[8] == 0x01)
{
StartBreathWaveFlag = 1;
StartHeartO2WaveFlag = 0;
Serial.write(CleanBreathWave, 6);
delay(1000);
}
else if(RecievedTemp[8] == 0x02)
{
StartBreathWaveFlag = 0;
Serial.write(CleanBreathWave, 6);
}
else if(RecievedTemp[8] == 0x03)
{
StartHeartO2WaveFlag = 1;
StartBreathWaveFlag = 0;
Serial.write(CleanHeartO2Wave, 6);
delay(1000);
}
else if(RecievedTemp[8] == 0x04)
{
StartHeartO2WaveFlag = 0;
Serial.write(CleanHeartO2Wave, 6);
}
}
if(StartBreathWaveFlag == 1)
{
delay(1);
Serial.write(StartBreathWave, 7);
i = rand();
StartBreathWave[6] = i;
}
else if(StartHeartO2WaveFlag == 1)
{
delay(1);
Serial.write(StartHeartO2Wave, 9);
i = rand();
StartHeartO2Wave[6] = i;
i = rand();
StartHeartO2Wave[8] = i;
}
}