基于STM32的智能称重系统设计 - 蓝牙版

若该文为原创文章,转载请注明原文出处。

摘要: 本文设计并实现了一种以STM32F103C8T6单片机为核心的智能称重系统。系统采用HX711模块连接应变式称重传感器进行高精度重量采集,支持去皮和超重报警功能。通过4x4矩阵键盘进行产品选择、单价设置等操作,并通过OLED显示屏实时显示重量、单价、总额等信息。集成DS18B20温度传感器用于环境监测,超温时报警。同时,系统集成HC-05蓝牙模块,可与手机APP通信,实现参数的远程设置与监控。测试结果表明,该系统称重准确、功能完整、人机交互友好,满足了商业智能称重的基本需求。
关键词: STM32;电子秤;HX711;矩阵键盘;蓝牙;温度监测


一、引言

(一)研究背景及意义

电子秤已广泛应用于商业零售、工业生产、实验室等各个领域。传统电子秤功能单一,管理不便,无法满足现代商业对数据记录、远程管理和智能预警的需求。随着嵌入式技术和物联网技术的发展,智能称重系统成为发展趋势。本项目旨在设计一款具备本地操作、蓝牙远程控制、温度补偿和报警功能的智能称重系统,能够提升称重过程的效率、准确性和智能化水平,具有很高的实用价值和市场前景。

(二)国内外研究现状

目前市面上的电子秤产品主要分为两类:一类是传统的独立电子秤,功能简单;另一类是联网智能秤,通常通过RS485或WiFi与PC管理系统连接,多见于超市、物流等专业领域。然而,成本低廉、可通过通用手机APP进行灵活配置的蓝牙智能秤仍有较大市场空间。本设计结合了传统秤的独立操作性和智能秤的联网优势,提供了一个高性价比、高集成度的解决方案。

二、系统总体设计

(一)系统架构

系统采用双交互通道设计:

  1. 本地通道: 用户通过矩阵键盘和OLED屏与系统交互,完成所有称重功能。

  2. 远程通道: 用户通过手机APP经由蓝牙与系统交互,进行功能设置和监控。
    STM32作为核心控制器,处理来自所有外设的数据和执行逻辑。

(二)功能模块划分

  1. 主控模块: STM32F103C8T6。

  2. 数据采集模块: HX711(重量)、DS18B20(温度)。

  3. 人机交互模块: 4x4矩阵键盘、OLED显示屏、蜂鸣器。

  4. 通信模块: HC-05蓝牙模块。

  5. 电源模块: 为系统提供稳定供电。

三、硬件设计与实现

(一)系统硬件框架图

系统硬件配置与功能说明表

1. 主控单元

器件名称推荐型号接口功能说明
STM32单片机STM32F103C8T6-作为系统核心,负责重量采集、温度监测、价格计算、数据显示和通信处理。

2. 传感器与输入单元

器件名称推荐型号/类型接口功能说明
称重传感器应变片传感器 + HX711GPIO (DT, SCK)高精度重量检测,量程0-10kg,精度±1g,支持去皮功能。
温度传感器DS18B20单总线监测环境温度,范围-55°C至+125°C,精度±0.5°C。
4×4矩阵键盘16键薄膜键盘GPIO功能:数字输入、产品选择、去皮、确认、取消、设置等。
蓝牙模块HC-05UART与手机APP通信,实现远程控制和数据监控。

3. 执行器单元

器件名称推荐型号/类型接口功能说明
OLED显示屏SSD1306I²C显示重量、单价、总价、产品类型、温度等信息。
蜂鸣器5V有源蜂鸣器GPIO超重报警、温度异常报警、操作提示音。
状态指示灯RGB LEDPWM显示系统状态:绿色(正常)、蓝色(蓝牙连接)、红色(报警)。

核心功能逻辑说明

1. 称重与计价功能

  • 重量采集

    • HX711实时采集重量数据

    • 支持去皮功能:去除容器重量

    • 重量单位:克(g)或千克(kg)

  • 计价算法

    • 总价 = 重量 × 单价

    • 支持不同产品不同单价

    • 金额计算精确到分

2. 产品管理功能

  • 产品选择

    • 预设多种产品类型(苹果、香蕉、橙子等)

    • 每种产品可设置不同单价

    • 通过键盘或APP选择产品

  • 价格设置

    • 管理员模式设置单价

    • 支持价格调整和更新

