STM32+HX711+OLED 称重系统实物开发完整教程

Source

一、教程概述

        本教程专为嵌入式入门者及实物开发爱好者设计,详细讲解如何使用 STM32F103C8T6 单片机驱动 HX711 称重模块、I2C 接口 OLED 屏幕,实现重量数据的高精度采集、实时显示。全程基于实物开发,步骤清晰、重点标注接线细节与避坑指南,代码模块化设计可直接复制使用,兼顾理论与实操,适合作为入门实战项目、课程设计或小型称重设备开发参考。

核心功能:

  1. HX711 24 位 ADC 高精度采集,支持 128 倍增益(CH-A 通道),适配主流 4 线制称重传感器;
  2. 上电自校准;
  3. 多重数据滤波,有效抑制实物环境中的信号干扰,减少重量波动;
  4. OLED 屏幕中文显示,包含重量值(单位:g);
  5. 适配 5V/3.3V 供电场景,硬件接线简洁,无需复杂外设。

二、必备软硬件工具

(一)硬件清单(实物)

元件名称 规格参数 数量 功能说明
STM32 单片机 STM32F103C8T6(最小系统板) 1 块 核心控制单元,处理传感器数据并驱动 OLED
HX711 称重模块 通用款(支持 CH-A/CH-B 通道) 1 块 放大称重传感器信号,24 位 AD 转换输出
称重传感器 4 线制电阻应变片(如 500g/1kg/5kg) 1 个 感知压力,输出 mV 级差分电压信号
OLED 屏幕(128×64) I2C 接口(0.96 英寸 ) 1 块 低功耗显示重量数据与操作提示
杜邦线 公对母 / 公对公 若干 元件之间接线连接
电源适配器 5V/1A(USB 接口或直流电源) 1 个 为整个系统供电(STM32 最小系统板 5V 输入)
标准砝码 已知精确重量(如 500g/1kg) 1 套 用于校准称重系统精度

(二)软件工具

软件名称 版本要求 核心用途 下载渠道
Keil uVision5 任意稳定版本 编写 C 语言程序、生成.hex 文件 官网(需安装 STM32F1 系列编译器)
STM32CubeMX 6.0 及以上 快速配置 STM32 时钟、GPIO、I2C 外设 ST 意法半导体官网免费下载
STM32 串口烧录工具 FlyMcu/STM32 ST-LINK Utility 1 个 将.hex 文件烧录到 STM32 单片机 官网或开源软件平台
万用表 基础款(支持电压 / 通断测量) 1 个 调试接线、测量电压是否正常(可选但推荐) 线下门店或电商平台

三、核心元件详细介绍

(一)HX711 称重模块(核心采集单元)

HX711 是专为称重传感器设计的高精度 AD 转换模块,内置低噪声放大器、稳压电路和数字滤波功能,无需额外配置即可直接与 STM32 和称重传感器对接,核心参数如下:

  • ADC 性能:24 位差分输入 ADC,有效精度 22 位,分辨率可达 1LSB,满足高精度称重需求;
  • 增益选择:CH-A 通道支持 128/64 倍增益,CH-B 通道支持 32 倍增益(本教程用 CH-A 128 倍增益);
  • 通信方式:双线串行通信(DOUT 数据输出 + SCK 时钟输入),仅需 2 个 GPIO 引脚即可驱动,无需 I2C/SPI 外设;
  • 供电电压:2.6V~5.5V(实物推荐与 STM32 共 5V 供电,避免电压不足导致信号失真);
  • 采样率:10Hz(128 倍增益),适用于静态称重(如物体放置稳定后读数);
  • 接口定义(模块正面引脚从左到右):
    引脚名称 功能描述 实物接线注意事项
    VCC 电源正极 接 5V(与 STM32 最小系统板共电),不可接反
    GND 电源地 必须与 STM32、OLED、称重传感器共地
    DOUT 数字数据输出引脚 连接 STM32 的 GPIO 输入引脚(如 PB0)
    SCK 时钟输入引脚 连接 STM32 的 GPIO 输出引脚(如 PB1)
    A+ CH-A 通道正输入端 连接称重传感器的信号正输出端(如绿线)
    A- CH-A 通道负输入端 连接称重传感器的信号负输出端(如白线)
    B+ CH-B 通道正输入端(备用) 悬空或接其他传感器(本教程不用)
    B- CH-B 通道负输入端(备用) 悬空或接其他传感器(本教程不用)

