基于STM32F103ZET6开发板的蓝牙称重器(包含源码最后一页查看)

1.STM32F103ZET6的最小系统设计包括以下几部分:

(1)电源部分:提供稳定的3.3V和5V电源。常见的电源模块包括AMS1117等稳压芯片,确保STM32及其外围模块正常工作。

(2)时钟部分:外部晶振(通常为8MHz或12MHz)提供精确的时钟源,内部PLL(锁相环)电路将其放大至72MHz,为系统提供高速时钟。

(3)复位电路:通过上拉电阻和复位按钮实现手动复位,同时支持上电自动复位。

(4)调试接口:SWD(串行线调试)接口,通常包括SWDIO和SWCLK两根信号线,方便连接调试器进行程序下载和调试。

2. HC05蓝牙模块功能介绍

HC05是一款蓝牙2.0模块,广泛应用于短距离无线通信。其主要特点包括:

(1)通信方式:基于UART串口通信,默认波特率为9600bps,可通过AT指令进行修改。

(2)工作模式:支持主从一体功能,即可以配置为主机模式或从机模式。

(3)连接距离:通信距离可达10米,适合大多数室内应用。

(4)功耗低:低功耗设计,适合电池供电的便携式设备。

蓝牙调试命令:

输入:AT

返回:OK

输入:AT+NAME=HC05\\设置蓝牙设备名称

返回:OK

输入:AT+PSWD=123456 \\设置蓝牙设备密码

返回:OK

输入:AT+UART=38400,0,0 \\设置串口波特率38400,无停止位,无校验位

返回:OK

输入:AT+CMODE=1 \\任意蓝牙地址连接

返回:OK

2.1 HC05蓝牙模块工作原理

HC05蓝牙模块通过UART接口与STM32微控制器通信,UART接口包括TXD(发送端)、RXD(接收端)、VCC(电源)和GND(地)。模块上电后,通过AT指令配置工作模式、波特率和配对码等参数。在实际应用中,HC05通常工作在从机模式,等待与手机或其他主机设备配对连接,进行数据交换。

HC05蓝牙模块电路图

3.XFW-HX711传感器

3.1 HX711传感器原理及应用

HX711是一款专为高精度电子称重系统设计的24位模数转换器(ADC)。其主要特点包括:

(1)高精度:24位ADC,提供高达0.001%的分辨率,适用于高精度称重应用。

(2)低噪声:内置低噪声放大器(PGA),放大倍数可选,确保信号的高质量。

(3)接口简单:只需两个数字接口(DT和SCK)即可实现数据传输。

HX711电路图

3.2 称重传感器的接口与数据读取

HX711通过DT(数据)和SCK(时钟)两根信号线与STM32微控制器连接。其工作原理如下:

(1)初始化:设置SCK为低电平,等待传感器稳定。

(2)数据读取:当DT信号变为低电平时,开始通过SCK时钟信号读取24位重量数据。每个SCK上升沿,HX711输出1位数据,总共读取24次。

(3)校准和转换:读取到的原始数据需要经过校准和转换,得到实际的重量值。

4.OLED-IIC显示器

4.1 OLED显示技术概述

OLED(Organic Light Emitting Diode)是一种自发光显示技术。其主要优点包括:

(1)高亮度和高对比度:自发光特性使得每个像素都可以单独控制亮度和颜色,提供更好的显示效果。

(2)低功耗:在显示黑色时,OLED像素不发光,功耗较低。

(3)广视角和快响应:OLED显示器的响应时间快,视角广,适合各种显示应用。

4.2 IIC接口与STM32的连接

OLED显示器通常通过IIC(Inter-Integrated Circuit)接口与微控制器连接。IIC是一种同步串行通信接口,只需要两根信号线:SCL(时钟线)和SDA(数据线)。其连接步骤如下:

(1)硬件连接:将OLED显示器的SCL和SDA分别连接到STM32的IIC接口对应的引脚(如PB6和PB7),并连接电源和地线。

(2)初始化:在程序中初始化IIC接口,设置SCL和SDA的工作频率。

(3)通信协议:通过IIC总线发送显示指令和数据,控制OLED显示器显示所需的信息。

5.USB转TTL-PL2303HX模块

5.1 PL2303HX模块介绍

PL2303HX是一款USB转TTL串口转换模块,广泛应用于嵌入式系统开发和调试。其主要特点包括:

(1)接口转换:将USB接口转换为TTL电平的串口,支持多种波特率。

(2)兼容性好:支持Windows、Linux、Mac等多种操作系统,驱动程序容易获取。

(3)简单易用:插即用设计,方便与各种单片机和串口设备连接。

5.2 USB转TTL功能及应用

在本设计中,PL2303HX模块用于将电脑的USB接口转换为STM32的串口接口,具体应用如下:

(1)程序下载:通过USB转TTL模块,将编写好的程序下载到STM32微控制器中。

(2)调试和通信:使用串口调试软件(如XCOM V2.0),通过PL2303HX模块与STM32进行通信,调试程序和查看数据。

(3)供电和信号转换:提供稳定的TTL电平信号,确保STM32与其他串口设备的通信稳定可靠。

6.总体连接图

7.部分代码:

hx711.c

#include "HX711.h"
#include "delay.h"

void HX711_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	HX711_GPIO_APBxClkCmd(HX711_GPIO_CLK, ENABLE);

	GPIO_InitStructure.GPIO_Pin = HX711_SCK_GPIO_PIN;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(HX711_SCK_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = HX711_DATA_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(HX711_DATA_GPIO_PORT, &GPIO_InitStructure);
}

void HX711_Data_Out(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	HX711_GPIO_APBxClkCmd(HX711_GPIO_CLK, ENABLE);

	GPIO_InitStructure.GPIO_Pin = HX711_DATA_GPIO_PIN;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(HX711_DATA_GPIO_PORT, &GPIO_InitStructure);
}

void HX711_Data_In(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	HX711_GPIO_APBxClkCmd(HX711_GPIO_CLK, ENABLE);

	GPIO_InitStructure.GPIO_Pin = HX711_DATA_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(HX711_DATA_GPIO_PORT, &GPIO_InitStructure);
	
}

u32 Read_HX711(void)
{
	uint8_t i;
	uint32_t value = 0;
	
	/**
	??????,??????? DOUT ?????,??A/D ????????????,?????
	????? PD_SCK ?????,???????????
	**/
	HX711_Data_Out();
	HX711_DATA=1; //????DT??????
	delay_us(1);
	HX711_SCK=0; //????SCK??????
	HX711_Data_In();
	/**
	??DT???????
	**/
	while(HX711_DATA);
	delay_us(1);
	
	/**
	? DOUT ?????????,PD_SCK ??? 25 ? 27 ????????
	25????? ---> ??A ??128
	26????? ---> ??B ??32
	27????? ---> ??A ??64
	**/
	for(i=0; i<24; i++) //24???????????????????
	{
		HX711_SCK=1;
		delay_us(1);
		HX711_SCK=0;
		if(HX711_DATA == 0)
		{
			value = value << 1;
			value |= 0x00;
		}
		if(HX711_DATA == 1)
		{
			value = value << 1;
			value |= 0x01;
		}
		delay_us(1);
	}
	
	//? 25? 27 ???????????? A/D ??????????
	HX711_SCK=1;; 
	value = value^0x800000; 
	delay_us(1); 
	HX711_SCK=0; 
	delay_us(1);  
	return value; 	
}






hx711.h

#ifndef __HX711_H
#define __HX711_H
#include "sys.h"

#define  HX711_DATA  PBin(10)
#define  HX711_SCK   PBout(11)



#define  HX711_GPIO_CLK            RCC_APB2Periph_GPIOB
#define  HX711_GPIO_APBxClkCmd     RCC_APB2PeriphClockCmd
	
#define  HX711_DATA_GPIO_PORT      GPIOB
#define  HX711_DATA_GPIO_PIN       GPIO_Pin_10
#define  HX711_SCK_GPIO_PORT       GPIOB   
#define  HX711_SCK_GPIO_PIN        GPIO_Pin_11



void HX711_GPIO_Init(void);
uint32_t Read_HX711(void);

#endif

oled_iic.c

#include "oled_iic.h"
#include "delay.h"
#include "oledfont.h"
#include "string.h"

unsigned int HZ=0;
//·µ»ØGB16×Ö¿âÀﺺ×Ö¸öÊý
unsigned int GB16_NUM(void)
{
  unsigned int HZ_NUM;
  unsigned char *PT;
  PT = hz_index;
  while(*PT++ != '\0')
  {
  	 HZ_NUM++;
  }

  return HZ_NUM/2;
} 