3. 安全保护系统

  • 超重保护

    • if (重量 > 最大重量阈值) { 蜂鸣器报警; OLED显示"超重警告"; }

  • 温度保护

    • if (温度 > 温度阈值) { 蜂鸣器报警; OLED显示"温度异常"; }

4. OLED显示界面

称重状态显示:
----------------
产品: 苹果
单价: 12.50元/kg
重量: 1.255 kg
总价: 15.69 元
温度: 25.5°C
----------------

报警状态显示:
----------------
   超重警告!
最大重量: 5.0kg
----------------

5. 键盘操作功能

  • 数字键0-9: 输入数字

  • A键: 选择产品

  • B键: 去皮功能

  • C键: 确认/设置

  • D键: 取消/返回

  • #键: 进入设置模式

  • *: 清除输入

6. 蓝牙APP功能

  • 产品选择: 远程选择产品类型

  • 价格设置: 远程设置商品单价

  • 参数配置: 设置最大重量、温度阈值

  • 数据监控: 实时查看称重数据

  • 历史记录: 查看交易记录

四、软件设计与实现

(一)开发环境搭建

  • IDE: STM32CubeIDE

  • 库: HAL库

  • 配置工具: STM32CubeMX用于配置引脚、时钟、I2C、UART等。

(二)系统软件流程图

(三)关键功能代码片段

1. HX711读取与校准(代码片段)
// 全局变量
long HX711_Offset = 0; // 皮重偏移量
float HX711_Scale = 1.0f; // 校准系数

// 读取HX711 ADC值
long HX711_Read(void) {
    while(HAL_GPIO_ReadPin(HX711_DT_GPIO_Port, HX711_DT_Pin) == GPIO_PIN_SET); // 等待DT准备好
    long count = 0;
    for(uint8_t i=0; i<24; i++) {
        HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);
        count = count << 1;
        HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
        if(HAL_GPIO_ReadPin(HX711_DT_GPIO_Port, HX711_DT_Pin) == GPIO_PIN_SET) count++;
    }
    // 发送第25个脉冲选择通道和增益
    HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);
    count ^= 0x800000; // 转换补码
    HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
    return count;
}

// 获取校准后的重量(克)
float Get_Weight() {
    long adc_value = HX711_Read();
    float weight = (adc_value - HX711_Offset) / HX711_Scale;
    return (weight > 0) ? weight : 0; // 返回非负数
}

