STM32项目开源:电子秤计价系统(代码+原理图+仿真)

文章目录


一、前言

实物项目成品:

仿真项目成品:

哔哩哔哩开源视频链接(复制浏览器打开):

https://www.bilibili.com/video/BV1TKYg6dEgc/?vd_source=10da4d04d580bd6b34f7298120737c50

(资料分享见文末)

二、项目功能简介

【开源】STM32 单片机电子秤计价系统(代码+原理图+仿真)-编号:CY26030

功能介绍:

(1)液晶屏实时显示皮重、当前重量、物品单价与计算得出的总价。

(2)实体按键可完成参数设置,支持设置物品单价、重量报警阈值。

(3)具备去皮清零与单价清除功能,一键去除容器皮重,一键清空已设置单价。

(4)称重量程 0~10kg,可通过按键自定义设置超重阈值;当检测重量超过设定阈值时,蜂鸣器触发声光报警。 (5)按下确认按键,屏幕画面锁定,保持显示当前重量、单价以及总价。

(6)称重数据通过 WiFi 同步上传到手机 APP;手机端可远程设置单价、执行去皮清零等控制操作。

三、PCB设计

四、原理图设计

五、程序设计

代码如下():

c 复制代码
#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; //按键
/*
u32 Pi_weight;
u32 Weight;
u32 weight_err;
*/
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();
		}
	}
	/*
	OLED_ShowNum(1,7,(int)(Pi_weight - weight_err),4);
	OLED_ShowNum(1,12,(int)(weight_err),4);
	OLED_ShowNum(2,7,(int)(Pi_weight),4);
	*/
	
	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);
	
//	OLED_ShowNum(2,7,Weight,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();
}

六、包含内容

七、资料分享

资料获取:请查看主页介绍搜索或观看开源视频获取

相关推荐
m4Rk_5 小时前
【论文阅读】Agent 记忆机制(86):Skill-Pro——用 Non-Parametric PPO 将交互经验演化为可复用技能
论文阅读·人工智能·学习·开源·github
女神下凡6 小时前
芯参谋(29):UFS UMCP 软件设计规范
arm开发·单片机·嵌入式硬件
李日华大战鸡红6 小时前
IC-MU128编码器使用教程
stm32
周洲08306 小时前
STM32片内Flash读写深度详解|掉电参数保存、底层原理
linux·前端·stm32
对象存储与RustFS6 小时前
升级 RustFS 二进制不停机:一条一条换,留一条退路
后端·rust·开源
RISCV_Explorer7 小时前
RISC-V电源管理与低功耗实战——WFI指令、电源域划分与唤醒路径设计
单片机·嵌入式硬件·risc-v
zd8451015007 小时前
支持双向输入信号的开关量电路
单片机·嵌入式硬件
齐落山大勇8 小时前
【裸机程序】IMX 6ULL的中断机制的理解
单片机·嵌入式硬件
cu1438 小时前
细谈GM8229的具体功能与其应用
c语言·c++·人工智能·单片机
分布式存储与RustFS8 小时前
升级 RustFS 二进制不停机:一条一条换,留一条退路
运维·云原生·开源·对象存储·分布式存储·s3·性能基准