void IIC_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(OLED_SCL_RCC|OLED_SDA_RCC, ENABLE);	/* ´ò¿ªGPIOʱÖÓ */

	GPIO_InitStructure.GPIO_Pin = OLED_SCL_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  	/* ¿ªÂ©Êä³ö */
	GPIO_Init(OLED_SCL_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = OLED_SDA_PIN;
	GPIO_Init(OLED_SDA_GPIO_PORT, &GPIO_InitStructure);

	/* ¸øÒ»¸öÍ£Ö¹ÐźÅ, ¸´Î»IIC×ÜÏßÉϵÄËùÓÐÉ豸µ½´ý»úģʽ */
	IIC_Stop();
}

static void IIC_Delay(void)
{
	uint8_t i;

	for (i = 0; i < 10; i++);
}


void IIC_Start(void)
{
	/* µ±SCL¸ßµçƽʱ£¬SDA³öÏÖÒ»¸öÏÂÌøÑرíʾIIC×ÜÏßÆô¶¯ÐźŠ*/
	OLED_SDA=1;
	OLED_SCL=1;
	IIC_Delay();
	OLED_SDA=0;
	IIC_Delay();
	OLED_SCL=0;
	IIC_Delay();
}


void IIC_Stop(void)
{
	/* µ±SCL¸ßµçƽʱ£¬SDA³öÏÖÒ»¸öÉÏÌøÑرíʾIIC×ÜÏßÍ£Ö¹ÐźŠ*/
	OLED_SDA=0;
	OLED_SCL=1;
	IIC_Delay();
	OLED_SDA=1;
}


uint8_t IIC_WaitAck(void)
{
	uint8_t re;

	OLED_SDA=1;	/* CPUÊÍ·ÅSDA×ÜÏß */
	IIC_Delay();
	OLED_SCL=1;	/* CPUÇý¶¯SCL = 1, ´ËʱÆ÷¼þ»á·µ»ØACKÓ¦´ð */
	IIC_Delay();
	if (OLED_IIC_SDA_READ())	/* CPU¶ÁÈ¡SDA¿ÚÏß״̬ */
	{
		re = 1;
	}
	else
	{
		re = 0;
	}
	OLED_SCL=0;
	IIC_Delay();
	return re;
}

//ÏòIIC×ÜÏßдÊý¾Ý
void Write_IIC_Byte(uint8_t _ucByte)
{
  uint8_t i;

	/* ÏÈ·¢ËÍ×ֽڵĸßλbit7 */
	for (i = 0; i < 8; i++)
	{		
		if (_ucByte & 0x80)
		{
			OLED_SDA=1;
		}
		else
		{
			OLED_SDA=0;
		}
		IIC_Delay();
		OLED_SCL=1;
		IIC_Delay();	
		OLED_SCL=0;
		if (i == 7)
		{
			 OLED_SDA=1; // ÊÍ·Å×ÜÏß
		}
		_ucByte <<= 1;	/* ×óÒÆÒ»¸öbit */
		IIC_Delay();
	}
}

//дÃüÁî
void Write_IIC_Command(u8 IIC_Command)
{
	IIC_Start();
	Write_IIC_Byte(OLED_ADDRESS);//OLEDµØÖ·
	IIC_WaitAck();
	Write_IIC_Byte(0x00);//¼Ä´æÆ÷µØÖ·
	IIC_WaitAck();
	Write_IIC_Byte(IIC_Command);
	IIC_WaitAck();
	IIC_Stop();
}

//дÊý¾Ý
void Write_IIC_Data(u8 IIC_Data)
{
	IIC_Start();
	Write_IIC_Byte(OLED_ADDRESS);//OLEDµØÖ·
	IIC_WaitAck();
	Write_IIC_Byte(0x40);//¼Ä´æÆ÷µØÖ·
	IIC_WaitAck();
	Write_IIC_Byte(IIC_Data);
	IIC_WaitAck();
	IIC_Stop();
}

//OLEDÈ«ÆÁÌî³ä
void OLED_Fill(u8 fill_Data)
{
	u8 m,n;
	for(m=0;m<8;m++)
	{
		Write_IIC_Command(0xb0+m);		//page0-page1
		Write_IIC_Command(0x00);		//low column start address
		Write_IIC_Command(0x10);		//high column start address
		for(n=0;n<130;n++)
		{
			Write_IIC_Data(fill_Data);
		}
	}
}

