若该文为原创文章,转载请注明原文出处。
摘要: 本文设计并实现了一种以STM32F103C8T6单片机为核心的智能称重系统。系统采用HX711模块连接应变式称重传感器进行高精度重量采集,支持去皮和超重报警功能。通过4x4矩阵键盘进行产品选择、单价设置等操作,并通过OLED显示屏实时显示重量、单价、总额等信息。集成DS18B20温度传感器用于环境监测,超温时报警。同时,系统集成HC-05蓝牙模块,可与手机APP通信,实现参数的远程设置与监控。测试结果表明,该系统称重准确、功能完整、人机交互友好,满足了商业智能称重的基本需求。
关键词: STM32;电子秤;HX711;矩阵键盘;蓝牙;温度监测
一、引言
(一)研究背景及意义
电子秤已广泛应用于商业零售、工业生产、实验室等各个领域。传统电子秤功能单一,管理不便,无法满足现代商业对数据记录、远程管理和智能预警的需求。随着嵌入式技术和物联网技术的发展,智能称重系统成为发展趋势。本项目旨在设计一款具备本地操作、蓝牙远程控制、温度补偿和报警功能的智能称重系统,能够提升称重过程的效率、准确性和智能化水平,具有很高的实用价值和市场前景。
(二)国内外研究现状
目前市面上的电子秤产品主要分为两类:一类是传统的独立电子秤,功能简单;另一类是联网智能秤,通常通过RS485或WiFi与PC管理系统连接,多见于超市、物流等专业领域。然而,成本低廉、可通过通用手机APP进行灵活配置的蓝牙智能秤仍有较大市场空间。本设计结合了传统秤的独立操作性和智能秤的联网优势,提供了一个高性价比、高集成度的解决方案。
二、系统总体设计
(一)系统架构
系统采用双交互通道设计:
-
本地通道: 用户通过矩阵键盘和OLED屏与系统交互,完成所有称重功能。
-
远程通道: 用户通过手机APP经由蓝牙与系统交互,进行功能设置和监控。
STM32作为核心控制器,处理来自所有外设的数据和执行逻辑。
(二)功能模块划分
-
主控模块: STM32F103C8T6。
-
数据采集模块: HX711(重量)、DS18B20(温度)。
-
人机交互模块: 4x4矩阵键盘、OLED显示屏、蜂鸣器。
-
通信模块: HC-05蓝牙模块。
-
电源模块: 为系统提供稳定供电。
三、硬件设计与实现
(一)系统硬件框架图
系统硬件配置与功能说明表
1. 主控单元
器件名称 | 推荐型号 | 接口 | 功能说明 |
---|---|---|---|
STM32单片机 | STM32F103C8T6 | - | 作为系统核心,负责重量采集、温度监测、价格计算、数据显示和通信处理。 |
2. 传感器与输入单元
器件名称 | 推荐型号/类型 | 接口 | 功能说明 |
---|---|---|---|
称重传感器 | 应变片传感器 + HX711 | GPIO (DT, SCK) | 高精度重量检测,量程0-10kg,精度±1g,支持去皮功能。 |
温度传感器 | DS18B20 | 单总线 | 监测环境温度,范围-55°C至+125°C,精度±0.5°C。 |
4×4矩阵键盘 | 16键薄膜键盘 | GPIO | 功能:数字输入、产品选择、去皮、确认、取消、设置等。 |
蓝牙模块 | HC-05 | UART | 与手机APP通信,实现远程控制和数据监控。 |
3. 执行器单元
器件名称 | 推荐型号/类型 | 接口 | 功能说明 |
---|---|---|---|
OLED显示屏 | SSD1306 | I²C | 显示重量、单价、总价、产品类型、温度等信息。 |
蜂鸣器 | 5V有源蜂鸣器 | GPIO | 超重报警、温度异常报警、操作提示音。 |
状态指示灯 | RGB LED | PWM | 显示系统状态:绿色(正常)、蓝色(蓝牙连接)、红色(报警)。 |
核心功能逻辑说明
1. 称重与计价功能
-
重量采集:
-
HX711实时采集重量数据
-
支持去皮功能:去除容器重量
-
重量单位:克(g)或千克(kg)
-
-
计价算法:
-
总价 = 重量 × 单价
-
支持不同产品不同单价
-
金额计算精确到分
-
2. 产品管理功能
-
产品选择:
-
预设多种产品类型(苹果、香蕉、橙子等)
-
每种产品可设置不同单价
-
通过键盘或APP选择产品
-
-
价格设置:
-
管理员模式设置单价
-
支持价格调整和更新
-
3. 安全保护系统
-
超重保护:
-
if (重量 > 最大重量阈值) { 蜂鸣器报警; OLED显示"超重警告"; }
-
-
温度保护:
-
if (温度 > 温度阈值) { 蜂鸣器报警; OLED显示"温度异常"; }
-
4. OLED显示界面
称重状态显示: ---------------- 产品: 苹果 单价: 12.50元/kg 重量: 1.255 kg 总价: 15.69 元 温度: 25.5°C ---------------- 报警状态显示: ---------------- 超重警告! 最大重量: 5.0kg ----------------
5. 键盘操作功能
-
数字键0-9: 输入数字
-
A键: 选择产品
-
B键: 去皮功能
-
C键: 确认/设置
-
D键: 取消/返回
-
#键: 进入设置模式
-
*键: 清除输入
6. 蓝牙APP功能
-
产品选择: 远程选择产品类型
-
价格设置: 远程设置商品单价
-
参数配置: 设置最大重量、温度阈值
-
数据监控: 实时查看称重数据
-
历史记录: 查看交易记录
四、软件设计与实现
(一)开发环境搭建
-
IDE: STM32CubeIDE
-
库: HAL库
-
配置工具: STM32CubeMX用于配置引脚、时钟、I2C、UART等。
(二)系统软件流程图
(三)关键功能代码片段
1. HX711读取与校准(代码片段)
// 全局变量
long HX711_Offset = 0; // 皮重偏移量
float HX711_Scale = 1.0f; // 校准系数
// 读取HX711 ADC值
long HX711_Read(void) {
while(HAL_GPIO_ReadPin(HX711_DT_GPIO_Port, HX711_DT_Pin) == GPIO_PIN_SET); // 等待DT准备好
long count = 0;
for(uint8_t i=0; i<24; i++) {
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);
count = count << 1;
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
if(HAL_GPIO_ReadPin(HX711_DT_GPIO_Port, HX711_DT_Pin) == GPIO_PIN_SET) count++;
}
// 发送第25个脉冲选择通道和增益
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);
count ^= 0x800000; // 转换补码
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
return count;
}
// 获取校准后的重量(克)
float Get_Weight() {
long adc_value = HX711_Read();
float weight = (adc_value - HX711_Offset) / HX711_Scale;
return (weight > 0) ? weight : 0; // 返回非负数
}
// 去皮功能
void Tare_Weight() {
HX711_Offset = HX711_Read(); // 将当前读数设为偏移量
}
2. 矩阵键盘扫描(代码片段)
// 引脚定义: Rows: R0-R3 (Output), Cols: C0-C3 (Input with Pull-up)
uint8_t Key_Scan(void) {
uint8_t key_value = KEY_NONE;
for(uint8_t i=0; i<4; i++) {
// 逐行输出低电平
HAL_GPIO_WritePin(ROW0_GPIO_Port, ROW0_Pin, (i != 0) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(ROW1_GPIO_Port, ROW1_Pin, (i != 1) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(ROW2_GPIO_Port, ROW2_Pin, (i != 2) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(ROW3_GPIO_Port, ROW3_Pin, (i != 3) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_Delay(1); // 短暂延时稳定
// 检查哪一列变低
if(HAL_GPIO_ReadPin(COL0_GPIO_Port, COL0_Pin) == GPIO_PIN_RESET) key_value = key_map[i][0];
if(HAL_GPIO_ReadPin(COL1_GPIO_Port, COL1_Pin) == GPIO_PIN_RESET) key_value = key_map[i][1];
if(HAL_GPIO_ReadPin(COL2_GPIO_Port, COL2_Pin) == GPIO_PIN_RESET) key_value = key_map[i][2];
if(HAL_GPIO_ReadPin(COL3_GPIO_Port, COL3_Pin) == GPIO_PIN_RESET) key_value = key_map[i][3];
}
// 所有行恢复高电平
HAL_GPIO_WritePin(ROW0_GPIO_Port, ROW0_Pin, GPIO_PIN_SET);
// ... 其他行
return key_value;
}
3. 显示与报警逻辑(代码片段)
void Display_Update(void) {
OLED_Clear();
OLED_ShowString(0, 0, "Weight:", 16);
OLED_ShowNum(60, 0, (int)current_weight, 4, 16); // 显示重量
OLED_ShowString(100, 0, "g", 16);
OLED_ShowString(0, 2, "Price:", 16);
OLED_ShowNum(60, 2, (int)(unit_price*100), 5, 16); // 显示单价(分)
OLED_ShowString(110, 2, "/kg", 16);
OLED_ShowString(0, 4, "Total:", 16);
OLED_ShowNum(60, 4, (int)(current_weight * unit_price), 5, 16); // 显示总价
OLED_ShowString(110, 4, "yuan", 16);
}
void Check_Alarms(void) {
// 超重报警
if(current_weight > max_weight_threshold) {
Buzzer_On();
OLED_ShowString(0, 6, "OVERWEIGHT ALARM!", 16);
}
// 超温报警
else if(current_temperature > temp_threshold) {
Buzzer_On();
OLED_ShowString(0, 6, "OVER TEMP ALARM!", 16);
} else {
Buzzer_Off();
}
}
4. 蓝牙通信协议(示例)
定义简单文本协议,便于APP解析:
-
STM32 → APP:
"W:1234,P:1280,T:25.5\r\n"
(重量:1234g, 单价:12.8元/kg, 温度:25.5℃) -
APP → STM32:
"SETPRICE:1280\r\n"
(设置单价为12.8元) -
APP → STM32:
"SETMAXW:5000\r\n"
(设置最大重量为5000g) -
APP → STM32:
"SETTEMP:40\r\n"
(设置温度阈值为40℃) -
APP → STM32:
"TARE\r\n"
(执行去皮操作)
五、系统测试与优化
(一)测试方案
-
称重精度测试: 使用标准砝码(如100g, 500g, 1000g)进行标定和测试,计算线性度和重复性误差。
-
功能测试:
-
键盘操作: 测试每个按键功能是否正常。
-
去皮功能: 放置容器,执行去皮,测试显示是否归零。
-
超重报警: 放置超过阈值的重物,测试蜂鸣器是否报警。
-
蓝牙通信: 使用手机APP连接并设置参数,查看秤的响应。
-
-
稳定性测试: 长时间上电,观察零点漂移情况和显示是否稳定。
(二)测试结果与分析
测试项目 | 测试条件 | 预期结果 | 实际结果 | 结论 |
---|---|---|---|---|
称重精度 | 放置500g标准砝码 | 显示500±5g | 显示503g | 良好,需软件校准 |
去皮功能 | 放置200g容器后去皮 | 显示归零 | 显示0g | 正常 |
超重报警 | 放置6kg重物(阈值5kg) | 蜂鸣器响,OLED报警 | 报警正常触发 | 正常 |
蓝牙设置 | APP发送"SETPRICE:1500" | 单价变为15.00元/kg | 单价更新成功 | 正常 |
(三)系统优化
-
数字滤波: 对HX711读取的原始AD值进行滑动平均滤波或卡尔曼滤波,有效抑制称重数据的跳动,使显示更稳定。
-
温度补偿: 利用DS18B20的数据,对称重传感器的温漂进行软件补偿,提高在不同环境下的测量精度。
-
EEPROM存储: 将校准参数、单价、阈值等系统关键数据存储在STM32的Flash或外置EEPROM中,防止掉电丢失。
-
低功耗设计: 在无操作一段时间后,自动关闭OLED背光,并让STM32进入睡眠模式,通过按键中断唤醒,节省能耗。
六、结论与展望
(一)结论
本项目成功设计并实现了一个高精度、多功能的智能称重系统。系统完成了核心的重量测量与显示功能,并集成了本地键盘操作、蓝牙远程控制、超重超温报警等实用特性。硬件结构紧凑,成本低;软件运行稳定,人机交互流畅,达到了设计的预期目标。
(二)未来展望
-
支付集成: 集成热敏打印机模块,打印收款小票;或集成二维码显示,支持扫码支付。
-
数据管理: 增加SD卡模块,自动按日、月记录销售数据,方便后续统计和分析。
-
产品数据库: 在STM32外扩SPI Flash,存储大量产品信息(编号、名称、单价),实现通过编号快速调用。
-
外壳设计: 设计专业的商业秤外壳,提升产品化程度。
如有侵权,或需要完整代码,请及时联系博主。