目录
一、设计背景和意义
1.1设计背景
近年来,随着物联网技术、嵌入式系统以及智能终端设备的快速发展,传统电子秤正经历着从单一称重工具向多功能智能设备的转型。在零售业、物流仓储、家庭厨房等应用场景中,用户对电子秤的需求已不仅限于基本的重量测量,更希望其具备数据记录、价格计算、远程监控等智能化功能。目前市场上的电子秤产品主要分为两大类:一类是功能简单、价格低廉的传统电子秤,仅能实现基本称重和显示功能;另一类是面向商业应用的高端智能电子秤,虽然功能丰富但价格昂贵,且系统复杂度高,不适合普通用户使用。
1.2设计意义
本课题研发的智能电子秤系统,在技术创新层面具有多重突破价值。以 STM32F103C8T6 为核心的主控方案,充分发挥其高性能处理能力与丰富外设资源,为系统的多功能集成奠定硬件基础。HX711 称重模块与主控芯片的协同设计,通过高精度 A/D 转换与数字化信号传输,将称重误差控制在更细微的范围内,推动电子秤从 "粗略计量" 向 "精准感知" 升级。蓝牙模块与手机 APP 的联动机制,打破了传统电子秤的信息孤岛状态,构建起 "设备 - 终端 - 用户" 的实时交互链路,为计量设备的物联网化改造提供了可复制的技术范式。这种 "硬件模块化 + 软件智能化" 的设计思路,也为嵌入式系统在计量领域的应用积累了实践经验,有助于推动相关技术的标准化与产业化。
二、实物效果展示
2.1实物图片

2.2实物演示视频
【开源】基于STM32的智能电子秤
三、硬件功能简介
3.1项目功能详解
1)液晶显示屏幕显示当前的重量
2)按键可以设置当前物品的单价
3)具有去皮清零的功能
4)按键确认显示当前的重量、单价、总价
5)称重的重量发送蓝牙App显示
3.2元器件清单
- 主控STM32F103C8T6最小系统板
- 0.96OLED显示屏幕
- HX711称重模块
- JDY31-SPP蓝牙模块
- 矩阵按键
四、主框图与软件流程图
主框图

流程图

五、硬件PCB展示


六、软件程序设计
cpp
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Timer.h"
#include "OLED.h"
#include "BEEP.h"
#include "KEY.h"
#include "Weight.h"
uint8_t TIM2_Flag = 0;//定时器2中断标志
uint8_t keynum; //按键
float Pi_weight;
float Weight;
float weight_err;
char price[7];
float single_price;
float total_price;
uint8_t decimal;//小数位
void show_init();
void set_price();//设置单价
void main_Init(void);
void main_loop(void);
int main(void)
{
main_Init();
while(1)
{
main_loop();
}
}
void main_Init()
{
OLED_Init();
Timer_Init();
BEEP_Init();
OLED_Clear();
HX711_GPIO_Init();
OLED_ShowChinese(2,2,"正在初始化...");
Delay_ms(2000); //对接成功界面停留一定时间
weight_err = Get_Tare();
Pi_weight = Get_Tare();
}
void main_loop()
{
show_init();
keynum = KeyScan();
if(keynum != 255)
{
if(keynum == remove_tare)
{
Pi_weight = Get_Tare();
}else if(keynum == set)
{
set_price();
}
}
Weight = 1.73*Get_Weight(Pi_weight);
if(Weight < 0.5)Weight = 0;//去除干扰
total_price = single_price*Weight/1000;
OLED_ShowNum(1,7,(int)(Pi_weight - weight_err)/1000,1);
OLED_ShowChar(1,8,'.');
OLED_ShowNum(1,9,(((Pi_weight - weight_err)/1000)-(int)((Pi_weight - weight_err)/1000))*10000,4);
OLED_ShowNum(2,7,(int)(Weight)/1000,1);
OLED_ShowChar(2,8,'.');
OLED_ShowNum(2,9,(((Weight)/1000)-(int)((Weight)/1000))*10000,4);
if(price[0] == '\0')
{
OLED_ShowNum(3,7,0,6);
}else
OLED_ShowString(3,7,price);
OLED_ShowNum(4,7,(int)total_price,5);
OLED_ShowChar(4,12,'.');
OLED_ShowNum(4,13,(total_price-(int)total_price)*10,1);
Delay_ms(100);
}
void show_init()
{
OLED_ShowChinese(1,1,"皮重:");
OLED_ShowChinese(1,7,"千克");
OLED_ShowChinese(2,1,"重量:");
OLED_ShowChinese(2,7,"千克");
OLED_ShowChinese(3,1,"单价:");
OLED_ShowChinese(3,8,"元");
OLED_ShowChinese(4,1,"价格:");
OLED_ShowChinese(4,8,"元");
}
void set_price()
{
OLED_Clear();
OLED_ShowChinese(1,3,"请输入单价");
uint8_t index = 0;
uint8_t dot_flag = 0;
uint8_t end_flag = 0;
single_price = 0;
decimal = 0;
price[0] = '\0';
while(1)
{
if(index == 6)break;
keynum = KeyScan();
if(keynum == ok)
{
break;
}else if(keynum >=0 && keynum <= 9 && end_flag == 0)
{
price[index] = '0' + keynum;
if(index < 6)
price[index+1] = '\0';
OLED_ShowChar(3,7+index,price[index]);
if(index > 0 && price[index-1] == '.')
{
single_price += keynum*0.1;
decimal = keynum;
end_flag = 1;
}else
{
single_price *= 10;
single_price += keynum;
}
index++;
}else if(keynum == dot)
{
if(index > 0)
{
if(dot_flag==0)
{
dot_flag = 1;
price[index] = '.';
if(index < 6)
price[index+1] = '\0';
OLED_ShowChar(3,7+index,price[index]);
index++;
}
}
}
}
OLED_Clear();
}
七、项目资料包内容