(二)称重传感器(4 线制)

常用 4 线制电阻应变片传感器,核心由应变片、弹性体组成,受力后输出微弱差分电压(mV 级),需通过 HX711 放大后才能采集,引脚定义(默认配色,不同品牌可能有差异,需参考传感器手册):

引脚颜色 功能描述 连接对象
红色 电源正极(VCC) HX711 的 VCC 引脚
黑色 电源地(GND) HX711 的 GND 引脚
绿色 信号正输出(S+) HX711 的 A + 引脚
白色 信号负输出(S-) HX711 的 A - 引脚

(三)其他关键元件

  • OLED12864:仅需 SDA(数据线)和 SCL(时钟线)两根线通信,实物默认 I2C 地址为 0x78(部分为 0x7A,可通过程序修改),供电支持 3.3V(直接接 STM32 的 3.3V);

四、硬件接线步骤(实物关键!)

接线原则

  1. 共地优先:所有元件(STM32、HX711、OLED、传感器)的 GND 必须连接到一起,否则会出现数据乱码、称重不准甚至无响应;
  2. 电压匹配:HX711 接 5V,OLED 接 3.3V(STM32 最小系统板通常有 3.3V 输出引脚),称重传感器电源由 HX711 提供(红黑线接 HX711 的 VCC/GND);
  3. 信号线远离干扰:HX711 与传感器的连接线(绿线、白线)尽量短,避免与电机、继电器等强干扰元件靠近,必要时用屏蔽线;
  4. 接线顺序:先接电源和地,再接信号线,最后接按键,避免接错导致元件烧毁。

详细接线表(STM32F103C8T6 引脚定义)

元件模块 元件引脚 连接对象(STM32 引脚) 备注说明
STM32 最小系统板 VIN(电源输入) 5V 电源适配器 为 STM32 供电,部分板标注 “5V”
STM32 最小系统板 GND(地) 所有元件的 GND 共地核心,必须可靠连接
STM32 最小系统板 3.3V(输出) OLED 的 VCC 引脚 为 OLED 提供 3.3V 电源
HX711 模块 VCC STM32 最小系统板 5V HX711 推荐 5V 供电,稳定性更好
HX711 模块 GND STM32 的 GND 共地
HX711 模块 DOUT PA1(GPIO 输入) 数据输入,配置为浮空输入
HX711 模块 SCK PA0(GPIO 输出) 时钟输出,推挽输出模式
HX711 模块 A+ 称重传感器绿色线 信号正输出,不可接反
HX711 模块 A- 称重传感器白色线 信号负输出,不可接反
称重传感器 红色线 HX711 的 VCC 传感器电源由 HX711 提供
称重传感器 黑色线 HX711 的 GND 传感器与 HX711 共地
OLED 屏幕 VCC STM32 的 3.3V OLED 不可接 5V,否则烧毁
OLED 屏幕 GND STM32 的 GND 共地
OLED 屏幕 SDA PB7(I2C1_SDA) I2C 数据线,复用功能
OLED 屏幕 SCL PB6(I2C1_SCL) I2C 时钟线,复用功能

接线实物图提示(文字描述)

  • STM32 最小系统板居中,左侧连接 HX711 模块(DOUT→PA1、SCK→PA0),HX711 再连接称重传感器(红→VCC、黑→GND、绿→A+、白→A-);
  • STM32 右侧连接 OLED 屏幕(SDA→PB7、SCL→PB6),OLED 接 3.3V 和 GND;

五、STM32 程序编写(STM32CubeMX+Keil5)

1. STM32CubeMX 配置(快速初始化外设)

