从零到波形图:手把手教你用HMI串口屏和STM32打造实时数据监控系统
2026/6/4 10:51:10 网站建设 项目流程

从零到波形图:手把手教你用HMI串口屏和STM32打造实时数据监控系统

在工业自动化和物联网设备开发中,实时数据可视化一直是提升用户体验的关键环节。传统LCD屏开发需要处理底层驱动、图形库和触摸控制,而HMI串口屏通过封装这些复杂功能,让开发者只需发送简单指令就能实现专业级界面。本文将带你完整实现一个能同时显示实时数值和动态波形的监控系统,涵盖从STM32数据采集到串口屏界面设计的全流程。

1. 硬件架构设计与环境搭建

1.1 硬件选型与连接

本项目核心硬件组成如下表所示:

组件型号关键参数备注
主控MCUSTM32F103C8T6Cortex-M3内核,72MHz主频性价比高的BluePill开发板
HMI串口屏迪文DGUS屏3.5寸480×320分辨率支持电阻/电容触摸
传感器模块DHT11+ADXL345温湿度+三轴加速度模拟真实监控场景

接线示意图

STM32 HMI串口屏 PA9(TX) ---- RX PA10(RX) ---- TX 3.3V ---- VCC GND ---- GND

注意:部分串口屏需要5V供电,需确认电压兼容性。若使用硬件流控,还需连接RTS/CTS引脚。

1.2 开发环境配置

推荐使用以下工具链组合:

  • IDE: STM32CubeIDE(集成HAL库)
  • 串口调试工具: Tera Term + 迪文屏模拟器
  • 界面设计工具: DGUS Tool(厂商提供)

安装关键步骤:

  1. 在CubeMX中配置USART1为异步模式,波特率115200
  2. 启用DMA传输以减少CPU负载
  3. 添加FreeRTOS支持以实现多任务调度
// CubeMX生成的USART初始化代码片段 huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE;

2. STM32端数据采集与处理

2.1 多传感器数据融合

在实时监控系统中,通常需要处理不同类型传感器的数据。以下示例展示如何统一处理温湿度和加速度数据:

typedef struct { float temperature; float humidity; int16_t accel[3]; uint32_t timestamp; } SensorData_t; void SensorTask(void *argument) { SensorData_t sensorData; while(1) { DHT11_Read(&sensorData.temperature, &sensorData.humidity); ADXL345_Read(sensorData.accel); sensorData.timestamp = HAL_GetTick(); xQueueSend(sensorQueue, &sensorData, portMAX_DELAY); osDelay(100); // 10Hz采样率 } }

2.2 数据格式化与协议设计

串口屏通常采用特定指令协议,以下为迪文屏常用的波形数据格式:

// 更新数值显示 "page0.n0.val=%d\xFF\xFF\xFF" // 添加波形点 "add 1,0,%d\xFF\xFF\xFF"

优化后的发送函数示例:

void SendToScreen(uint8_t *cmd, int value) { uint8_t buffer[32]; int len = sprintf((char*)buffer, cmd, value); memcpy(&buffer[len], "\xFF\xFF\xFF", 3); // 添加结束符 HAL_UART_Transmit_DMA(&huart1, buffer, len+3); }

3. 串口屏界面开发实战

3.1 双页面动态设计

创建两个核心界面:

  1. 仪表盘页面:显示实时数值和状态指示灯
  2. 波形页面:绘制动态曲线和历史趋势

控件配置要点

  • 使用变量显示控件展示实时数值
  • 配置波形图控件的X/Y轴范围和刷新速率
  • 为按钮添加返回键值实现页面切换

专业技巧:在波形页面预留20%的显示余量,避免数据突增时超出范围。

3.2 高级功能实现

通过串口屏的数据记录功能,可以实现:

  • 异常数据自动截图保存
  • 历史数据回放
  • 阈值报警触发

配置示例(DGUS屏):

// 设置报警条件 "alarm_set 1,>30,page0.t0.txt=高温!\xFF\xFF\xFF"

4. 系统优化与调试技巧

4.1 性能提升方案

优化方向实施方法预期效果
通信效率启用DMA+空闲中断降低CPU占用率30%
数据精度采用滑动平均滤波减少噪声干扰
实时性优化FreeRTOS任务优先级确保波形刷新优先

4.2 常见问题排查

现象1:波形显示断断续续

  • 检查STM32的发送缓冲区是否溢出
  • 确认串口屏的波特率与MCU设置一致
  • 测试降低数据发送频率观察是否改善

现象2:触摸响应延迟

  • 检查是否有其他高优先级任务阻塞系统
  • 优化触摸事件处理函数的执行效率
  • 考虑增加触摸去抖算法
// 示例:简单的软件滤波 #define FILTER_DEPTH 5 int touchFilter(int raw) { static int buffer[FILTER_DEPTH]; static int index = 0; buffer[index++] = raw; if(index >= FILTER_DEPTH) index = 0; int sum = 0; for(int i=0; i<FILTER_DEPTH; i++) { sum += buffer[i]; } return sum/FILTER_DEPTH; }

5. 项目扩展与进阶应用

将本系统与云平台结合,可以构建更完整的IoT解决方案:

  1. 通过ESP8266模块上传数据至MQTT服务器
  2. 在云端实现多设备数据聚合分析
  3. 开发手机APP进行远程监控

典型应用场景

  • 工业设备状态监控
  • 农业大棚环境监测
  • 智能家居控制面板

在最近的一个智能温室项目中,这套方案成功实现了:

  • 同时监控8个温湿度节点
  • 3种作物生长参数的趋势分析
  • 异常情况的自动短信报警

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询