当前位置: 首页 > news >正文

蓝桥杯嵌入式备赛实战:用STM32G431实现液位监测系统(附完整源码解析)

基于STM32G431的智能液位监测系统开发实战

在工业自动化、环境监测和智能家居等领域,液位监测是一个常见但至关重要的功能需求。本文将带您从零开始构建一个完整的智能液位监测系统,基于STM32G431微控制器,融合ADC采样、LCD显示、按键控制、LED状态指示、串口通信和EEPROM存储等多项技术。

1. 系统架构设计与硬件选型

一个完整的液位监测系统需要考虑传感器选型、信号处理、人机交互和数据存储等多个环节。我们选择STM32G431作为主控芯片,这是一款基于Arm Cortex-M4内核的微控制器,具有丰富的外设资源和出色的实时性能。

核心硬件组件清单

  • STM32G431RB微控制器
  • 电阻式液位传感器(或超声波传感器)
  • 2.4寸TFT LCD显示屏
  • 4个机械按键
  • 3个LED状态指示灯
  • EEPROM存储芯片(AT24C02)
  • USB转串口模块

硬件连接示意图如下:

外设模块STM32引脚功能描述
液位传感器PA1ADC2通道1模拟输入
按键1PB0模式切换/确认
按键2PB1参数切换
按键3PB2参数增加
按键4PA0参数减少
LED1PC8系统运行状态指示
LED2PC9液位变化报警指示
LED3PC10串口通信指示
LCD_CSPB12LCD片选信号
LCD_SCKPB13SPI时钟
LCD_MISOPB14SPI主机输入
LCD_MOSIPB15SPI主机输出
I2C_SCLPB6EEPROM时钟线
I2C_SDAPB7EEPROM数据线

2. 软件架构设计与关键模块实现

2.1 主程序流程设计

系统采用前后台架构,主循环负责调度各功能模块,中断处理实时性要求高的任务。以下是精简后的main.c核心逻辑:

int main(void) { // 硬件初始化 HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC2_Init(); MX_TIM2_Init(); MX_USART1_UART_Init(); // 外设初始化 HAL_TIM_Base_Start_IT(&htim2); // 启动1ms定时器中断 HAL_UART_Receive_IT(&huart1, &OneData, 1); // 启动串口接收中断 LCD_Init(); I2CInit(); // 初始化EEPROM默认值 E2PROM_Write(0x00, min); HAL_Delay(5); E2PROM_Write(0x01, med); HAL_Delay(5); E2PROM_Write(0x02, max); HAL_Delay(5); // 主循环 while (1) { adc_process(); // ADC采样处理 key_process(); // 按键处理 lcd_process(); // LCD显示更新 led_process(); // LED状态控制 rx_process(); // 串口数据处理 } }

2.2 ADC采样与液位计算

液位监测的核心是ADC采样和数据处理。我们采用均值滤波算法提高测量稳定性:

float get_Adc(ADC_HandleTypeDef *hadc) { int val = 0.0f; for(int i = 0; i < 5; i++) { HAL_ADC_Start(hadc); HAL_ADC_PollForConversion(hadc, 100); val += HAL_ADC_GetValue(hadc); HAL_ADC_Stop(hadc); } return val * 3.3f / 4096.0f / 5.0f; // 转换为电压值并取平均 }

液位高度计算采用线性转换公式:

height = k * adc_value

其中k为传感器特性系数,需根据实际传感器标定。

2.3 多任务调度与状态机设计

系统使用1ms定时器中断作为时间基准,实现精确的时序控制:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { // 按键扫描 key[0].key_gpio = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); // ...其他按键扫描 // 定时计数器更新 adctimes++; led1times++; led2times++; led3times++; } }

界面切换采用状态机设计,通过view变量控制不同显示模式:

void lcd_process(void) { switch(view) { case 0: // 主显示界面 sprintf((char *)lcdtext," Liquid Level"); LCD_DisplayStringLine(Line0,lcdtext); // ...其他显示内容 break; case 1: // 参数设置界面 sprintf((char *)lcdtext," Parameter Setup"); LCD_DisplayStringLine(Line0,lcdtext); // ...其他显示内容 break; // ...其他界面状态 } }

3. 关键问题解决与优化技巧

3.1 I2C通信稳定性优化

EEPROM读写操作需要注意时序问题,特别是连续写入时需要保持足够的时间间隔:

void E2PROM_Write(uint8_t addr, uint8_t data) { I2CStart(); I2CSendByte(0xA0); I2CWaitAck(); I2CSendByte(addr); I2CWaitAck(); I2CSendByte(data); I2CWaitAck(); I2CStop(); HAL_Delay(5); // 必须的延时,确保写入完成 }

提示:AT24C02系列EEPROM的页写入周期典型值为5ms,连续写入时必须遵守这个时间间隔,否则会导致数据写入失败。

3.2 液位变化检测算法

为了避免频繁触发液位变化报警,我们采用带滞回的比较算法:

void adc_process(void) { if(adctimes >= 1000) { // 1秒采样一次 adctimes = 0; newheight = k * get_Adc(&hadc2); // 液位分级判断 if(newheight <= min) newlevel = 0; else if(newheight <= med) newlevel = 1; else if(newheight <= max) newlevel = 2; else newlevel = 3; // 液位变化检测(带5mm滞回) if(abs(newheight - height) > 5 || newlevel != level) { led2flag = 1; // 触发LED报警 height = newheight; level = newlevel; // 发送串口通知 sprintf((char *)txtext, "A:H%d+L%d\r\n", height, level); HAL_UART_Transmit(&huart1, (uint8_t *)txtext, strlen((char *)txtext), 50); } } }

3.3 低功耗优化策略

对于电池供电的应用场景,可以采用以下优化措施:

  1. 动态时钟调整:根据任务负载动态调整系统时钟频率
  2. 外设电源管理:不使用时关闭LCD背光、传感器电源等
  3. 间歇工作模式:设置ADC采样间隔从1秒延长到5秒或更长
  4. 睡眠模式:在无操作时进入STOP模式,通过按键或定时器唤醒

4. 系统功能扩展与进阶开发

4.1 无线通信模块集成

通过添加蓝牙或Wi-Fi模块,可以实现远程监控:

// 伪代码示例:通过串口发送JSON格式数据 void send_web_data(void) { sprintf(json_buffer, "{\"level\":%d,\"height\":%d,\"voltage\":%.2f}", level, height, adcval); HAL_UART_Transmit(&huart1, (uint8_t *)json_buffer, strlen(json_buffer), 100); }

4.2 上位机监控软件开发

使用Python可以快速开发一个简单的监控界面:

import serial import matplotlib.pyplot as plt ser = serial.Serial('COM3', 115200, timeout=1) data = [] while True: line = ser.readline().decode().strip() if line.startswith('A:H'): height = int(line.split('H')[1].split('+')[0]) data.append(height) plt.plot(data) plt.pause(0.01)

4.3 多传感器数据融合

为了提高测量精度,可以结合多种传感器:

  1. 电阻式传感器:成本低,适合静态液位测量
  2. 超声波传感器:非接触式,适合腐蚀性液体
  3. 压力传感器��可测量深罐体液位
  4. 光电传感器:检测液面是否存在

通过卡尔曼滤波算法融合多传感器数据,可以得到更稳定可靠的测量结果。

http://www.zskr.cn/news/1446723.html

相关文章:

  • 多智能体原生语言编程:从代码生成到AI团队协作的工程范式转变
  • 别再乱选预处理器了!Stable Diffusion ControlNet Tile模型三大预处理器实战对比(附效果图)
  • STM32CubeIDE新手必看:ST-LINK下载程序保姆级教程(含固件更新避坑指南)
  • 余生黄金回收上门靠谱吗?菏泽卖金套路拆解与变现技巧 - 余生黄金回收
  • 2026必看:惠州新房除甲醛公司怎么选?认准资质硬核的佰家环保,告别治理反弹 - 专注室内空气检测治理
  • 2026年6月在线电导率监测仪十大品牌厂家——工业废水排放监测哪家好? - 康宝莱智慧水务
  • 告别百度API,用Faster-Whisper在本地搭建实时语音转写系统(含WebSocket服务端代码)
  • 2026年6月威海婚纱照全攻略|选店 + 取景 + 避坑全指南 - 生活测评君
  • 避坑指南:UE5 GAS中GameplayEffect的Tag堆叠与委托监听那些事儿
  • 2026北京海淀黄金回收靠谱推荐:资质全、报价透明、免费上门 - 行行星
  • 高性价比的南坊汽修店多家科室与设备对比:资质梳理 - 资讯速览
  • 从工业界到学术领导:密码学专家劳特任AWM主席的行业启示
  • 告别蓝屏!保姆级教程:用技嘉工具给NVMe固态硬盘装Win7(含USB3.0驱动注入)
  • 2026年亲测|论文AIGC全红99%怎么救?Gemini去AI痕迹技巧,3组指令联合3大工具拉回10%安全线 - 降AI实验室
  • 2026推荐:惠州甲醛检测公司哪家专业?拒绝数据套路,佰家环保精准检测靠谱可信赖 - 专注室内空气检测治理
  • 2026 南宁翡翠回收全指南:从鉴定到变现,添价收黄金奢侈品回收教你一步到位 - 薛定谔的梨花猫
  • 量子计算入门:从叠加态到量子算法,理解下一代计算范式
  • LLM智能体如何革新漏洞检测:四层过滤架构与工程实践
  • 【Sora 2视频质量实测白皮书】:基于47项客观指标(PSNR/SSIM/VMAF/LPIPS)与127小时主观盲测的首份权威报告
  • 别再死记硬背PCA公式了!用Python+NumPy手把手带你从数据矩阵推到特征向量
  • 别再买错PE瓶盖压盖机了,2026年定制化服务厂家揭秘按需匹配的真相 - 品牌2026
  • 别再手动跳过了!一键配置Maven插件,彻底解决IntelliJ IDEA打包时‘common.utils不存在’的烦人问题
  • 告别手动管理!用Unity Addressable系统搞定资源热更新(附远程服务器配置)
  • 2026 年外贸独立站GEO优化及建站公司 - 资讯焦点
  • 在日本搞网络,我为什么放弃了PPPoE?聊聊MAP-E、DS-Lite这些IPv4 over IPv6技术
  • 别再傻傻重启电脑了!Windows 10/11桌面图标错乱修复,用这行命令5秒搞定
  • 我跑了5家店测金价,这份沈阳黄金回收实测请收好 - 奢侈品回收测评
  • TensorFlow物体检测全流程代码包:从训练到多线程实时识别,含Web图形界面
  • 竞争存在论:作为一种自我奠基的元本体论
  • 告别黑白:手把手教你用QGIS为地形图调出高级感配色与图层叠加效果