毕设系列 - 基于stm32的智能电子秤系统 - 物联网 嵌入式 单片机


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于stm32的智能电子秤系统

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

🔥 项目分享与指导:https://gitee.com/sinonfin/sharing

1 简介

基于stm32的智能电子秤设计,有很多功能,称重,报警,蓝牙app连接,语音播报,去皮等。

2 主要器件

  • STM32F103C8T6
  • HX711压力传感器
  • 矩阵键盘
  • 蓝牙模块
  • 电子秤

3 实现效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4 设计原理

4.1 STM32F103C8T6

简介
STM32F103C8T6是一款基于ARM Cortex-M3内核(ARM公司在ARM11以后改用Cortex命名,并分成A、R和M三类,M系列有M0、M0+、M3、M4、M7)的32位的微控制器,采用LQFP48封装,由意法半导体公司(ST)推出,属于STM32系列(ST公司还有SPC5X系列微控制器)。其程序存储器FLASH容量是64KB (64K x 8bit),RAM容量是20KB(20K x 8bit),2个12bit ADC合计12路通道(外部通道只有PA0到PA7、PB0到PB1,并不是18通道),37个通用I/O口(PA0-PA15、PB0-PB15、PC13-PC15、PD0-PD1),4个16bit定时器(TIM1(高级控制定时器,带死区插入,常用于产生PWM控制电机)、TIM2、TIM3、TIM4),2IIC,2SPI,3USART,1CAN,工作电压2V~3.6V,工作温度为-40°C ~ 85°C,系统时钟最高可到72MHz(一般是由8MHz的外部时钟经锁相环9倍频到72MHz)。

相关引脚分布

本项目中STM32主要通过ADC采集MQ-3模块的值转换为酒精浓度值显示在LCD屏幕上。同时,驱动语音播报模块、风扇和蜂鸣器。

4.2 HX711压力传感器

简介

HX711称重传感器专用模拟/数字(A/D)转换器芯片,是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的32增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。

特点

  • 两路可选择差分输入
  • 片内低噪声可编程放大器,可选增益为64 和128
  • 片内稳压电路可直接向外部传感器和芯片内A/D 转换器提供电源
  • 片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟
  • 上电自动复位电路
  • 简单的数字控制和串口通讯:所有控制由管脚输入,芯片内寄存器无需编程
  • 可选择10Hz 或80Hz 的输出数据速率
  • 同步抑制50Hz 和60Hz 的电源干扰
  • 耗电量(含稳压电源电路):典型工作电流:<1.7mA, 断电电流:<1μA
  • 工作电压范围:2.6 ~ 5.5V
  • 工作温度范围:-20 ~ +85℃
  • 16 管脚的SOP-16 封装

原理图
在这里插入图片描述

5 部分核心代码

void Hx711_init(void)
{
	__HAL_RCC_GPIOD_CLK_ENABLE();
	GPIO_InitTypeDef  GPIO_InitStruct; 
	GPIO_InitStruct.Pin = GPIO_PIN_5;//时钟端口配置为输出		
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;  
    GPIO_InitStruct.Pull  = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	
	HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); 

	GPIO_InitStruct.Pin = GPIO_PIN_6;//数据引脚配置输入模式
	GPIO_InitStruct.Mode  = GPIO_MODE_INPUT;  
	HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); 

}

//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void)	//增益128
{
	unsigned long val = 0; 
	unsigned char i = 0; 
 
	//判断模块是否准备好
	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1));
	delay_us(1);   
	//sck 拉低
	GPIO_ResetBits(GPIOB,GPIO_Pin_0);
	//再次判断是否准备好
	while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1));
  
	for(i=0;i<24;i++) 
	{ 
		delay_us(100); 
		GPIO_SetBits(GPIOB,GPIO_Pin_0);	   
		val=val<<1; 
		delay_us(1);  
		GPIO_ResetBits(GPIOB,GPIO_Pin_0);	   
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1))  
		val++; 
		delay_us(1); 
	} 
	GPIO_SetBits(GPIOB,GPIO_Pin_0); 
	val = val^0x800000; 
	delay_us(1); 
	GPIO_ResetBits(GPIOB,GPIO_Pin_0); 
	delay_us(1);  
	return val; 
}


