STM32 · Ultrasonic · OLED

STM32F103C8T6 + HC-SR04 + 0.96 OLED 测距资料

这页单独整理 O31 C8T6 开发板配 I41 OLED、H0611/H43 超声波模块的接线、下载程序和排查说明。重点是 STM32 是 3.3V 主控,老版 5V HC-SR04 的 Echo 要做分压。

SKU O31C8T6 开发板
国产/兼容版本以实物为准
SKU I410.96 寸 I2C OLED
常见 SSD1306 0x3C
SKU H0611HC-SR04 老版本
5V 模块,Echo 要分压
SKU H43HC-SR04 新版本
宽电压 3.3-5V

本页结论

  • Trig:STM32 PA0 输出触发
  • Echo:STM32 PA1 输入,H0611 要分压
  • OLED:PB6=SCL,PB7=SDA,地址常见 0x3C
  • 下载:使用 ST-Link,PlatformIO/STM32duino 工程
  • 串口:CP2102 接 PA9/PA10 看调试信息

SKU Map

这页对应的四个产品

客户买不同套餐时,可能只买其中一部分。排查时先问清楚手里是哪一款 HC-SR04,以及 OLED 是否为 I2C 4 针款。

SKU产品本页用途注意点
O31C8T6 开发板 国产ST主控板按 STM32F103C8T6 兼容开发板处理,具体芯片批次以实物丝印为准。
I410.96 OLED显示测距结果I2C 接 PB6/PB7,地址常见 0x3C;若不亮先扫 I2C。
H0611HC-SR04 老版本 5V超声波测距VCC 接 5V;Echo 输出可能是 5V,接 STM32 前要分压到 3.3V 附近。
H43HC-SR04 新版本 宽电压3.3-5V超声波测距可以按宽电压版本处理,3.3V 主控更方便;仍以当前批次丝印/说明为准。

Overview

三样东西总览

这套资料按本地完整说明书重新整理:STM32 负责控制和计算距离,HC-SR04 负责发射/接收超声波,0.96 OLED 只负责显示结果。

STM32F103C8T6

3.3V 主控,常用 BluePill/C8T6 开发板。下载建议用 ST-Link,调试信息可用 CP2102 串口查看。

HC-SR04

Trig 触发,Echo 返回脉宽。老版 5V 模块接 STM32 时,Echo 要先分压,不能直接硬怼 3.3V IO。

SSD1306 OLED

0.96 寸 I2C 屏,常见地址 0x3C。本项目只用它显示距离,OLED 不影响 HC-SR04 本身测距。

Specs

关键参数先看这里

下面保留本地说明书里的核心参数,去掉太长的芯片手册细节,客户排查时先看这些就够用。

STM32F103C8T6

内核ARM Cortex-M3,常见主频 72MHz。
供电/IO芯片工作电压约 2.0-3.6V,开发板 IO 按 3.3V 逻辑处理。
下载本资料使用 ST-Link / SWD 下载,不走串口下载。
串口调试PA9=TX,PA10=RX,接 CP2102 时 TX/RX 要交叉。

HC-SR04

测距范围常见 2cm-400cm,实际受反射面、角度和供电影响。
触发Trig 给 10us 左右高电平脉冲。
回波Echo 高电平宽度对应距离,老版 5V 模块 Echo 要分压。
周期建议 60ms 左右测一次,太快会受上一次回波影响。

0.96 寸 OLED

驱动常见 SSD1306。
接口I2C,只用 SCL/SDA 两根信号线。
地址常见 0x3C,少数为 0x3D。
Adafruit SSD1306 + Adafruit GFX。

Version

H0611 老版和 H43 新版不要混接

H0611:老版本 5V HC-SR04

老版 HC-SR04 一般按 5V 模块使用。STM32F103 是 3.3V 主控,Trig 从 STM32 输出到模块通常没问题,但 Echo 从模块回到 STM32 可能是 5V,高于 STM32 IO 安全电压。

建议:Echo 线加 1k/2k 或类似比例分压,再接 PA1。

H43:新版本宽电压 3.3-5V

新版本按宽电压模块整理,适合 3.3V 主控测试。若客户手上是 H43,可优先尝试 3.3V 供电,Echo 电平更容易和 STM32 匹配。

建议:仍要先看模块丝印和当前批次说明,不要把所有 HC-SR04 都当宽电压。

Wiring

STM32F103C8T6 + HC-SR04 + OLED 接线

下面接线按已验证工程整理:超声波用 PA0/PA1,OLED 用 PB6/PB7,串口调试用 PA9/PA10。

STM32F103C8T6 连接 HC-SR04 和 0.96 OLED 的接线原理图
模块引脚STM32F103C8T6说明
HC-SR04 VCC5V 或 3.3VH0611 老版按 5V;H43 宽电压可按 3.3V/5V 说明测试。
HC-SR04 GNDGND必须共地。
HC-SR04 TrigPA0STM32 输出 10us 触发脉冲。
HC-SR04 EchoPA1H0611 老版建议分压后再接 PA1。
OLED VCC3.3V按 I41 0.96 OLED 实物支持电压为准。
OLED GNDGND和 STM32、HC-SR04 共地。
OLED SCLPB6STM32duino 默认 Wire SCL。
OLED SDAPB7STM32duino 默认 Wire SDA。
CP2102 TXDPA10 / RX串口交叉接线。
CP2102 RXDPA9 / TX串口监视器 115200。
步骤 1:先接电源共地STM32、HC-SR04、OLED、CP2102 的 GND 必须共地。很多“不显示、不测距”其实是地线没接好。
步骤 2:HC-SR04 接 PA0/PA1Trig 接 PA0,Echo 接 PA1。H0611 老版 5V 输出要先用电阻分压后再进 PA1。
步骤 3:OLED 接 PB6/PB7SCL 接 PB6,SDA 接 PB7。屏不亮先扫地址,常见 0x3C。
步骤 4:串口只用于看日志CP2102 TX 接 PA10,RX 接 PA9,GND 共地,波特率 115200。

