用STM32F103C8T6做个厨房电子秤:HX711+OLED显示,从硬件接线到校准全流程
从零打造高精度厨房电子秤:STM32F103C8T6与HX711的实战指南
每次烘焙时用传统机械秤测量面粉总担心误差太大?市面上成品电子秤要么精度不足要么价格昂贵?本文将带你用不到百元的成本打造一个精度达0.1g的智能厨房秤。不同于简单的模块堆砌教程,我们将深入探讨传感器稳定性优化、自动校准算法和人性化交互设计三大核心。
1. 项目规划与硬件选型
厨房秤看似简单,实则对稳定性要求极高。面粉过筛时产生的震动、厨房温湿度变化都会影响测量结果。我们选择的STM32F103C8T6虽然属于入门级MCU,但其72MHz主频和12位ADC足以应对称重场景。关键在于HX711这款24位ADC芯片——它能将应变片的微小电阻变化放大128倍后转换,这是实现毫克级精度的核心。
必备物料清单:
- 主控:STM32F103C8T6最小系统板(带USB转串口)
- 称重模块:HX711+铝合金悬臂梁传感器(5kg量程)
- 显示:0.96寸OLED(SSD1306驱动,I2C接口)
- 结构件:3D打印外壳(需留传感器悬空区域)
- 辅助材料:硅胶防震垫、磁吸式秤盘
关键提示:选择带金属保护罩的悬臂梁传感器,避免面粉进入导致短路。HX711模块建议选用带EMI滤波的版本。
硬件连接中最易出错的是传感器桥路接线。应变片通常组成惠斯通电桥,四根线中:
- 红色:激励正极(接HX711的E+)
- 黑色:激励负极(接E-)
- 白色:信号正(接A+)
- 绿色:信号负(接A-)
若测量出现负值,只需交换信号线极性。实际接线时可用万用表检测:激励端电阻通常为350Ω±5%,信号端在空载时应接近0mV。
2. 硬件电路设计与抗干扰处理
市面多数教程忽略的电磁兼容问题恰恰是厨房秤不稳定的主因。微波炉、破壁机工作时会产生强烈干扰,我们的解决方案是三级滤波:
- 电源滤波:在HX711的VCC与GND间并联100μF电解电容+0.1μF陶瓷电容
- 信号滤波:传感器输出端串接100Ω电阻并并联1nF电容
- 数字隔离:STM32与HX711间加入光耦隔离电路
具体电路连接如下表所示:
| 模块 | STM32引脚 | 连接要点 |
|---|---|---|
| HX711 DOUT | PA1 | 上拉10k电阻到3.3V |
| HX711 SCK | PA3 | 串接100Ω限流电阻 |
| OLED SCL | PB6 | 硬件I2C需开漏输出 |
| OLED SDA | PB7 | 走线远离模拟信号线 |
焊接完成后,用热熔胶固定所有连接处,避免震动导致接触不良。特别注意HX711模块应远离STM32的SWD调试接口,防止时钟信号干扰ADC采样。
3. 核心代码实现与优化技巧
HX711的驱动看似简单,但直接读取原始值会导致显示数值跳动。我们采用移动平均+卡尔曼滤波的组合算法:
#define SAMPLE_SIZE 10 typedef struct { float q; // 过程噪声协方差 float r; // 观测噪声协方差 float x; // 估计值 float p; // 估计误差协方差 float k; // 卡尔曼增益 } KalmanFilter; float KalmanUpdate(KalmanFilter* kf, float measurement) { kf->p = kf->p + kf->q; kf->k = kf->p / (kf->p + kf->r); kf->x = kf->x + kf->k * (measurement - kf->x); kf->p = (1 - kf->k) * kf->p; return kf->x; } uint32_t GetStableWeight() { static KalmanFilter kf = {0.001, 0.01, 0, 1, 0}; uint32_t sum = 0; for(uint8_t i=0; i<SAMPLE_SIZE; i++){ sum += HX711_Read(); DelayMs(5); } float avg = sum / (float)SAMPLE_SIZE; return (uint32_t)KalmanUpdate(&kf, avg); }校准流程采用两点标定法(空载和已知重量),通过线性插值计算斜率:
void Calibrate(uint32_t raw_empty, uint32_t raw_known, float known_weight) { float scale = known_weight / (raw_known - raw_empty); EEPROM_WriteFloat(ADDR_SCALE, scale); EEPROM_WriteU32(ADDR_OFFSET, raw_empty); }OLED显示优化技巧:
- 使用自定义大字库显示重量(24x32像素)
- 添加动态图标指示稳定状态
- 低功耗模式时关闭背光
4. 机械结构与用户体验优化
称重精度30%取决于机械结构设计。我们采用三层悬挂式结构:
- 顶层:固定STM32和OLED
- 中间层:弹簧减震系统
- 底层:传感器与可拆卸秤盘
防误操作设计:
- 双击复位键进入校准模式
- 长按3秒切换克/盎司单位
- 超过量程时闪烁警示
实测表明,加入2mm厚硅胶垫后,面粉倾倒时的数值波动减少70%。秤盘建议采用304不锈钢材质,既易于清洁又避免塑料变形影响精度。
最终成品待机电流仅1.2mA,2000mAh锂电池可连续使用3个月。若想进一步省电,可修改HX711为间歇采样模式:
void EnterLowPowerMode() { HX711_PowerDown(); OLED_DisplayOff(); STM32_StopMode(RTC_WAKEUP); }当传感器检测到重量变化时,通过外部中断唤醒系统。这种设计特别适合家庭间歇性使用场景。