(1)新建 CubeMX 项目
  1. 打开 STM32CubeMX,点击「File」→「New Project」,搜索 “STM32F103C8T6”,选中后点击「Start Project」;
  2. 配置时钟树:
    • 点击「RCC」,选择「HSE」为「Crystal/Ceramic Resonator」(外部晶振);
    • 点击「Clock Configuration」,设置 HCLK 为 72MHz(STM32F103 最大主频),时钟树路径:HSE(8MHz)→ PLL(×9)→ SYSCLK(72MHz)→ HCLK(72MHz),点击「OK」;
  3. 配置 GPIO( HX711+OLED):
    • PB6与PB7均设置成输出模式「Push Pull」(推挽输出),速度「Low」;
    • 按键 K2(PA1):「GPIO_Input」,命名为 “KEY_TARE”,输入模式「Floating」;
    • HX711_SCK(PA0):「GPIO_Output」,命名为 “HX711_SCK”,输出模式「Push Pull」(推挽输出),速度「Low」;
    • HX711_DOUT(PA1):「GPIO_Input」,命名为 “HX711_DOUT”,输入模式「Floating」;
  4. 生成代码:
    • 点击「Project Manager」,设置项目名称(如 “STM32_HX711_OLED_HW”)、保存路径,「Toolchain/IDE」选择「MDK-ARM」;
    • 点击「Generate Code」,生成 Keil 工程,完成后关闭 CubeMX。

2. Keil5 完善程序(添加驱动代码)

(1)编写 OLED 驱动代码(支持中文显示)
1.oed.c(部分)
/**
  * @brief  OLED显示字符串
  * @param  Line 行位置
  * @param  Column 列位置
  * @param  Fontsize 字体大小
  * @param  String 显示字符串,
  * @retval 无
  */
#include <string.h>
void OLED_ShowString(uint8_t Line, uint8_t Column, uint16_t Fontsize, const char* String)
{
	uint8_t i, len;
	len = strlen(String);
	
	for(i=0; i<len; i++) {
		switch(Fontsize) {
			case 8:OLED_ShowChar(Line, Column+i*6, Fontsize, String[i]);
			break;
			case 16:OLED_ShowChar(Line, Column+i*8, Fontsize, String[i]);
			break;
			case 24:OLED_ShowChar(Line, Column+i*12, Fontsize, String[i]);
			break;
		}
	}
}

/**
  * @brief  OLED显示汉字
  * @param  Line 行位置
  * @param  Column 列位置
  * @param  Chinese 显示字符串,
  * @retval 无
  */
void OLED_ShowChinese(uint8_t Line, uint8_t Column, uint8_t Chinese)
{
	uint8_t i, j;
	
	for(i=0; i<2; i++) {
		OLED_SetCursor(Line+i, Column);	//循环2次显示上/下半部分内容	
		for (j=0; j<16; j++) {//字宽为16
			OLED_Write_Data(Chinese_16x16[Chinese][j+i*16]);			
		}
	}
}
2.oled.h
/**
 ****************************************************************************************************
 * @file        oled.h
 * @author      送外卖的工程师
 * @version     V1.0
 * @date        2025-11-23
 * @brief       0.96寸 4针OLED驱动代码
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:STM32F103C8T6
 *     CSDN:送外卖的工程师
 * 技术指导VX:wmz14026
 * 淘宝店铺:小马科技
 * 闲鱼店铺:送外卖的工程师
 *
 * 修改说明
 * V1.0.0.251123
 * 第一次发布
 * 注:长期接各种项目设计,提供仿真、实物、原理图、PCB、代码工程、后期指导、操作视频、
   说明文档、各种报告、后期指导等。
 ****************************************************************************************************
 */
#ifndef _OLED_H_
#define _OLED_H_

#include "stm32f1xx_hal.h"
//SCL引脚
#define OLED_SCL_Pin                                GPIO_PIN_6
#define OLED_SCL_GPIO_Port                          GPIOB
//SDA引脚
#define OLED_SDA_Pin                                GPIO_PIN_7
#define OLED_SDA_GPIO_Port                          GPIOB