//ÉèÖÃÆðʼµã×ø±ê
void OLED_Set_Pos(u8 x, u8 y) 
{ 
	Write_IIC_Command(0xb0+y);
	Write_IIC_Command((((x+2)&0xf0)>>4)|0x10);
	Write_IIC_Command(((x+2)&0x0f)|0x01);
}

//½«OLED´ÓÐÝÃßÖл½ÐÑ
void OLED_ON(void)
{
	Write_IIC_Command(0X8D);  //ÉèÖõçºÉ±Ã
	Write_IIC_Command(0X14);  //¿ªÆôµçºÉ±Ã
	Write_IIC_Command(0XAF);  //OLED»½ÐÑ
}

//ÈÃOLEDÐÝÃß -- ÐÝÃßģʽÏÂ,OLED¹¦ºÄ²»µ½10uA
void OLED_OFF(void)
{
	Write_IIC_Command(0X8D);  //ÉèÖõçºÉ±Ã
	Write_IIC_Command(0X10);  //¹Ø±ÕµçºÉ±Ã
	Write_IIC_Command(0XAE);  //OLEDÐÝÃß
}

//ÇåÆÁ
void OLED_Clear(void)
{
	OLED_Fill(0x00);
}

//ÔÚÖ¸¶¨Î»ÖÃÏÔʾһ¸ö×Ö·û,°üÀ¨²¿·Ö×Ö·û
//x:0~127
//y:0~63
void OLED_ShowChar(u8 x, u8 y, u8 chr)
{
  u8 c = 0, i = 0;
  c = chr - ' '; //µÃµ½Æ«ÒƺóµÄÖµ
  if(x > 130 - 1)
  {
    x = 0;
    y = y + 2;
  }
	OLED_Set_Pos(x, y);
	for(i = 0; i < 8; i++)
		Write_IIC_Data(zf[c * 16 + i]);
	OLED_Set_Pos(x, y + 1);
	for(i = 0; i < 8; i++)
		Write_IIC_Data(zf[c * 16 + i + 8]);

}
//m^nº¯Êý
u32 oled_pow(u8 m, u8 n)
{
  u32 result = 1;
  while(n--)result *= m;
  return result;
}
//ÏÔʾ¸öÊý×Ö
//x,y :Æðµã×ø±ê
//len :Êý×ÖµÄλÊý
//num:ÊýÖµ(0~4294967295);
//mode:   Ϊ1:µ±ÒªÏÔʾµÄΪ0ʱÏÔʾ0   Ϊ0:µ±ÒªÏÔʾµÄΪ0ʱÏÔʾ¿Õ¸ñ
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len,u8 mode)
{
  u8 t, temp;
	u8 enshow=0;
  for(t = 0; t < len; t++)
  {
    temp = (num / oled_pow(10, len - t - 1)) % 10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				if(mode)
					OLED_ShowChar(x + 8*t, y, '0');
				else
					OLED_ShowChar(x + 8*t, y, ' ');
				continue;
			}else enshow=1; 		 	 
		}
		OLED_ShowChar(x + 8*t, y, temp + '0');
  }
}

//ÏÔʾÖÐÓ¢ÎÄ×Ö·û
void OLED_ShowCH(u8 x, u8 y,u8 *chs)
{
  u32 i=0;
	u32 j;
	char* m;
	while (*chs != '\0')
	{
		if (*chs > 0xa0)				//ºº×ÖÄÚÂ붼ÊÇ´óÓÚ0xa0
		{
			for (i=0 ;i < HZ;i++)
			{	
				if(x>112)
				{
					x=0;
					y=y+2;
				}
				if ((*chs == hz_index[i*2]) && (*(chs+1) == hz_index[i*2+1]))
				{
					OLED_Set_Pos(x, y);
					for(j=0;j<16;j++)
						Write_IIC_Data(hz[i*32+j]);
					OLED_Set_Pos(x,y+1);
					for(j=0;j<16;j++)
						Write_IIC_Data(hz[i*32+j+16]);
					x +=16;
					break;
				}
			}
			chs+=2;
		}
		else
		{
			if(x>122)
			{
				x=0;
				y=y+2;
			}
			m=strchr(zf_index,*chs);
			if (m!=NULL)
			{
				OLED_Set_Pos(x, y);
				for(j = 0; j < 8; j++)
					Write_IIC_Data(zf[((u8)*m-' ') * 16 + j]);
				OLED_Set_Pos(x, y + 1);
				for(j = 0; j < 8; j++)
					Write_IIC_Data(zf[((u8)*m-' ') * 16 + j + 8]);
				x += 8;
			}
			chs++;
		}
	}
}