Download

下载 STM32 OLED 测距程序

这个包是 PlatformIO + STM32duino 工程,包含 `platformio.ini` 和 `src/main.cpp`。客户下载后解压整个文件夹,不要只复制单个 cpp。

下载后怎么用

  1. 解压 ZIP,保留整个工程文件夹。
  2. 用 VS Code 打开文件夹,安装 PlatformIO 插件。
  3. 接好 ST-Link,确认 BOOT0=0。
  4. 点击 PlatformIO Upload 下载程序。
  5. 打开串口监视器,波特率 115200,看距离输出。

工程文件结构

hcsr04_stm32_bluepill_oled/
├─ platformio.ini
└─ src/
   └─ main.cpp

客户最容易错在只复制 main.cpp。PlatformIO 工程要整个文件夹一起打开,库依赖和开发板配置都在 platformio.ini 里。

Demo

实拍 OLED 测距演示

Code

关键代码说明

下面保留完整工程里的关键文件内容,客户如果不会改代码,可以先不要改引脚,按图接线测试。

#define TRIG_PIN PA0
#define ECHO_PIN PA1

HardwareSerial DebugSerial(PA10, PA9); // RX, TX
Adafruit_SSD1306 display(128, 64, &Wire, -1);

// OLED I2C: SCL=PB6, SDA=PB7
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
[env:bluepill_f103c8]
platform = ststm32
board = bluepill_f103c8
framework = arduino
upload_protocol = stlink
monitor_speed = 115200
lib_deps =
    adafruit/Adafruit SSD1306@^2.5.13
    adafruit/Adafruit GFX Library@^1.11.11

main.cpp 核心示例

// HC-SR04 + STM32F103C8T6 + 0.96 OLED
// Trig=PA0, Echo=PA1
// OLED: SCL=PB6, SDA=PB7, address=0x3C
// Serial monitor: CP2102 TX->PA10, RX->PA9, 115200

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define TRIG_PIN PA0
#define ECHO_PIN PA1
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

HardwareSerial DebugSerial(PA10, PA9); // RX, TX
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

float getDistanceCM() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  unsigned long duration = pulseIn(ECHO_PIN, HIGH, 30000);
  if (duration == 0) return -1;
  return duration * 0.0343f / 2.0f;
}

void showDistance(float cm) {
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("HC-SR04 Distance");

  display.setTextSize(2);
  display.setCursor(0, 24);
  if (cm < 0) {
    display.println("No echo");
  } else {
    display.print(cm, 1);
    display.println(" cm");
  }
  display.display();
}

void setup() {
  DebugSerial.begin(115200);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  digitalWrite(TRIG_PIN, LOW);

  Wire.begin();
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    DebugSerial.println("OLED init failed");
    while (1) delay(100);
  }
  display.clearDisplay();
  display.display();
}

void loop() {
  float cm = getDistanceCM();
  showDistance(cm);

  DebugSerial.print("Distance: ");
  if (cm < 0) DebugSerial.println("No echo");
  else {
    DebugSerial.print(cm, 1);
    DebugSerial.println(" cm");
  }
  delay(200);
}

FAQ

常见问题

H0611 老版 HC-SR04 能不能直接接 STM32?

VCC 可以按老版 5V 模块供电,但 Echo 不建议直接进 STM32。老版 Echo 可能输出 5V,STM32F103 IO 是 3.3V 电平,建议用电阻分压后接 PA1。

H43 宽电压新版为什么更适合 3.3V 主控?

H43 按宽电压 3.3-5V 版本整理,客户使用 STM32、ESP32 等 3.3V 主控时更方便,供电和 Echo 电平更容易匹配。但仍要以实际批次丝印和说明为准。

OLED 不显示怎么办?

先扫 I2C 地址,常见是 0x3C。确认 OLED VCC/GND、PB6=SCL、PB7=SDA,确认库为 Adafruit SSD1306 和 Adafruit GFX。

下载不进去怎么办?

先看 ST-Link 接线:3.3V、GND、SWDIO、SWCLK。BOOT0 正常运行用 0。若芯片识别不到,先确认开发板供电和 ST-Link 驱动。

串口没有输出怎么办?

CP2102 TXD 接 STM32 PA10,CP2102 RXD 接 STM32 PA9,GND 共地,串口监视器波特率 115200。

Customer Reply

淘宝客户简短话术

您好,这套 STM32F103C8T6 + HC-SR04 + 0.96 OLED 测距资料已经整理好。老版 H0611 是 5V HC-SR04,接 STM32 时 Echo 建议分压后再接 PA1;新版 H43 是宽电压 3.3-5V,接 3.3V 主控更方便。OLED 用 I2C,SCL 接 PB6,SDA 接 PB7,常见地址 0x3C。程序请下载完整 ZIP 工程,不要只复制单个 cpp 文件。