STM32F103C8T6
3.3V 主控,常用 BluePill/C8T6 开发板。下载建议用 ST-Link,调试信息可用 CP2102 串口查看。
STM32 · Ultrasonic · OLED
这页单独整理 O31 C8T6 开发板配 I41 OLED、H0611/H43 超声波模块的接线、下载程序和排查说明。重点是 STM32 是 3.3V 主控,老版 5V HC-SR04 的 Echo 要做分压。
本页结论
SKU Map
客户买不同套餐时,可能只买其中一部分。排查时先问清楚手里是哪一款 HC-SR04,以及 OLED 是否为 I2C 4 针款。
| SKU | 产品 | 本页用途 | 注意点 |
|---|---|---|---|
| O31 | C8T6 开发板 国产ST | 主控板 | 按 STM32F103C8T6 兼容开发板处理,具体芯片批次以实物丝印为准。 |
| I41 | 0.96 OLED | 显示测距结果 | I2C 接 PB6/PB7,地址常见 0x3C;若不亮先扫 I2C。 |
| H0611 | HC-SR04 老版本 5V | 超声波测距 | VCC 接 5V;Echo 输出可能是 5V,接 STM32 前要分压到 3.3V 附近。 |
| H43 | HC-SR04 新版本 宽电压3.3-5V | 超声波测距 | 可以按宽电压版本处理,3.3V 主控更方便;仍以当前批次丝印/说明为准。 |
Overview
这套资料按本地完整说明书重新整理:STM32 负责控制和计算距离,HC-SR04 负责发射/接收超声波,0.96 OLED 只负责显示结果。
3.3V 主控,常用 BluePill/C8T6 开发板。下载建议用 ST-Link,调试信息可用 CP2102 串口查看。
Trig 触发,Echo 返回脉宽。老版 5V 模块接 STM32 时,Echo 要先分压,不能直接硬怼 3.3V IO。
0.96 寸 I2C 屏,常见地址 0x3C。本项目只用它显示距离,OLED 不影响 HC-SR04 本身测距。
Specs
下面保留本地说明书里的核心参数,去掉太长的芯片手册细节,客户排查时先看这些就够用。
| 内核 | ARM Cortex-M3,常见主频 72MHz。 |
|---|---|
| 供电/IO | 芯片工作电压约 2.0-3.6V,开发板 IO 按 3.3V 逻辑处理。 |
| 下载 | 本资料使用 ST-Link / SWD 下载,不走串口下载。 |
| 串口调试 | PA9=TX,PA10=RX,接 CP2102 时 TX/RX 要交叉。 |
| 测距范围 | 常见 2cm-400cm,实际受反射面、角度和供电影响。 |
|---|---|
| 触发 | Trig 给 10us 左右高电平脉冲。 |
| 回波 | Echo 高电平宽度对应距离,老版 5V 模块 Echo 要分压。 |
| 周期 | 建议 60ms 左右测一次,太快会受上一次回波影响。 |
| 驱动 | 常见 SSD1306。 |
|---|---|
| 接口 | I2C,只用 SCL/SDA 两根信号线。 |
| 地址 | 常见 0x3C,少数为 0x3D。 |
| 库 | Adafruit SSD1306 + Adafruit GFX。 |
Version
老版 HC-SR04 一般按 5V 模块使用。STM32F103 是 3.3V 主控,Trig 从 STM32 输出到模块通常没问题,但 Echo 从模块回到 STM32 可能是 5V,高于 STM32 IO 安全电压。
建议:Echo 线加 1k/2k 或类似比例分压,再接 PA1。
新版本按宽电压模块整理,适合 3.3V 主控测试。若客户手上是 H43,可优先尝试 3.3V 供电,Echo 电平更容易和 STM32 匹配。
建议:仍要先看模块丝印和当前批次说明,不要把所有 HC-SR04 都当宽电压。
Wiring
下面接线按已验证工程整理:超声波用 PA0/PA1,OLED 用 PB6/PB7,串口调试用 PA9/PA10。
| 模块引脚 | STM32F103C8T6 | 说明 |
|---|---|---|
| HC-SR04 VCC | 5V 或 3.3V | H0611 老版按 5V;H43 宽电压可按 3.3V/5V 说明测试。 |
| HC-SR04 GND | GND | 必须共地。 |
| HC-SR04 Trig | PA0 | STM32 输出 10us 触发脉冲。 |
| HC-SR04 Echo | PA1 | H0611 老版建议分压后再接 PA1。 |
| OLED VCC | 3.3V | 按 I41 0.96 OLED 实物支持电压为准。 |
| OLED GND | GND | 和 STM32、HC-SR04 共地。 |
| OLED SCL | PB6 | STM32duino 默认 Wire SCL。 |
| OLED SDA | PB7 | STM32duino 默认 Wire SDA。 |
| CP2102 TXD | PA10 / RX | 串口交叉接线。 |
| CP2102 RXD | PA9 / TX | 串口监视器 115200。 |
Download
这个包是 PlatformIO + STM32duino 工程,包含 `platformio.ini` 和 `src/main.cpp`。客户下载后解压整个文件夹,不要只复制单个 cpp。
适合 O31 C8T6 开发板、I41 0.96 OLED、HC-SR04 测距。代码里 Trig=PA0,Echo=PA1,OLED PB6/PB7。
下载 hcsr04_stm32_bluepill_oled.ziphcsr04_stm32_bluepill_oled/
├─ platformio.ini
└─ src/
└─ main.cpp
客户最容易错在只复制 main.cpp。PlatformIO 工程要整个文件夹一起打开,库依赖和开发板配置都在 platformio.ini 里。
ST-Link / Serial



Demo
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
// 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
VCC 可以按老版 5V 模块供电,但 Echo 不建议直接进 STM32。老版 Echo 可能输出 5V,STM32F103 IO 是 3.3V 电平,建议用电阻分压后接 PA1。
H43 按宽电压 3.3-5V 版本整理,客户使用 STM32、ESP32 等 3.3V 主控时更方便,供电和 Echo 电平更容易匹配。但仍要以实际批次丝印和说明为准。
先扫 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