void Delay_ms(uint8_t time)
{
  uint8_t i;
	while(time--){
	for(i=0;i<113;i++);
	}
 
}


//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void)	//增益128
{
	unsigned long data=0; 
	unsigned char i;	
	HAL_GPIO_WritePin(HX711_SCK_GPIO_Port ,HX711_SCK_Pin,GPIO_PIN_RESET);
	Delay_ms(1);
	while(HAL_GPIO_ReadPin(HX711_Dout_GPIO_Port ,HX711_Dout_Pin)==GPIO_PIN_SET);
	for(i=0;i<24;i++)
	{  
	  	HAL_GPIO_WritePin(HX711_SCK_GPIO_Port ,HX711_SCK_Pin,GPIO_PIN_SET);
		Delay_ms(1);
		data=data<<1; 
		HAL_GPIO_WritePin(HX711_SCK_GPIO_Port ,HX711_SCK_Pin,GPIO_PIN_RESET); 
		if(HAL_GPIO_ReadPin(HX711_Dout_GPIO_Port ,HX711_Dout_Pin)== GPIO_PIN_SET) 
			  data++;		
	}
  
	 HAL_GPIO_WritePin(HX711_SCK_GPIO_Port ,HX711_SCK_Pin,GPIO_PIN_SET);
	 data=data^0x800000;//第25个脉冲下降沿来时,转换数据	
	 Delay_ms(1);
	 HAL_GPIO_WritePin(HX711_SCK_GPIO_Port ,HX711_SCK_Pin,GPIO_PIN_RESET); 
 
	 	
	
	return (data);
}

//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi(void)
{
	Weight_Maopi = HX711_Read()/SCALE;	
} 
 
//****************************************************
//称重
//****************************************************
void Get_Weight(void)
{

	Weight_Shiwu =HX711_Read()/SCALE;
	if(Weight_Shiwu>=Weight_Maopi)
	{
		Weight_Shiwu=Weight_Shiwu-Weight_Maopi;
		Weight_Shiwu -= 18305;
		if(Weight_Shiwu < 0 )
			Weight_Shiwu = 0;
			
	}
	else
			Weight_Shiwu=0;
		
	
}


6 最后

🔥 项目分享与指导:https://gitee.com/sinonfin/sharing

基于STM32电子秤设计的过程分为硬件设计和软件设计两个方面。硬件设计主要包括电子秤传感器选择、电路设计和电源设计。软件设计包括STM32的固件开发和应用程序开发。 在硬件设计方面,首先要选择合适的电子秤传感器。传感器的选择应根据秤的最大称重范围来确定,同时要考虑传感器的精度和稳定性。其次,根据传感器的输出信号特性,设计合适的电路进行信号放大、滤波和模数转换。最后,设计合理的电源电路,保证秤的工作稳定和可靠。 在软件设计方面,首先进行STM32固件的开发。如果使用官方提供的开发环境Keil MDK,可以使用C语言编写程序,进行芯片初始化设置,配置GPIO口、ADC等外设,以及编写中断服务函数。接下来,根据设计要求和功能需求,编写应用程序。 应用程序的编写包括通过ADC采样传感器数据,并进行数据处理和计算。可以使用滤波算法对采样数据进行平滑处理,再根据秤的校准值进行数据换算。最后,将换算后的数据通过串口或显示屏输出,实现对称重结果的显示。 此外,还可以加入一些辅助功能,如零点调校、称重范围设置、单位切换等。这些功能可以根据具体需求来设计和实现。 总结来说,基于STM32电子秤的设计涉及硬件和软件两个方面。硬件设计包括选择合适的传感器、电路设计和电源设计;软件设计包括STM32固件的开发和应用程序的编写。通过合理的设计和开发,可以实现稳定可靠的电子秤功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值