用STM32F103C8T6做个厨房电子秤:HX711+OLED显示完整教程(附代码) 从零打造高精度厨房电子秤STM32F103C8T6与HX711的完美组合厨房里总少不了一台精准的电子秤无论是烘焙还是日常烹饪精确到克的测量都能显著提升成品质量。市面上商业电子秤虽然便宜但自己动手打造一台不仅能学习嵌入式开发全流程还能根据需求定制功能。本文将带你用最常见的STM32F103C8T6蓝莓开发板、HX711称重模块和0.96寸OLED屏打造一台精度可达0.1g的实用厨房秤。1. 硬件选型与设计思路1.1 核心器件选型对比选择适合厨房环境的硬件需要考虑成本、精度和易用性三个维度。我们对比了几种常见方案器件类型型号/规格单价范围精度适用场景MCUSTM32F103C8T610-15元-低成本高性价比称重传感器HX711铝合金应变片15-25元0.1-1g5kg以下称重显示模块SSD1306 0.96寸OLED8-12元-低功耗清晰显示供电方案18650锂电池5-8元-便携无绳设计为什么选择HX711而不是其他ADC这款24位ADC专为称重设计内部集成可编程放大器(PGA)能直接连接应变片而不需要额外信号调理电路。其内置的稳压电源还能为传感器供电简化了整个系统设计。1.2 机械结构设计要点厨房秤的精度很大程度上取决于机械结构。业余条件下可以用3D打印或亚克力制作外壳但需注意承重平台要刚性连接传感器避免侧向力影响四角支撑建议采用单点悬臂梁结构传感器与平台间加装硅胶缓冲垫减少冲击总高度控制在3-5cm便于收纳实际测试发现使用2mm厚亚克力板作为承重平台时在500g负载下会产生约0.3mm形变这会导致约0.5g的测量误差。改用1.5mm铝合金板后误差降至0.1g以内。2. 电路连接与信号处理2.1 硬件接线图解析整个系统只需要7根连接线不含电源HX711模块 -------- STM32F103C8T6 VCC 5V GND GND DOUT PA1 SCK PA3 OLED(I2C) ------- STM32F103C8T6 VCC 3.3V GND GND SCL PB6 SDA PB7关键细节HX711的DOUT引脚需要上拉电阻4.7KΩ即使使用I2C OLED也建议在SCL/SDA上加4.7KΩ上拉电源回路要尽量短避免引入噪声2.2 信号采集优化技巧HX711虽然使用简单但要获得稳定读数需要处理几个问题电源噪声抑制// 在初始化后延迟100ms等待电源稳定 DelayMs(100);数字滤波算法#define SAMPLE_TIMES 10 int32_t get_filtered_value() { int32_t sum 0; for(int i0; iSAMPLE_TIMES; i){ sum ReadCount(); DelayMs(5); // 间隔采样 } return sum/SAMPLE_TIMES; }温度补偿 应变片的灵敏度会随温度变化可以在代码中加入简单补偿float temp_compensate(float raw, float temp) { // 典型补偿系数-0.04%/°C return raw * (1 (temp - 25) * 0.0004); }3. 软件设计与校准流程3.1 核心代码架构整个程序采用模块化设计主要包含这几个部分hx711.c底层驱动处理时序和数据读取oled_ui.c显示界面和用户交互scale_core.c称重算法和校准逻辑main.c主循环和状态管理关键数据结构typedef struct { int32_t zero_offset; // 空载时的ADC值 float scale_factor; // 比例系数(g/count) uint8_t unit; // 单位(0g,1oz) float temp_factor; // 温度补偿系数 } ScaleConfig;3.2 三步校准法商用电子秤通常需要专业砝码校准但我们可用已知重量的物品如瓶装水代替零点校准空载状态下长按Tare键3秒自动记录当前ADC值为zero_offset量程校准void calibrate_scale(float known_weight) { int32_t raw get_filtered_value(); scale.scale_factor known_weight / (raw - scale.zero_offset); save_to_flash(); // 保存校准参数 }线性验证 用不同重量物品测试记录误差标称重量(g)测量值(g)误差(%)100100.20.2500499.7-0.0610001000.80.08实测发现使用500ml矿泉水瓶实际重量约518g作为校准重量时在0-2kg范围内误差可控制在0.3%以内。若用100g砝码校准误差可进一步降至0.1%。4. 功能扩展与实用技巧4.1 实用功能实现基础的称重功能之外还可以增加这些实用特性单位切换克/盎司/毫升针对液体自动关机5分钟无操作进入低功耗模式峰值保持记录搅拌过程中的最大重量配方模式累加多种配料重量实现毫升转换的简单方法float gram_to_ml(float grams, float density) { // 常见食材密度(g/ml): // 水1.0, 面粉0.59, 糖0.85 return grams / density; }4.2 常见问题排查遇到测量不稳定或不准时可以这样排查读数跳变大检查电源电压是否稳定建议用示波器看5V纹波确保应变片与HX711连接线长度20cm在DOUT和SCK线上加10pF电容滤波线性度差检查机械结构是否有干涉重新进行多点校准至少3个重量点尝试降低HX711的数据速率设置为10HzOLED显示异常确认I2C地址是否正确通常0x3C或0x78检查上拉电阻是否接好降低I2C时钟频率如从400kHz降到100kHz4.3 进阶改造方向如果想进一步提升性能可以考虑改用四线式称重传感器如HBM Z6FC3提高精度增加蓝牙模块连接手机APP记录数据使用触摸按键替代机械按键添加环境温湿度传感器进行补偿一个有趣的改造是增加过载保护功能当检测到超量程时自动切断传感器电源void check_overload(int32_t raw) { if(raw MAX_SAFE_VALUE) { GPIO_ResetBits(PWR_GPIO_PORT, PWR_PIN); show_error(OVERLOAD!); } }整个项目最耗时的部分不是编程而是机械结构调试。记得第一次测试时因为平台固定螺丝拧得太紧导致500g砝码显示成510g调整结构后立即恢复正常。这也印证了电子秤领域那句老话精度三分靠电路七分靠机械。