当前位置: 首页 > news >正文

用HX711和STM32做个智能厨房秤:代码、PCB与OLED显示全开源

从零打造智能厨房秤:STM32+HX711全流程开发指南

在烘焙和烹饪过程中,精确到克的食材称量往往决定了成品的成败。传统机械秤存在读数模糊、易受干扰的问题,而市售电子厨房秤又缺乏定制化功能。本文将带你用STM32F103C8T6和HX711模块打造一款支持OLED显示、去皮功能和单位切换的智能厨房秤,所有硬件设计文件与代码完全开源。

1. 硬件选型与系统架构

1.1 核心组件选型分析

称重传感器的选择直接影响测量精度。常见的电阻应变式传感器分为以下类型:

类型量程精度适用场景
悬臂梁式1-50kg±0.05%FS厨房秤、包裹秤
S型100kg-10t±0.02%FS工业称重
轮辐式500kg-50t±0.03%FS大型设备

厨房秤推荐使用5kg悬臂梁传感器,其典型参数如下:

  • 灵敏度:2.0±0.1mV/V
  • 非线性度:<0.03%FS
  • 重复性:<0.02%FS

HX711模块的电路设计要点:

// 典型连接方式 #define HX711_DOUT PA11 #define HX711_SCK PA12

注意:SCK引脚应配置为推挽输出,DOUT配置为浮空输入,时序延迟需严格遵循手册要求

1.2 STM32最小系统设计

采用STM32F103C8T6最小系统板时,需确保以下电路完备:

  • 3.3V稳压电路(AMS1117-3.3)
  • 8MHz晶振及负载电容
  • BOOT0/1配置电路
  • SWD调试接口

电源滤波特别重要,建议在HX711的AVDD引脚添加10μF钽电容并联0.1μF陶瓷电容。

2. 软件架构与核心算法

2.1 驱动程序开发

HX711的驱动关键在于精确的时序控制。以下是改进版的读取函数:

