一、教程概述
本教程专为嵌入式入门者及实物开发爱好者设计,详细讲解如何使用 STM32F103C8T6 单片机驱动 HX711 称重模块、I2C 接口 OLED 屏幕,实现重量数据的高精度采集、实时显示。全程基于实物开发,步骤清晰、重点标注接线细节与避坑指南,代码模块化设计可直接复制使用,兼顾理论与实操,适合作为入门实战项目、课程设计或小型称重设备开发参考。
核心功能:
- HX711 24 位 ADC 高精度采集,支持 128 倍增益(CH-A 通道),适配主流 4 线制称重传感器;
- 上电自校准;
- 多重数据滤波,有效抑制实物环境中的信号干扰,减少重量波动;
- OLED 屏幕中文显示,包含重量值(单位:g);
- 适配 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);
四、硬件接线步骤(实物关键!)
接线原则
- 共地优先:所有元件(STM32、HX711、OLED、传感器)的 GND 必须连接到一起,否则会出现数据乱码、称重不准甚至无响应;
- 电压匹配:HX711 接 5V,OLED 接 3.3V(STM32 最小系统板通常有 3.3V 输出引脚),称重传感器电源由 HX711 提供(红黑线接 HX711 的 VCC/GND);
- 信号线远离干扰:HX711 与传感器的连接线(绿线、白线)尽量短,避免与电机、继电器等强干扰元件靠近,必要时用屏蔽线;
- 接线顺序:先接电源和地,再接信号线,最后接按键,避免接错导致元件烧毁。
详细接线表(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 项目
- 打开 STM32CubeMX,点击「File」→「New Project」,搜索 “STM32F103C8T6”,选中后点击「Start Project」;
- 配置时钟树:
- 点击「RCC」,选择「HSE」为「Crystal/Ceramic Resonator」(外部晶振);
- 点击「Clock Configuration」,设置 HCLK 为 72MHz(STM32F103 最大主频),时钟树路径:HSE(8MHz)→ PLL(×9)→ SYSCLK(72MHz)→ HCLK(72MHz),点击「OK」;
- 配置 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」;
- 生成代码:
- 点击「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 块 OLED、1 个 HX711 模块和称重传感器,接线清晰,成本较低;
- 软件模块化:HX711 驱动、OLED 显示、代码易读、易修改,可直接移植到其他 STM32 型号;
- 功能实用:支持中文显示直观,称重自校准,滤波算法有效抑制干扰,满足日常高精度称重需求;
- 避坑指南详尽:针对实物开发中常见的接线错误、电源干扰、校准失败等问题,提供具体排查方法,新手也能快速上手。