基于STM32的HX711货物称重系统
资料下载地址:基于STM32的HX711货物称重系统(程序+原理图+pcb)
一、项目介绍
1、货物重量检测:0-20kg
2、按键设置单个货品的重量,根据测得总重,算出当前货品数量,低于3个显示货品不足,超过3个显示货品重组;
3、液晶显示相关数据;
二、视频展示
基于STM32的HX711货物称重系统
三、原理图
四、PCB
五、程序
#include "hx711.h"
#include "math.h"
#include "string.h"
#include "stdlib.h"
#include "sys.h"
#define SCALE 106.5f
extern uint32_t setweight;
extern u8 key;
int32_t HX711_Buffer;
int32_t Weight_Maopi;
int64_t Weight_Shiwu;void Key_Init(void)
{__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; //时钟端口配置为输出GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}u8 KEY_Scan(void)
{if((KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || KEY3 == 0)){HAL_Delay(5);//去抖动if(KEY0 == 0)return KEY0_PRES;if(KEY1 == 0)return KEY1_PRES;if(KEY2 == 0)return KEY2_PRES;if(KEY3 == 0)return WKUP_PRES;}elsereturn 0;// 无按键按下
}void Hx711_init(void)
{__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = GPIO_PIN_0;//时钟端口配置为输出GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_1;//数据引脚配置输入模式GPIO_InitStruct.Mode = GPIO_MODE_INPUT;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);// 复位HX711for(uint8_t i = 0; i < 25; i++){HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);HAL_Delay(1);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);}}void Delay_ms(uint8_t time)
{uint8_t i;while(time--){for(i = 0; i < 113; i++);}}//****************************************************
//读取HX711
//****************************************************
//****************************************************
//读取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;
}
int64_t oledweight = 0;
//****************************************************
//称重
//****************************************************
int64_t buf[50] = {0};
void Get_Weight(void)
{static int i = 0;Weight_Shiwu = 0;// Weight_Shiwu += HX711_Read() / SCALE;buf[i] = HX711_Read() - Weight_Maopi;if(i ==9){Weight_Shiwu = get_average(buf,i+ 1);// Weight_Shiwu = Weight_Shiwu - Weight_Maopi;Weight_Shiwu = 77400-Weight_Shiwu/ SCALE;if(Weight_Shiwu < 400 )Weight_Shiwu = 0;oledweight = Weight_Shiwu;i = 0;memset(buf,0,50);}
// else
// Weight_Shiwu = 0;i++;
}int64_t get_average(int64_t *arr, int length)
{int i = 0;int64_t sum = arr[0];int64_t max = arr[0];int64_t min = arr[0];// 遍历数组,计算总和并找出最大值和最小值for (int i = 1; i < length; i++){sum += arr[i];if (arr[i] > max){max = arr[i];}if (arr[i] < min){min = arr[i];}}int64_t filtered_sum = sum - max - min;int filtered_count = length - 2;return filtered_sum / filtered_count;}