uint32_t HX711_Read(void) { uint32_t data = 0; // 等待数据就绪 while(GPIO_ReadInputDataBit(HX711_PORT, HX711_DOUT_PIN)); // 读取24位数据 for(uint8_t i=0; i<24; i++) { GPIO_SetBits(HX711_PORT, HX711_SCK_PIN); delay_us(1); data <<= 1; if(GPIO_ReadInputDataBit(HX711_PORT, HX711_DOUT_PIN)) data++; GPIO_ResetBits(HX711_PORT, HX711_SCK_PIN); delay_us(1); } // 设置下次转换通道和增益 GPIO_SetBits(HX711_PORT, HX711_SCK_PIN); delay_us(1); GPIO_ResetBits(HX711_PORT, HX711_SCK_PIN); return data ^ 0x800000; // 补码转换 }

2.2 数字滤波算法对比

称重系统需要处理传感器噪声,常见滤波方法效果对比:

  • 移动平均滤波

    • 实现简单,但响应速度慢
    • 适合静态称重场景
  • 中值滤波

    • 有效抑制脉冲干扰
    • 需要排序操作,消耗CPU资源
  • 卡尔曼滤波

    • 最优估计,但参数调优复杂
    • 适合动态称重场景

推荐改进型复合滤波算法:

float WeightFilter(float raw) { static float buf[5] = {0}; static uint8_t index = 0; // 更新采样窗口 buf[index++] = raw; if(index >= 5) index = 0; // 计算移动平均 float sum = 0; for(uint8_t i=0; i<5; i++) { sum += buf[i]; } return sum / 5; }

3. 用户界面设计与实现

3.1 OLED显示优化

使用SSD1306驱动的0.96寸OLED时,可设计如下界面布局:

+-------------------+ | 智能厨房秤 v1.0 | | | | 重量: 250.5 g | | | | [去皮] [单位] | +-------------------+

关键显示代码:

void UI_Refresh(void) { OLED_Clear(); OLED_ShowStr(20, 0, "智能厨房秤 v1.0", 1); char buf[16]; sprintf(buf, "重量: %.1f %s", current_weight, unit?"g":"oz"); OLED_ShowStr(10, 3, buf, 2); OLED_ShowStr(5, 6, "[去皮]", 1); OLED_ShowStr(70, 6, "[单位]", 1); }

3.2 按键功能实现

利用STM32的GPIO中断实现轻触按键:

// 按键初始化 void Key_Init(void) { GPIO_InitTypeDef gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; gpio.GPIO_Mode = GPIO_Mode_IPU; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio); // 配置外部中断 EXTI_InitTypeDef exti; NVIC_InitTypeDef nvic; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1); exti.EXTI_Line = EXTI_Line0 | EXTI_Line1; exti.EXTI_Mode = EXTI_Mode_Interrupt; exti.EXTI_Trigger = EXTI_Trigger_Falling; exti.EXTI_LineCmd = ENABLE; EXTI_Init(&exti); nvic.NVIC_IRQChannel = EXTI0_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 1; nvic.NVIC_IRQChannelSubPriority = 1; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); nvic.NVIC_IRQChannel = EXTI1_IRQn; NVIC_Init(&nvic); }

4. PCB设计与系统集成

4.1 四层板设计要点

智能厨房秤的PCB设计需特别注意:

  1. 模拟信号走线(传感器到HX711)

    • 尽量短且远离数字信号线
    • 采用包地处理
  2. 电源分区布局

    • 数字3.3V与模拟3.3V隔离
    • 使用磁珠或0Ω电阻连接
  3. 结构设计

    • 安装孔与传感器受力点对齐
    • 外壳按键位置预留

4.2 校准流程优化

采用两点校准法提高精度:

  1. 空载校准:记录零点AD值
  2. 满量程校准:放置已知重量砝码
  3. 计算斜率:k = (AD_full - AD_zero) / weight

校准参数存储到STM32的Flash:

typedef struct { float scale; int32_t offset; uint8_t checksum; } CalibParams; void Save_Calib(void) { CalibParams params; params.scale = current_scale; params.offset = current_offset; params.checksum = 0xA5; FLASH_Unlock(); FLASH_ErasePage(0x0800FC00); FLASH_ProgramHalfWord(0x0800FC00, *(uint16_t*)&params); FLASH_ProgramHalfWord(0x0800FC02, *((uint16_t*)&params+1)); FLASH_Lock(); }

实际测试发现,使用1kg和3kg两点校准比单点校准精度提高约0.1%。外壳采用ABS材料时,温度漂移可控制在0.05%/℃以内。

http://www.cnnetsun.cn/news/1505135.html

相关文章:

  • 19:L应用可解释AI:蓝队的透明防御
  • CH59x触摸按键避坑指南:基线校准异常/通道干扰的5种解决方法
  • 颈腰椎病引发 “脸红”可能是颈椎在 “报警”
  • FastAPI流式AI接口设计陷阱大全(2024高频真题+源码级调试实录)
  • 零基础入门PyTorch:在快马平台上手把手运行你的第一个深度学习模型
  • 如何用插件让系统监控更强大:新手也能轻松上手的完整指南
  • 嵌入式TCP行协议解析库TcpLineStream设计与应用
  • 百川2-13B模型微调指南:提升OpenClaw本地化任务准确率
  • CAN总线协议与报文格式详解
  • 百川2-13B-4bits模型量化对比:NF4与GPTQ在OpenClaw中的表现
  • 三步掌握EdgeRemover:Windows系统Edge浏览器专业卸载方案
  • 闽北哥-柔弱胜刚强:真正的强者,从不硬碰
  • Zabbix数据库清理优化实战:如何调整Housekeeper参数避免75%告警
  • 终极指南:使用Hackintool轻松配置黑苹果系统
  • 音频下载开源工具:实现批量下载与离线收听的高效解决方案
  • 百川2-13B模型提示工程:提升OpenClaw操作指令理解准确率
  • 安川伺服电机接线不求人:从220V电源到Pn00B设置,手把手搞定位脉冲+符号控制
  • 把 cursor 的工具活动栏改成垂直形式
  • DS3231高精度RTC驱动开发与低功耗唤醒实战
  • 语义分割实战:如何用Python快速计算mIoU和mAcc(附完整代码)
  • **Modbus协议深度解析:基于Python的TCP通信实战与发散创新应用**在工业自动化领域,**Modbus协议
  • Halcon仿射变换实战:手把手教你用vector_to_aniso和solve_matrix搞定图像配准(附完整代码)
  • Ubuntu22.04+CUDA12.4环境下ZED相机SDK 4.2保姆级安装指南(含Python API避坑)
  • 【轨物方案】市政与污水泵房治理:基于可视化大屏的智慧水务调度方案
  • 效率革命:用快马AI一键清洗与格式化万级邮箱地址列表
  • 如何用GetQzonehistory 3步备份QQ空间历史说说?超实用数据保存指南
  • 物联网测试:设备兼容性的“地狱级”挑战
  • 面试AI工具哪个好用?这款“外挂”助你斩获大厂Offer!
  • Python基础_数据库
  • SOME/IP服务发现(SD)避坑指南:从FindService到SubscribeACK,一次讲透所有配置参数与常见故障