#define IIC_W_SCL(x)    HAL_GPIO_WritePin(GPIOB, OLED_SCL_Pin,(GPIO_PinState)(x))
#define IIC_W_SDA(x)    HAL_GPIO_WritePin(GPIOB, OLED_SDA_Pin,(GPIO_PinState)(x))
#define IIC_R_SDA()     HAL_GPIO_ReadPin(GPIOB, OLED_SDA_Pin)

void OLED_Write_Command(uint8_t Command);
void OLED_Write_Data(uint8_t Data);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_Test(void);
void OLED_SetCursor(uint8_t Y, uint8_t X);
#endif
(2)编写 HX711 驱动代码
1.HX711.c(部分)
unsigned long HX711_GetData(void)
{
		unsigned long Count;
		unsigned char i;
    uint32_t cont = 1;
		HX711_SCK_L;
	  delay_us(1);
		Count=0;
		while(HX711_DT && cont++);
		for (i=0;i<24;i++)
	 {
				HX711_SCK_H;
				delay_us(1);
				Count=Count<<1;
				HX711_SCK_L;
				delay_us(1);
				if(HX711_DT) Count++;
		}
		HX711_SCK_H;
		delay_us(1);
		Count=Count^0x800000;
		HX711_SCK_L;
		delay_us(1);
		
		return(Count);
}
2.HX711.h
/**
 ****************************************************************************************************
 * @file        hx711.h
 * @author      送外卖的工程师
 * @version     V1.0
 * @date        2025-12-04
 * @brief       称重传感器驱动代码
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:STM32F103C8T6
 *     CSDN:送外卖的工程师
 * 技术指导VX:wmz14026
 * 淘宝店铺:小马科技
 * 闲鱼店铺:送外卖的工程师
 *
 * 修改说明
 * V1.0.0.251204
 * 第一次发布
 * 注:长期接各种项目设计,提供仿真、实物、原理图、PCB、代码工程、后期指导、操作视频、
   说明文档、各种报告、后期指导等。
 ****************************************************************************************************
 */
#ifndef __HX711_H
#define	__HX711_H
#include "stm32f1xx_hal.h"



/***************根据自己需求更改****************/
// HX711 GPIO宏定义
#define HX711_SCL_Pin                                GPIO_PIN_0
#define HX711_SCL_GPIO_Port                          GPIOA
#define HX711_DT_Pin                                GPIO_PIN_1
#define HX711_DT_GPIO_Port                          GPIOA
/*********************END**********************/

#define HX711_SCK_H				HAL_GPIO_WritePin(HX711_SCL_GPIO_Port, HX711_SCL_Pin,GPIO_PIN_SET);
#define HX711_SCK_L				HAL_GPIO_WritePin(HX711_SCL_GPIO_Port, HX711_SCL_Pin,GPIO_PIN_RESET);

#define HX711_DT                HAL_GPIO_ReadPin(HX711_DT_GPIO_Port,HX711_DT_Pin)



void HX711_Init(void);
unsigned long HX711_GetData(void);

#endif /* __ADC_H */

六、实验现象

        初始化上电时,保证秤盘空载,上电时会进行自校准,等待屏幕上显示称重数据,则可以开始进行称重,会显示当前物品重量,单位为g。

七、总结

本教程基于 STM32F103C8T6 实现了完整的实物称重系统,核心亮点在于:

  1. 硬件简洁可靠:仅需1 块 OLED、1 个 HX711 模块和称重传感器,接线清晰,成本较低;
  2. 软件模块化:HX711 驱动、OLED 显示、代码易读、易修改,可直接移植到其他 STM32 型号;
  3. 功能实用:支持中文显示直观,称重自校准,滤波算法有效抑制干扰,满足日常高精度称重需求;
  4. 避坑指南详尽:针对实物开发中常见的接线错误、电源干扰、校准失败等问题,提供具体排查方法,新手也能快速上手。