1. 项目概述:当电子秤遇上STM32
在菜市场、超市货架或者快递站点,我们每天都会与电子秤打交道。但你是否想过,这些看似简单的称重设备背后,其实藏着一颗"智慧大脑"?这次我要分享的,就是基于STM32微控制器打造的多功能电子秤结算系统——它不仅能够精准称重,还能自动计算金额、存储交易记录,甚至支持多种支付方式。
传统电子秤通常只具备基础称重功能,价格计算需要人工操作。而采用STM32的方案,我们可以在成本增加不多的前提下,实现称重、计价、打印小票、数据统计等全套功能。这个项目特别适合需要频繁称重计价的场景,比如生鲜超市、农贸市场、物流称重等。下面我就从硬件选型到软件设计,详细拆解这个既实用又有技术含量的嵌入式开发案例。
2. 硬件设计解析
2.1 核心器件选型
这个项目的硬件架构可以概括为"一主四辅":以STM32为主控,配合称重传感器、显示屏、按键模块和通信模块。在器件选型上,我主要考虑了精度、成本和易用性三个维度:
-
主控芯片:STM32F103C8T6
- 72MHz主频的Cortex-M3内核,性能足够处理称重数据
- 内置12位ADC,可直接连接称重传感器
- 64KB Flash + 20KB RAM,满足程序存储需求
- 价格约15元,性价比极高
-
称重传感器:HX711模块+铝合金悬臂梁传感器
- 量程5kg,精度0.1g(满足商业电子秤Ⅲ级标准)
- HX711自带24位ADC,分辨率高于STM32内置ADC
- 模块化设计,减少电路设计工作量
-
显示模块:1.3寸OLED(SSD1306驱动)
- 128x64分辨率,显示内容清晰
- 相比LCD更省电,视角更广
- 支持I2C接口,节省IO资源
-
其他外设:
- 矩阵键盘(4x4)用于输入单价和功能操作
- ESP8266 WiFi模块支持数据上传
- 微型热敏打印机用于小票打印
提示:传感器选型时要特别注意量程和精度的平衡。比如生鲜销售通常需要5kg量程,而珠宝称重可能需要更高精度但量程只需200g。
2.2 电路设计要点
整个硬件系统的电路设计有几个关键点需要注意:
-
电源设计:
- 采用AMS1117-3.3V稳压芯片为系统供电
- 称重传感器需要单独供电以减少干扰
- 加入1000μF电容滤波保证ADC采样稳定
-
信号调理电路:
c复制// HX711与STM32的连接示例 HX711_DOUT --> PA0(STM32输入) HX711_PD_SCK --> PA1(STM32输出) -
抗干扰设计:
- 传感器信号线使用双绞线
- ADC输入引脚加0.1μF去耦电容
- 数字地和模拟地通过0Ω电阻单点连接
在实际焊接时,我发现称重传感器对电源噪声特别敏感。最初测试时,读数总是不稳定,后来在电源端增加了LC滤波电路才解决问题。这也是很多电子秤项目容易踩的坑。
3. 软件架构设计
3.1 系统工作流程
整个软件系统采用前后台架构,主循环处理显示和用户交互,中断处理关键时序任务。下面是核心流程图:
plaintext复制上电初始化
↓
传感器校准
↓
进入主循环:
1. 检测按键输入
2. 读取称重数据
3. 计算金额
4. 刷新显示
5. 处理通信任务
3.2 关键算法实现
-
称重数据处理:
- 采用滑动窗口滤波算法,取最近10次采样值的中位数
- 动态去皮重功能(置零功能)
- 单位转换(g/kg/lb切换)
c复制// 滑动滤波算法示例代码 #define FILTER_SIZE 10 int32_t filterBuffer[FILTER_SIZE]; int32_t medianFilter(int32_t newVal) { static uint8_t index = 0; filterBuffer[index++] = newVal; if(index >= FILTER_SIZE) index = 0; int32_t temp[FILTER_SIZE]; memcpy(temp, filterBuffer, sizeof(temp)); bubbleSort(temp, FILTER_SIZE); // 实现排序算法 return temp[FILTER_SIZE/2]; } -
金额计算:
- 支持单价输入和预设单价调用
- 四舍五入规则符合商业规范
- 打折和优惠计算功能
-
数据存储:
- 使用STM32内部Flash模拟EEPROM存储校准参数
- 外接AT24C02存储交易记录
- 每条记录包含时间戳、重量、金额等信息
3.3 用户界面设计
OLED显示采用分层设计:
- 第一行:当前模式(称重/计价/设置)、单位
- 中间区域:
- 称重模式:显示重量
- 计价模式:显示重量、单价、金额
- 底部:功能提示(按键对应功能)
通过有限状态机(FSM)管理界面切换,确保操作逻辑清晰。我设计了以下几个主要状态:
c复制typedef enum {
MODE_WEIGHT, // 纯称重模式
MODE_PRICE, // 计价模式
MODE_SETTING, // 系统设置
MODE_CALIB // 校准模式
} SystemMode;
4. 核心功能实现细节
4.1 高精度称重实现
称重精度是电子秤的核心指标。我们通过以下措施保证精度:
-
传感器校准:
- 两点校准法(零点和满量程点)
- 校准参数存储在Flash中
- 计算公式:重量 = (原始值 - 零点值) * 系数
-
温度补偿:
- 监测环境温度(可用DS18B20)
- 根据温度变化调整校准参数
- 补偿系数通过实验测定
-
数字滤波:
- 除了中值滤波,还加入了递推平均滤波
- 动态调整滤波强度,在稳定时增强滤波,快速变化时减弱
注意:校准砝码必须使用经过认证的标准砝码,普通重物无法保证校准精度。我最初用矿泉水瓶装水作为校准重量,结果误差达到1%,换成标准砝码后误差降到了0.1%以内。
4.2 多功能结算系统
在基础称重功能上,我们扩展了完整的商业结算功能:
-
商品管理:
- 预设100种商品编码及单价
- 通过数字键盘快速调用
- 支持商品分类(水果、蔬菜、肉类等)
-
交易处理:
- 自动计算金额并四舍五入
- 支持折扣和优惠券
- 交易记录包含时间戳和交易号
-
数据统计:
- 按日/周/月统计销售额
- 商品销量排名
- 通过WiFi上传至服务器
4.3 通信功能实现
使用ESP8266模块实现无线通信:
-
WiFi连接:
- 支持STA和AP模式
- 自动重连机制
- 配置信息存储在Flash中
-
数据传输协议:
- 自定义轻量级二进制协议
- 数据包包含校验和
- 支持断网缓存和重传
-
服务器交互:
- 定时上传交易记录
- 接收价格更新
- 远程校准功能
c复制// WiFi通信状态机示例
typedef enum {
WIFI_IDLE,
WIFI_CONNECTING,
WIFI_CONNECTED,
WIFI_SENDING,
WIFI_ERROR
} WifiState;
5. 系统优化与调试
5.1 低功耗设计
虽然商业电子秤通常接交流电,但考虑到便携使用场景,我们也做了低功耗优化:
-
硬件层面:
- 不使用外设时关闭电源
- 选择低功耗元器件
- 优化PCB布局减少漏电流
-
软件层面:
- 使用STM32的睡眠模式
- 动态调整主频
- 外设按需启用
实测表明,在间歇使用场景下,采用2000mAh锂电池可连续工作约80小时。
5.2 抗干扰措施
电子秤在实际环境中会遇到各种干扰:
-
电源干扰:
- 增加π型滤波电路
- 使用线性稳压器
- 敏感电路单独供电
-
EMI干扰:
- 信号线加磁珠
- 合理布局地平面
- 屏蔽敏感元件
-
机械干扰:
- 防震动算法
- 稳定检测机制
- 异常数据丢弃
在调试过程中,我发现当附近有大型电器启动时,称重读数会出现跳变。通过增加电源滤波和在软件中加入异常值检测,有效解决了这个问题。
5.3 量产测试方案
为验证系统可靠性,我设计了一套测试方案:
-
自动化测试脚本:
- 通过串口发送测试命令
- 自动验证各项功能
- 生成测试报告
-
压力测试:
- 连续24小时运行
- 模拟快速称重操作
- 极限温度测试
-
精度测试:
- 全量程均匀取10个测试点
- 每个点测量10次取平均
- 误差控制在±0.2%以内
6. 常见问题与解决方案
在实际开发和部署过程中,我遇到了不少典型问题,这里整理出最有价值的几个:
-
问题:称重读数不稳定
- 可能原因:电源噪声、机械振动、温度变化
- 解决方案:
- 检查电源滤波电路
- 增加软件滤波强度
- 确保秤台放置平稳
-
问题:WiFi频繁断开
- 可能原因:信号弱、配置错误、硬件故障
- 解决方案:
- 添加信号强度检测
- 实现自动重连机制
- 检查天线连接
-
问题:显示内容错乱
- 可能原因:内存溢出、时序错误、硬件接触不良
- 解决方案:
- 检查堆栈大小
- 用逻辑分析仪抓取时序
- 重新压紧排线
-
问题:校准参数丢失
- 可能原因:Flash写入次数超限、意外断电
- 解决方案:
- 增加写入间隔
- 采用备份存储区
- 添加数据校验
经验分享:调试HX711模块时,发现其时钟时序非常严格。最初直接用GPIO模拟时序,结果读数不准。后来改用硬件SPI模拟,并严格控制延时,问题才解决。这个细节在数据手册中并不突出,但却很关键。
7. 项目扩展与进阶
基础功能实现后,还可以考虑以下扩展方向:
-
支付集成:
- 扫码支付(支付宝/微信)
- NFC感应支付
- 会员卡支付
-
智能功能:
- 自动识别商品类型
- 库存管理联动
- 销售预测分析
-
云平台对接:
- 对接主流云服务平台
- 实现远程监控
- 支持OTA升级
-
工业设计优化:
- 防水防尘设计
- 抗冲击结构
- 环保材料选择
在实际部署中,我发现不同商户对功能需求差异很大。生鲜摊主更关注称重速度和防水性能,而精品店则需要美观外观和会员功能。因此,最好设计成模块化系统,方便按需定制。