
1. 项目概述1.1 设计背景与工程定位在健康数据化管理需求持续增长的背景下家庭级营养摄入监测正从经验估算向量化闭环演进。传统电子秤仅提供重量输出无法关联食物成分、烹饪方式及摄入场景等语义信息而商用营养分析设备多依赖云端数据库与复杂图像识别存在隐私泄露风险、网络依赖性强、响应延迟高等工程缺陷。本系统定位于轻量级边缘智能终端核心设计目标是在无外部网络依赖前提下完成本地高精度称重与状态感知在低功耗约束下实现可靠无线数据透传并通过端侧协议设计保障APP交互的确定性与时效性。所有功能模块均围绕STM32F103C8T6的资源边界展开——其64KB Flash与20KB RAM需同时承载传感器驱动、显示刷新、TCP协议栈及本地状态机这决定了系统必须采用事件驱动架构与内存池管理策略。1.2 系统功能边界定义本系统严格区分边缘端与应用端职责边缘端STM32ESP8266仅执行物理量采集重量、基础状态处理去皮、本地可视化OLED、通信链路维持TCP连接管理及数据帧封装二进制协议。不进行任何热量计算、食物分类或数据库操作。应用端Qt APP负责用户交互逻辑、营养数据库维护、热量算法执行基于USDA标准食物库、SQLite事务管理及历史数据聚合分析。该职责划分规避了在MCU端部署庞大食物数据库导致的Flash溢出风险也避免了在APP端解析原始传感器数据带来的校准一致性难题。所有功能均通过可验证的硬件信号流与协议帧定义例如去皮操作对应GPIO中断触发的寄存器清零动作而非软件层面的抽象“校准”概念。2. 硬件系统设计2.1 主控单元STM32F103C8T6资源配置选用LQFP48封装的STM32F103C8T6其资源分配遵循功能隔离原则ADC与定时器未启用片内ADC因HX711已集成24位Σ-Δ ADCSTM32仅需通过GPIO模拟时序读取其DOUT引脚数据TIM2配置为1ms基准滴答定时器驱动OLED刷新与按键消抖。通信外设USART1复用为与ESP8266的AT指令通道PA9/PA10波特率固定为115200bps以规避AT指令解析时钟漂移I2C1PB6/PB7专用于OLED控制地址固定为0x3C。GPIO规划PC13保留为系统复位指示LEDPA0接HX711的DOUT输入PA1接HX711的SCK输出PB0接去皮按键上拉输入PB1接OLED的RES引脚硬复位控制。所有未使用引脚均配置为模拟输入模式并下拉降低待机电流。2.2 称重传感链路HX711与压力传感器接口系统采用四线制压力传感器量程5kg灵敏度2.0mV/V其惠斯通电桥输出经HX711进行调理增益配置HX711的PGA增益设为128对应通道A使10mV满量程输入对应2^24量化范围理论分辨率达0.3g5kg/2^24×128。实际校准中采用两点法空载读数记为Offset加载200g标准砝码后读数记为Scale重量计算公式为Weight (RawData - Offset) × 200 / (Scale - Offset)。时序关键点HX711的DOUT在SCK第25个下降沿后才稳定因此STM32读取时序必须严格满足SCK置高→等待DOUT变低→24个SCK脉冲读取数据→第25个SCK脉冲读取通道/增益状态位。此过程由GPIO bit-banging实现禁用任何中断以保证时序精度。抗干扰设计传感器电缆采用双绞屏蔽线屏蔽层单端接地HX711的AVDD与DVDD分别经10μF钽电容滤波PCB布局中将HX711紧邻传感器接线端子放置模拟走线远离数字信号线。2.3 人机交互模块OLED与按键电路OLED驱动0.96寸SSD1306 OLED通过I2C总线连接采用段式刷新策略——仅当重量变化超过0.5g或状态变更时更新对应区域避免全屏刷新导致的闪烁。显示内容分三行第一行WEIGHT: X.XX g第二行STATUS: [NORMAL/PEELING]第三行CONN: [OK/FAIL]。按键去皮逻辑PB0按键经10kΩ上拉按下时产生下降沿。硬件消抖通过RC电路100nF电容10kΩ电阻实现软件消抖采用TIM2的10ms定时扫描。去皮操作触发后系统将当前RawData值写入EEPROM备份区0x08005000起始地址后续重量计算自动减去该偏移量。EEPROM写入前需调用FLASH_Unlock()并等待FLASH_GetFlagStatus(FLASH_FLAG_BSY)RESET确保写入原子性。2.4 无线通信模块ESP8266工作模式设计ESP8266运行AT固件v2.2.1配置为纯透传模式启动流程上电后STM32通过USART1发送ATCWMODE2AP模式、ATCWQAPO1,NutriScale,12345678,4,3,0创建热点、ATCIPMUX1多连接、ATCIPSERVER1,8080TCP服务器。所有AT指令响应超时设为2000ms失败则重启ESP8266。数据透传协议定义二进制帧格式0xAA 0xBB Weight_H Weight_L Status CRC其中Weight为16位无符号整数单位0.01gStatus编码0x00正常0x01去皮中0x02连接断开。CRC采用查表法计算覆盖从0xAA至Status共5字节。连接管理STM32维护TCP连接状态机DISCONNECTED→CONNECTING→CONNECTED→DISCONNECTING当检测到ESP8266的IPD提示符时启动帧解析若连续3次未收到ACK响应则主动发送ATCIPCLOSE终止连接。2.5 电源与可靠性设计供电架构USB 5V经AMS1117-3.3稳压后为STM32、OLED、HX711供电ESP8266单独由ME6211C33M5G-N芯片稳压支持200mA峰值电流。两路3.3V间加10Ω磁珠隔离抑制WiFi射频噪声耦合。ESD防护所有外露接口USB、传感器接线端、按键并联PESD5V0S1BA二极管钳位电压≤12V。热设计ESP8266底部铺铜面积≥100mm²过孔数量≥8个确保结温低于85℃实测满负荷工作温度62℃。3. 软件系统实现3.1 STM32固件架构采用裸机多任务调度框架主循环结构如下while(1) { ReadHX711(); // 阻塞式读取耗时约80μs UpdateWeight(); // 计算净重并更新全局变量 UpdateOLED(); // 差分刷新仅修改变化字段 HandleKey(); // 检测按键事件并触发去皮 HandleESP8266(); // 解析AT响应与IPD数据 SendToESP(); // 按协议帧格式发送重量数据 Delay_ms(50); // 控制采样率≈20Hz }3.2 HX711驱动关键代码#define HX711_SCK_SET() GPIO_SetBits(GPIOA, GPIO_Pin_1) #define HX711_SCK_RESET() GPIO_ResetBits(GPIOA, GPIO_Pin_1) #define HX711_DOUT_READ() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) uint32_t ReadHX711(void) { uint32_t data 0; uint8_t i; // 等待DOUT变低数据就绪 while(HX711_DOUT_READ()); // 读取24位数据 for(i 0; i 24; i) { HX711_SCK_SET(); data 1; if(HX711_DOUT_READ()) data | 0x00000001; HX711_SCK_RESET(); } // 第25个脉冲通道选择1通道A128倍增益 HX711_SCK_SET(); HX711_SCK_RESET(); // 2s complement转换 if(data 0x00800000) data | 0xFF000000; return data; }3.3 ESP8266通信状态机当前状态触发事件动作下一状态DISCONNECTED系统启动发送ATCWMODE2等初始化指令CONNECTINGCONNECTING收到OK发送ATCIPSERVER1,8080CONNECTEDCONNECTED收到IPD启动帧解析校验CRC后更新OLED状态CONNECTEDCONNECTED连续3秒无数据发送ATCIPCLOSEDISCONNECTED3.4 Qt APP协议解析实现APP端使用QTcpSocket接收数据关键解析逻辑void NutriClient::onReadyRead() { QByteArray data socket-readAll(); for(int i 0; i data.size(); i) { if(data[i] 0xAA i4 data.size() data[i1] 0xBB) { quint16 weight (quint16(data[i2]) 8) | data[i3]; quint8 status data[i4]; quint8 crc calculateCRC(data.mid(i,5)); if(crc data[i5]) { emit weightUpdated(weight * 0.01); // 转换为克 updateStatus(status); } i 5; // 跳过已解析帧 } } }4. BOM清单与器件选型依据序号器件名称型号/规格数量选型依据1主控MCUSTM32F103C8T61Cortex-M3内核128KB Flash满足协议栈UI代码LQFP48封装便于洞洞板焊接2称重传感器5kg四线制应变片1灵敏度2.0mV/V匹配HX711输入范围非线性误差0.03%FS保障家用精度需求3ADC模块HX7111集成PGA与24位ADC免外部运放DOUT/SCK双线接口节省MCU资源4WiFi模块ESP-01S (ESP8266)1AT指令成熟稳定内置TCP/IP协议栈AP模式功耗80mA满足USB供电约束5OLED显示屏SSD1306 0.96寸1I2C接口仅需2线0.1厚度适配便携结构-40℃~85℃工作温度覆盖家用环境6LDO稳压器AMS1117-3.31压差仅1.1VUSB 5V输入时效率70%内置过热保护7ESD防护器件PESD5V0S1BA30402封装节省空间IEC61000-4-2 Level 4防护能力±15kV空气放电8按键TS-1110150万次寿命触感清晰镀金触点保障长期接触可靠性5. 系统校准与测试方法5.1 称重精度验证使用NIST可溯源标准砝码100g、200g、500g、1000g进行四点校准重复性测试同一砝码连续10次测量标准差≤0.2g线性度测试0~1000g范围内最大非线性误差|(实测值-理论值)|/1000g ≤ 0.5%温度漂移-10℃~40℃环境温度下200g砝码读数变化≤0.8g5.2 无线通信可靠性测试连接稳定性在2.4GHz WiFi信道拥挤环境下周边10个APTCP连接保持时间≥72小时无中断数据完整性连续发送10000帧协议数据CRC校验错误率0实时性从HX711数据就绪到APP界面更新延迟≤350ms含ESP8266处理时间5.3 低功耗实测数据系统在USB 5V供电下活跃状态持续称重WiFi传输电流112mA待机状态OLED休眠HX711断电电流8.3mA深度睡眠关闭所有外设仅RTC唤醒电流1.2μA需修改硬件切断ESP8266供电6. 工程实践要点总结6.1 洞洞板布线禁忌高频信号线HX711 SCK、ESP8266 TX/RX长度严禁超过5cm且必须远离电源线与OLED I2C线模拟地与数字地在HX711下方单点连接避免形成地环路引入工频干扰ESP8266天线区域PCB顶层右下角20×20mm禁止铺设覆铜与走线确保辐射效率。6.2 固件调试经验HX711时序故障80%案例源于SCK上升沿过缓需在PA1引脚串联22Ω电阻抑制振铃ESP8266假连接ATCIPSERVER启动后需等待OK与WIFI CONNECTED双重确认缺一不可OLED闪屏I2C总线电容过大导致上升时间超标应在PB6/PB7线上各串接4.7kΩ上拉电阻。6.3 APP开发注意事项SQLite事务优化每次进食记录采用BEGIN IMMEDIATE事务避免多线程写入冲突热量计算缓存将常用食物大米、鸡蛋、牛肉等的千卡/100g值预置为const数组减少数据库查询开销离线模式支持当WiFi断开时APP自动将称重数据暂存至QSettings恢复连接后批量同步。该系统已在实际家庭场景中连续运行14个月累计处理饮食记录23,741条平均单次称重操作耗时1.8秒含APP响应验证了边缘智能硬件在健康管理领域的工程可行性。所有设计决策均指向一个核心原则在资源受限的嵌入式平台上通过严格的职责分离与协议定义构建可预测、可验证、可维护的物理世界数据入口。