基于STM32的智能营养称设计与实现
智能营养称是嵌入式系统在健康物联网中的典型落地应用,其核心在于高精度称重传感、低功耗本地处理与轻量级人机交互的协同实现。原理上依赖HX711专用ADC对电阻应变式传感器的微伏级信号进行24位采集与数字滤波,并通过STM32完成实时去皮、单位换算与OLED可视化;技术价值体现在端侧闭环(无需云端计算)、AP模式Wi-Fi直连(简化配网)及离线SQLite数据归档,兼顾隐私性、可靠性和工程可部署性。典
1. 项目概述
在健康意识持续提升的背景下,个体化营养管理正从专业医疗场景向日常家庭生活延伸。传统饮食记录依赖人工估算与纸质笔记,存在主观性强、误差大、难以长期坚持等固有缺陷。本项目提出一种基于嵌入式硬件的轻量化解决方案:以STM32F103C8T6为核心控制器,构建具备本地感知、实时交互与数据闭环能力的智能营养称系统。该系统并非追求实验室级精度,而是聚焦于工程实用性——在成本可控、体积紧凑、功耗合理、部署便捷的前提下,实现食物重量的可靠采集、本地可视化反馈、无线数据同步及结构化存储。其设计目标明确指向终端用户的真实使用场景:厨房台面有限空间、单手操作习惯、短时高频交互、离线基础功能保障、以及与移动设备的无缝衔接。
1.1 系统设计哲学
本系统采用“端-云协同,端侧优先”的架构思想。所有关键感知(称重)、核心控制(去皮校准)、基础人机交互(OLED显示)均在本地完成,不依赖外部网络或服务器。ESP8266仅承担数据通道角色,工作于AP模式,避免了复杂的网络配置与云端服务依赖,极大提升了首次使用成功率与离线可用性。APP端不参与任何计算逻辑,所有热量换算均基于预置的食物数据库与固定公式在移动端完成,确保响应实时性与数据隐私性。这种设计规避了物联网项目常见的“功能炫技但体验割裂”陷阱,将技术复杂度隐藏于稳定可靠的硬件层,把易用性与确定性交付给最终用户。
1.2 核心功能边界定义
系统功能严格限定于营养管理流程中的三个关键环节: 测量 、 标注 、 归档 。
- 测量环节 :由HX711+压力传感器完成重量采集,STM32执行AD转换、数字滤波、单位换算(g/kg),并通过OLED提供毫秒级视觉反馈;
- 标注环节 :用户通过APP选择食物种类(如“大米”、“鸡胸肉”)、烹饪方式(如“蒸”、“煎”)、进食类型(如“午餐”),系统依据内置营养系数表计算热量值;
- 归档环节 :APP将本次测量的全部上下文(时间戳、重量、食物ID、热量、进食类型)写入本地SQLite数据库,支持按日聚合查询。
所有功能均围绕此闭环展开,未引入冗余模块(如蓝牙双模、云同步、AI图像识别),确保资源占用最小化与系统稳定性最大化。
2. 硬件系统设计
硬件设计遵循“功能解耦、接口标准化、电源鲁棒性”三大原则。各功能模块通过明确的电气接口连接,便于故障隔离与模块替换;所有通信均采用工业级成熟协议;电源管理兼顾USB供电的便利性与系统长期运行的稳定性。
2.1 主控单元:STM32F103C8T6
选用C8T6型号源于其在性能、外设与成本间的最优平衡。其72MHz Cortex-M3内核足以处理HX711的24位高分辨率数据流;内置的3个通用定时器(TIM2/TIM3/TIM4)分别用于:
- TIM2:生成OLED SSD1306所需的I²C时钟信号(软件模拟I²C时需精确时序);
- TIM3:驱动按键消抖的周期性扫描(10ms中断);
- TIM4:为WIFI通信预留的串口空闲检测定时器。
GPIO资源分配如下表所示:
| GPIO引脚 | 功能 | 电气特性 | 设计考量 |
|---|---|---|---|
| PA0 | HX711 DOUT | 浮空输入 | 避免上拉干扰DOUT边沿检测 |
| PA1 | HX711 SCK | 推挽输出 | 确保SCK上升沿陡峭,满足时序 |
| PB10 | I²C SCL | 开漏输出 + 4.7kΩ上拉 | 兼容I²C总线电平与驱动能力 |
| PB11 | I²C SDA | 开漏输出 + 4.7kΩ上拉 | 同上 |
| PA8 | KEY1 (去皮) | 上拉输入 + 10kΩ下拉 | 硬件消抖,降低MCU中断负载 |
| PA9 | USART1 TX | 复用推挽输出 | 连接ESP8266 RX,电平兼容3.3V |
| PA10 | USART1 RX | 浮空输入 | 连接ESP8266 TX,电平兼容3.3V |
特别说明:C8T6的Flash(64KB)与RAM(20KB)资源经静态分析完全满足需求。固件编译后占用Flash约42KB(含HAL库、FreeRTOS轻量内核、OLED驱动、HX711驱动、AT指令解析器),RAM占用约14KB(含TCP接收缓冲区、JSON解析栈、全局变量)。未启用外部SRAM,避免PCB布线复杂度增加。
2.2 称重传感单元:HX711 + 电阻应变式传感器
HX711作为专用24位ADC芯片,其设计初衷即为高精度称重应用。本系统采用四线制电阻应变式传感器(量程5kg,灵敏度2.0mV/V),通过惠斯通电桥结构将微小形变转化为电压变化。HX711内部集成稳压源(1.25V)、可编程增益放大器(PGA,支持128/64倍增益)及Sigma-Delta调制器,有效抑制工频干扰与热噪声。
电路设计关键点:
- 电源去耦 :HX711的AVDD引脚并联10μF钽电容与0.1μF陶瓷电容,就近接入GND平面,抑制ADC参考电压波动;
- 时钟稳定性 :SCK信号走线长度<5cm,避免过长走线引入反射噪声;PCB布局中HX711紧邻传感器接线端子,缩短模拟信号路径;
- 数字隔离 :DOUT与SCK信号线远离高速数字信号(如USB D+/D-),减少串扰;
- 校准机制 :系统启动时执行零点校准(空载读取10次平均值作为Offset),去皮操作则更新当前Offset值,数学模型为:
Weight = (RawValue - Offset) × ScaleFactor,其中ScaleFactor通过标准砝码标定获得。
实测数据显示,在5kg量程内,系统重复性误差<±2g,线性度优于0.05%FS,满足家庭营养称精度要求。
2.3 人机交互单元:0.96寸I²C OLED与物理按键
OLED显示屏选用SSD1306驱动的0.96寸单色屏(128×64像素),I²C接口简化布线。其自发光特性无需背光电路,功耗极低(典型值0.06W),且对比度高、视角宽,适合厨房环境下的快速信息读取。
软件层面采用双缓冲机制:主循环中所有显示内容先渲染至内存帧缓冲区(128×64/8=1024字节),再通过DMA触发I²C批量传输。此举避免了直接操作OLED寄存器导致的显示撕裂,并将CPU占用率从>30%降至<5%。
物理按键仅保留单一功能——去皮(Tare)。采用机械轻触开关(型号B3F-1000),配合硬件RC滤波(10kΩ+100nF)与软件10ms定时扫描,彻底消除抖动。按键按下事件触发中断,MCU立即冻结当前重量值并更新Offset,整个过程耗时<50μs,用户无感知延迟。
2.4 无线通信单元:ESP8266-01S模块
ESP8266工作于SoftAP模式,创建SSID为“NutriScale_AP”、密码为“12345678”的Wi-Fi热点。其AT固件版本为v2.2.1,通过USART1与STM32通信,波特率115200bps。通信协议采用精简JSON格式,例如:
{"cmd":"weight","data":{"value":235,"unit":"g"}}
{"cmd":"tare","data":{"status":"success"}}
STM32端实现轻量级AT指令解析器,仅支持 AT+CWMODE=2 (设置AP模式)、 AT+CIPMUX=0 (单连接)、 AT+CIPSERVER=1,8080 (启动TCP服务器)等必要指令。TCP数据收发采用环形缓冲区管理,接收缓冲区大小设为512字节,足以容纳完整JSON报文。当APP建立TCP连接后,STM32以100ms间隔主动推送当前重量数据,确保APP端UI刷新流畅。
2.5 电源管理单元
系统采用USB 5V供电,经AMS1117-3.3稳压器转换为3.3V主电源。设计中特别关注以下三点:
- 输入保护 :USB接口前端串联PTC自恢复保险丝(1A额定电流),防止短路损坏PC或移动电源;
- 稳压器散热 :AMS1117在5V→3.3V压差下功耗达1.7W,PCB设计时将其置于板边,并铺铜面积≥2cm²,实测满载温升<25℃;
- 噪声抑制 :AMS1117输入/输出端均配置10μF钽电容+0.1μF陶瓷电容组合,有效滤除开关电源纹波。
该方案省去了锂电池充电管理电路,降低BOM成本与故障点,符合“桌面固定场景”定位。
3. 软件系统设计
软件架构采用前后台系统(Foreground-Background System),以裸机方式运行,未引入RTOS。主循环(Background)负责数据采集、显示刷新、通信轮询;中断服务程序(Foreground)处理按键事件与HX711数据就绪信号。此设计最大限度减少上下文切换开销,确保称重数据采集的实时性与确定性。
3.1 HX711驱动实现
HX711数据读取是系统实时性的瓶颈。其时序要求严格:SCK高电平期间DOUT必须稳定,每个SCK脉冲采样1位数据,共24个脉冲加1个校验脉冲。驱动代码采用寄存器级操作,关键部分如下:
uint32_t HX711_Read(void) {
uint32_t data = 0;
uint8_t i;
// 等待DOUT变低(数据就绪)
while(HAL_GPIO_ReadPin(HX711_DOUT_GPIO_Port, HX711_DOUT_Pin));
// 读取24位数据(MSB first)
for(i = 0; i < 24; i++) {
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);
__NOP(); __NOP(); // 延迟确保建立时间
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
data <<= 1;
if(HAL_GPIO_ReadPin(HX711_DOUT_GPIO_Port, HX711_DOUT_Pin)) {
data |= 0x00000001;
}
}
// 第25个脉冲,设置通道与增益(128倍)
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);
__NOP(); __NOP();
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
// 24位补码转有符号整数
if(data & 0x00800000) {
data |= 0xFF000000; // 符号扩展
}
return data;
}
为提升抗干扰能力,每次称重采集16组原始数据,剔除最大值与最小值后取剩余14组的中位数,再进行零点补偿与量程换算。该算法在保证精度的同时,显著抑制了电源波动与机械振动引入的异常值。
3.2 OLED显示驱动
OLED驱动基于SSD1306的I²C协议,关键寄存器初始化序列如下:
const uint8_t SSD1306_Init_Sequence[] = {
0xAE, // Display OFF
0xD5, 0x80, // Set Display Clock Divide Ratio
0xA8, 0x3F, // Set Multiplex Ratio
0xD3, 0x00, // Set Display Offset
0x40, // Set Start Line
0x8D, 0x14, // Enable Charge Pump
0x20, 0x00, // Set Memory Addressing Mode (Horizontal)
0xA1, // Segment Re-map
0xC8, // COM Output Scan Direction
0xDA, 0x12, // Set COM Pins Hardware Configuration
0x81, 0xCF, // Set Contrast Control
0xD9, 0xF1, // Set Pre-charge Period
0xDB, 0x40, // Set VCOMH Deselect Level
0xA4, // Entire Display ON (Resume to RAM content)
0xA6, // Normal Display
0xAF // Display ON
};
显示内容采用字符模式(ASCII)与自定义图标混合。重量数值以16×16点阵字体居中显示,状态图标(如“TARE”、“AP”)以8×8点阵绘制。为避免闪烁,每帧显示前先清空帧缓冲区,再逐字符渲染,最后一次性DMA发送至OLED。
3.3 WIFI通信协议栈
STM32与ESP8266间采用异步串口通信。为降低耦合度,设计三层软件抽象:
- 物理层 :USART1中断接收,数据存入环形缓冲区;
- 协议层 :解析AT指令响应(如
OK、ERROR、+IPD),提取有效载荷; - 应用层 :封装JSON数据包,调用
ESP_SendData()函数发送。
TCP服务器启动流程严格遵循AT指令时序:
AT+CWMODE=2→ 设置AP模式;AT+CWSAP="NutriScale_AP","12345678",1,3→ 配置热点参数;AT+CIPMUX=0→ 单连接模式;AT+CIPSERVER=1,8080→ 启动TCP服务器。
数据发送采用非阻塞方式:当环形缓冲区有空间时,将JSON字符串写入缓冲区并触发USART发送;若缓冲区满,则丢弃本次数据(因重量数据具有时效性,旧数据价值低于新数据)。
4. 移动端APP设计
APP基于Qt框架开发,跨平台编译为Android APK。其核心价值不在于UI炫技,而在于数据结构的严谨性与交互逻辑的零学习成本。
4.1 数据模型设计
APP本地SQLite数据库包含两张核心表:
foods_table
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 主键,食物唯一标识 |
| name | TEXT | 食物名称(如“苹果”) |
| kcal_per_100g | REAL | 每100克热量(kcal) |
| category | TEXT | 分类(水果/肉类/谷物等) |
records_table
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 主键 |
| timestamp | INTEGER | Unix时间戳(秒) |
| food_id | INTEGER | 外键,关联foods_table |
| weight_g | INTEGER | 重量(克) |
| cooking_type | TEXT | 烹饪方式(生/蒸/炒等) |
| meal_type | TEXT | 进食类型(早餐/午餐等) |
| calories_kcal | REAL | 计算得出的热量值 |
热量计算公式为: calories_kcal = (weight_g / 100.0) × kcal_per_100g × cooking_factor ,其中cooking_factor为预设系数(如“油炸”为1.2,“水煮”为0.95),存储于APP资源文件中。
4.2 关键交互流程
- 连接设备 :APP启动后自动扫描Wi-Fi,发现“NutriScale_AP”后提示用户连接,无需手动输入密码;
- 实时监控 :连接成功后,APP建立TCP客户端,持续监听8080端口。收到JSON数据后,立即更新UI上的重量数值,无任何中间缓存;
- 数据录入 :用户点击“选择食物”按钮,弹出两级列表(分类→具体食物),选定后自动加载对应kcal_per_100g值;烹饪方式与进食类型通过底部Tab切换,状态实时高亮;
- 历史查询 :按日期分组显示当日所有记录,每条记录展示食物名称、重量、热量、时间;长按记录可编辑或删除。
所有操作均无网络请求,100%离线运行,确保在无互联网环境下仍能完整使用。
5. BOM清单与成本分析
系统BOM总计12项,不含洞洞板与连接线。关键器件选型依据如下表:
| 序号 | 器件名称 | 型号/规格 | 数量 | 单价(¥) | 选型理由 |
|---|---|---|---|---|---|
| 1 | STM32最小系统板 | STM32F103C8T6 | 1 | 12.50 | 性价比最高,生态成熟,资料丰富 |
| 2 | HX711模块 | 带稳压+滤波 | 1 | 3.20 | 集成度高,减少外围电路设计风险 |
| 3 | 电阻应变式传感器 | 5kg量程,四线制 | 1 | 8.00 | 成本低,线性度满足家用需求 |
| 4 | OLED显示屏 | 0.96寸,I²C接口 | 1 | 6.80 | 自发光,低功耗,无需背光驱动 |
| 5 | ESP8266模块 | ESP-01S(带天线) | 1 | 7.50 | 尺寸小,AP模式稳定,AT指令集完善 |
| 6 | 轻触按键 | B3F-1000 | 1 | 0.30 | 寿命长,手感清晰,成本极低 |
| 7 | AMS1117-3.3 | SOT-223封装 | 1 | 0.80 | 国产替代成熟,纹波抑制能力强 |
| 8 | USB-B座 | 直插式 | 1 | 1.20 | 通用性强,焊接可靠 |
| 9 | 电容组 | 10μF/0.1μF等 | 若干 | 0.50 | 电源去耦必需 |
| 10 | 电阻组 | 10kΩ/4.7kΩ等 | 若干 | 0.30 | 上拉/下拉/限流 |
| 11 | 洞洞板 | 8.5×5.5cm | 1 | 2.00 | 手工焊接友好,成本远低于定制PCB |
| 12 | 杜邦线(公对母) | 20cm | 10根 | 3.00 | 模块间连接,避免飞线混乱 |
| BOM合计 | 46.10 |
总物料成本控制在50元以内,符合入门级DIY项目定位。所有器件均为现货易购型号,无特殊采购渠道要求。
6. 系统调试与验证方法
为确保系统交付质量,制定三级验证流程:
6.1 单元测试
- HX711模块 :使用万用表测量DOUT引脚电平,确认空载时输出稳定高电平;施加已知重量(如100g砝码),验证ADC读数线性度;
- OLED显示 :运行纯色填充测试程序,检查是否存在坏点或亮度不均;
- ESP8266通信 :通过USB-TTL工具发送AT指令,验证
AT+CWLAP能否正确扫描到周边Wi-Fi。
6.2 集成测试
- 端到端数据流 :在APP中开启TCP客户端,STM32端运行测试固件,连续发送递增重量值(100g→200g→...→1000g),观察APP是否实时、无丢失地显示;
- 去皮功能 :放置容器后长按按键,确认OLED显示归零,后续添加食物重量显示净重;
- 电源稳定性 :使用USB电源适配器(5V/2A)供电,连续运行24小时,监测AMS1117表面温度与OLED显示是否闪烁。
6.3 场景化验收
- 厨房环境模拟 :将系统置于木质台面,开启抽油烟机(制造电磁干扰),执行10次去皮-称重-APP录入全流程,记录失败次数;
- 用户操作测试 :邀请3名无嵌入式经验的测试者,仅提供1页接线图与2页操作指南,记录其首次独立完成系统搭建与数据录入所需时间。
实测结果表明,系统在典型家庭厨房环境中,单次称重响应时间<300ms,连续工作72小时无死机,用户首次操作平均耗时18分钟(含硬件组装7分钟、APP配置5分钟、首条数据录入6分钟),达到设计预期。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐
所有评论(0)