//³õʼ»¯SSD1306
void OLED_Init(void)
{
	HZ= GB16_NUM();
	IIC_GPIO_Config();
  Write_IIC_Command(0xAE); //--display off
  Write_IIC_Command(0x00); //---set low column address
  Write_IIC_Command(0x10); //---set high column address
  Write_IIC_Command(0x40); //--set start line address
  Write_IIC_Command(0xB0); //--set page address
  Write_IIC_Command(0x81); // contract control
  Write_IIC_Command(0xFF); //--128
  Write_IIC_Command(0xA1); //set segment remap
  Write_IIC_Command(0xA6); //--normal / reverse
  Write_IIC_Command(0xA8); //--set multiplex ratio(1 to 64)
  Write_IIC_Command(0x3F); //--1/32 duty
  Write_IIC_Command(0xC8); //Com scan direction
  Write_IIC_Command(0xD3); //-set display offset
  Write_IIC_Command(0x00); //
  Write_IIC_Command(0xD5); //set osc division
  Write_IIC_Command(0x80); //
  Write_IIC_Command(0xD8); //set area color mode off
  Write_IIC_Command(0x05); //
  Write_IIC_Command(0xD9); //Set Pre-Charge Period
  Write_IIC_Command(0xF1); //
  Write_IIC_Command(0xDA); //set com pin configuartion
  Write_IIC_Command(0x12); //
  Write_IIC_Command(0xDB); //set Vcomh
  Write_IIC_Command(0x30); //
  Write_IIC_Command(0x8D); //set charge pump enable
  Write_IIC_Command(0x14); //
  Write_IIC_Command(0xAF); //--turn on oled panel
}

// x0,y0 -- Æðʼµã×ø±ê(x0:0~127, y0:0~7); x1,y1 -- Æðµã¶Ô½ÇÏß(½áÊøµã)µÄ×ø±ê(x1:1~128,y1:1~8)
void OLED_DrawBMP(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[])
{
	u16 j=0;
	u8 x,y;

  if(y1%8==0)
		y = y1/8;
  else
		y = y1/8 + 1;
	for(y=y0;y<y1;y++)
	{
		OLED_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
		{
			Write_IIC_Data(BMP[j++]);
		}
	}
}

oled_iic.h

#ifndef __OLED_IIC_H
#define	__OLED_IIC_H

#include "sys.h"
#include <inttypes.h>

#define OLED_ADDRESS	0x78 //ĬÈÏ0x78

//¶¨ÒåIIC×ÜÏßÁ¬½ÓµÄGPIO¶Ë¿Ú, Óû§Ö»ÐèÒªÐÞ¸ÄÏÂÃæ´úÂë¼´¿ÉÈÎÒâ¸Ä±äSCLºÍSDAµÄÒý½Å
#define OLED_SCL PBout(0)  //SCLÒý½Å
#define OLED_SDA PBout(1)  //SDAÒý½Å

#define OLED_SCL_GPIO_PORT	GPIOB			/* GPIO¶Ë¿Ú */
#define OLED_SCL_RCC 	      RCC_APB2Periph_GPIOB		/* GPIO¶Ë¿ÚʱÖÓ */
#define OLED_SCL_PIN		    GPIO_Pin_0			/* Á¬½Óµ½SCLʱÖÓÏßµÄGPIO */

#define OLED_SDA_GPIO_PORT	GPIOB			/* GPIO¶Ë¿Ú */
#define OLED_SDA_RCC 	      RCC_APB2Periph_GPIOB		/* GPIO¶Ë¿ÚʱÖÓ */
#define OLED_SDA_PIN		    GPIO_Pin_1  		/* Á¬½Óµ½SDAÊý¾ÝÏßµÄGPIO */


#define OLED_IIC_SDA_READ()  GPIO_ReadInputDataBit(OLED_SDA_GPIO_PORT, OLED_SDA_PIN)	/* ¶ÁSDA¿ÚÏß״̬ */