// 去皮功能
void Tare_Weight() {
    HX711_Offset = HX711_Read(); // 将当前读数设为偏移量
}
2. 矩阵键盘扫描(代码片段)
// 引脚定义: Rows: R0-R3 (Output), Cols: C0-C3 (Input with Pull-up)
uint8_t Key_Scan(void) {
    uint8_t key_value = KEY_NONE;
    for(uint8_t i=0; i<4; i++) {
        // 逐行输出低电平
        HAL_GPIO_WritePin(ROW0_GPIO_Port, ROW0_Pin, (i != 0) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_GPIO_WritePin(ROW1_GPIO_Port, ROW1_Pin, (i != 1) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_GPIO_WritePin(ROW2_GPIO_Port, ROW2_Pin, (i != 2) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_GPIO_WritePin(ROW3_GPIO_Port, ROW3_Pin, (i != 3) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_Delay(1); // 短暂延时稳定

        // 检查哪一列变低
        if(HAL_GPIO_ReadPin(COL0_GPIO_Port, COL0_Pin) == GPIO_PIN_RESET) key_value = key_map[i][0];
        if(HAL_GPIO_ReadPin(COL1_GPIO_Port, COL1_Pin) == GPIO_PIN_RESET) key_value = key_map[i][1];
        if(HAL_GPIO_ReadPin(COL2_GPIO_Port, COL2_Pin) == GPIO_PIN_RESET) key_value = key_map[i][2];
        if(HAL_GPIO_ReadPin(COL3_GPIO_Port, COL3_Pin) == GPIO_PIN_RESET) key_value = key_map[i][3];
    }
    // 所有行恢复高电平
    HAL_GPIO_WritePin(ROW0_GPIO_Port, ROW0_Pin, GPIO_PIN_SET);
    // ... 其他行
    return key_value;
}
3. 显示与报警逻辑(代码片段)
void Display_Update(void) {
    OLED_Clear();
    OLED_ShowString(0, 0, "Weight:", 16);
    OLED_ShowNum(60, 0, (int)current_weight, 4, 16); // 显示重量
    OLED_ShowString(100, 0, "g", 16);

    OLED_ShowString(0, 2, "Price:", 16);
    OLED_ShowNum(60, 2, (int)(unit_price*100), 5, 16); // 显示单价(分)
    OLED_ShowString(110, 2, "/kg", 16);

    OLED_ShowString(0, 4, "Total:", 16);
    OLED_ShowNum(60, 4, (int)(current_weight * unit_price), 5, 16); // 显示总价
    OLED_ShowString(110, 4, "yuan", 16);
}

void Check_Alarms(void) {
    // 超重报警
    if(current_weight > max_weight_threshold) {
        Buzzer_On();
        OLED_ShowString(0, 6, "OVERWEIGHT ALARM!", 16);
    }
    // 超温报警
    else if(current_temperature > temp_threshold) {
        Buzzer_On();
        OLED_ShowString(0, 6, "OVER TEMP ALARM!", 16);
    } else {
        Buzzer_Off();
    }
}
4. 蓝牙通信协议(示例)

定义简单文本协议,便于APP解析:

  • STM32 → APP: "W:1234,P:1280,T:25.5\r\n" (重量:1234g, 单价:12.8元/kg, 温度:25.5℃)

  • APP → STM32: "SETPRICE:1280\r\n" (设置单价为12.8元)

  • APP → STM32: "SETMAXW:5000\r\n" (设置最大重量为5000g)

  • APP → STM32: "SETTEMP:40\r\n" (设置温度阈值为40℃)

  • APP → STM32: "TARE\r\n" (执行去皮操作)

五、系统测试与优化

(一)测试方案

  1. 称重精度测试: 使用标准砝码(如100g, 500g, 1000g)进行标定和测试,计算线性度和重复性误差。

  2. 功能测试:

    • 键盘操作: 测试每个按键功能是否正常。

    • 去皮功能: 放置容器,执行去皮,测试显示是否归零。

    • 超重报警: 放置超过阈值的重物,测试蜂鸣器是否报警。

    • 蓝牙通信: 使用手机APP连接并设置参数,查看秤的响应。

  3. 稳定性测试: 长时间上电,观察零点漂移情况和显示是否稳定。

(二)测试结果与分析

测试项目测试条件预期结果实际结果结论
称重精度放置500g标准砝码显示500±5g显示503g良好,需软件校准
去皮功能放置200g容器后去皮显示归零显示0g正常
超重报警放置6kg重物(阈值5kg)蜂鸣器响,OLED报警报警正常触发正常
蓝牙设置APP发送"SETPRICE:1500"单价变为15.00元/kg单价更新成功正常

(三)系统优化

  1. 数字滤波: 对HX711读取的原始AD值进行滑动平均滤波卡尔曼滤波,有效抑制称重数据的跳动,使显示更稳定。

  2. 温度补偿: 利用DS18B20的数据,对称重传感器的温漂进行软件补偿,提高在不同环境下的测量精度。

  3. EEPROM存储: 将校准参数、单价、阈值等系统关键数据存储在STM32的Flash或外置EEPROM中,防止掉电丢失。

  4. 低功耗设计: 在无操作一段时间后,自动关闭OLED背光,并让STM32进入睡眠模式,通过按键中断唤醒,节省能耗。

六、结论与展望

(一)结论

本项目成功设计并实现了一个高精度、多功能的智能称重系统。系统完成了核心的重量测量与显示功能,并集成了本地键盘操作、蓝牙远程控制、超重超温报警等实用特性。硬件结构紧凑,成本低;软件运行稳定,人机交互流畅,达到了设计的预期目标。

(二)未来展望

  1. 支付集成: 集成热敏打印机模块,打印收款小票;或集成二维码显示,支持扫码支付。

  2. 数据管理: 增加SD卡模块,自动按日、月记录销售数据,方便后续统计和分析。

  3. 产品数据库: 在STM32外扩SPI Flash,存储大量产品信息(编号、名称、单价),实现通过编号快速调用。

  4. 外壳设计: 设计专业的商业秤外壳,提升产品化程度。

如有侵权,或需要完整代码,请及时联系博主。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷忆枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值