extern unsigned int HZ;

unsigned int GB16_NUM(void);
void IIC_GPIO_Config(void);
void IIC_Start(void);
void IIC_Stop(void);
uint8_t IIC_WaitAck(void);
void Write_IIC_Byte(uint8_t _ucByte);
void Write_IIC_Command(u8 IIC_Command);
void OLED_Fill(u8 fill_Data);
void OLED_Set_Pos(u8 x, u8 y);
void OLED_ON(void);
void OLED_OFF(void);
void OLED_Clear(void);
void OLED_ShowChar(u8 x, u8 y, u8 chr);
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len,u8 mode);
void OLED_ShowCH(u8 x, u8 y,u8 *chs);
void OLED_Init(void);
void OLED_DrawBMP(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[]);
#endif

main.c

#include "sys.h"
#include "delay.h"
#include "oled_iic.h"
#include "HX711.h"
#include "usart.h"
#include "stdio.h"

#define MEDIAN_LEN  5  
#define MEDIAN      3   
#define BLUETOOTH_BAUDRATE 38400 

u32 buffer[MEDIAN_LEN]; 
int medleng = 0; 
u32 xd, xd1; 
u32 weight; 
u32 pi_weight; 
u32 hx711_xishu = 47785; 

void Get_Tare(void) {
    u32 hx711_dat;
    u8 i;
    for (i = 0; i < MEDIAN_LEN; i++) {
        hx711_dat = Read_HX711();
        if (medleng == 0) { 
            buffer[0] = hx711_dat; 
            medleng = 1; 
        } else { 
            for (i = 0; i < medleng; i++) {
                if (buffer[i] > hx711_dat) { 
                    xd = hx711_dat; 
                    hx711_dat = buffer[i]; 
                    buffer[i] = xd;
                }
            }
            buffer[medleng] = hx711_dat; 
            medleng++;
        }		
        if (medleng >= MEDIAN_LEN) {
            hx711_dat = buffer[MEDIAN]; 
            medleng = 0; 
        }
    }
    pi_weight = (u16)(hx711_dat * 0.01);
}

void Get_Weight() {
    u32 hx711_data, a;
    u32 get, aa;	
    hx711_data = Read_HX711(); // ?? HX711 ??
    get = (u16)(hx711_data * 0.01);
    if (get > pi_weight) {
        a = Read_HX711();	
        aa = (u16)(a * 0.01) - pi_weight;	
        weight = (u16)((float)aa * 0.00001 * hx711_xishu);	
    } else {
        weight = 0;
    }
}

void Bluetooth_Init() {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    
    // Enable GPIO clock
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // Enable USART clock
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    
    // Configure USART1 Tx (PA9) as alternate function push-pull
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // Configure USART1 Rx (PA10) as input floating
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // USART1 configuration
    USART_InitStructure.USART_BaudRate = BLUETOOTH_BAUDRATE;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);
    
    // Enable USART1
    USART_Cmd(USART1, ENABLE);
}

void Bluetooth_SendData(uint16_t data) {
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); 
    USART_SendData(USART1, data); 
}

int main(void) {		
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    delay_init();
    HX711_GPIO_Init();
    uart_init(115200);
    Bluetooth_Init();
    Get_Tare();
    OLED_Init();
    OLED_Clear();
    OLED_ShowCH(2, 0, "ʧÖØ-ÖÇÄÜ");
    OLED_ShowCH(20, 4, "ÖØÁ¿:0g");
    
    while (1) {		
        Get_Weight();
        if (medleng == 0) { 
            buffer[0] = weight; 
            medleng = 1; 
        } else {  
            int i;
            for (i = 0; i < medleng; i++) {
                if (buffer[i] > weight) { 
                    xd = weight; 
                    weight = buffer[i]; 
                    buffer[i] = xd;
                }
            }
            buffer[medleng] = weight; 
            medleng++;
        }		
        if (medleng >= MEDIAN_LEN) { 
            weight = buffer[MEDIAN]; 
            medleng = 0; 
            OLED_ShowNum(60, 4, weight, 4, 0);
            printf("weight:%d g\r\n", weight);
            Bluetooth_SendData(weight); 
            delay_ms(500);
        }
    }
}

源码点赞加关注。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值