文章目录
系列第三篇。前两篇把项目结构和开发环境搞定了,这一篇开始真正碰硬件:电源怎么分、每个模块接哪个脚、拨码开关怎么做二选一,以及上电前必须检查的清单。
这一篇的所有结论,都是后面调 MQTT 时能救命的东西。接线错了,代码写得再对也没用。
一、接线前先立三条规矩
我第一个项目烧掉过一块 ENS160,原因很简单:模块丝印上写着 VCC,我想当然接了 5V。它其实是 3.3V 器件。
从那以后我给自己立了三条规矩,建议你也照做:
- 永远断电接线。 插拔杜邦线时先拔电源,尤其是 I2C、串口这类信号线,带电插拔可能瞬间打坏 IO。
- 先接电源和地,再接信号。 电源错了会烧模块,信号错了最多不通,风险等级完全不同。
- 每接完一个模块,立刻做一次通断检查。 不要等全部接完再查,那时候你根本不知道是哪一根线的问题。
再加一条很实用的习惯:固定线色。
| 颜色 | 用途 |
|---|---|
| 红 | 5V |
| 橙 / 黄 | 3.3V |
| 黑 | GND |
| 绿 / 蓝 | 信号(TX、RX、SDA、SCL、PWM) |
线色乱了,后面排查时你会盯着一堆一样的杜邦线发呆。
二、电源与共地(最容易被跳过的一节)
2.1 这个项目其实有三个电源域
| 电源域 | 给谁供电 | 要求 |
|---|---|---|
| 5V | 核心板、扩展板、加热片、风扇 | 电流要够,建议 2A 以上适配器 |
| 3.3V | STM32 内核、DHT11、ENS160、ESP-12F、HC-06 | 必须稳定,ESP 单独一路更好 |
| 独立 5V | SG90 舵机 | 独立电源,只共地,不共 3.3V |
最容易出事的是第三个:舵机绝对不要从板子的 3.3V 取电。SG90 堵转电流能到 700mA 以上,启动瞬间会把 3.3V 拉到 2V 多,STM32 直接欠压复位。现象就是"舵机一动,板子重启",很多人会误以为是程序跑飞了。
2.2 为什么必须共地
"共地"这三个字听起来像玄学,其实很好理解:
电压是两点之间的"水位差"。如果两块板子的"海平面"(GND)不一样高,同样的 3.3V 信号,在对方眼里可能就是 1.8V 或者 5V。
所以:
- DHT11、ENS160、HC-06、ESP-12F、USB 转 TTL 的 GND,全部要和 STM32 的 GND 连在一起;
- 舵机用独立 5V,但它的 GND 也必须和 STM32 共地;
- 不要用一根很细很长的杜邦线当"公共地",大电流回流时会有压降,表现就是"时好时坏"。
2.3 建议加两颗电容
如果你用的是自己搭的板子,在两个位置各加一颗电容,能省掉很多"随机故障":
- 3.3V 和 GND 之间:100µF 电解 + 0.1µF 陶瓷;
- ESP-12F 的 3.3V 引脚附近:再加一颗 100µF。
ESP 在发射 WiFi 数据时电流是脉冲式的,电源稍弱就会掉压重启。日志里看到反复打印 ready,十有八九是这个问题。
三、引脚总表(照抄即可)
把这张表打印出来放在手边。接线时以表为准,不要凭记忆。
| 功能 | 引脚 | 外设 / 模式 | 备注 |
|---|---|---|---|
| 调试串口 TX | PA9 | USART1_TX (AF7) | 115200,接 USB 转 TTL 的 RX |
| 调试串口 RX | PA10 | USART1_RX (AF7) | 接 USB 转 TTL 的 TX |
| 蓝牙/WiFi TX | PA2 | USART2_TX (AF7) | 经拨码开关选模块 |
| 蓝牙/WiFi RX | PA3 | USART2_RX (AF7) | 经拨码开关选模块 |
| 语音模块(预留) | PC6 / PC7 | USART6 (AF8) | 本项目未启用 |
| 风扇 | PA6 | TIM3_CH1 PWM | 1kHz,CCR 0~1000 |
| 加热片 | PA7 | TIM3_CH2 PWM | 1kHz,CCR 0~1000 |
| 窗帘电机(预留) | PB0 | TIM3_CH3 PWM | 本项目改用舵机 |
| 舵机(窗帘) | PA0 | TIM5_CH1 PWM | 50Hz,CCR 500~2000 |
| DHT11 数据 | PB1 | GPIO 开漏 / 输入切换 | 建议 4.7k~10k 上拉 |
| ENS160 SCL | PA8 | I2C3_SCL (AF4, 开漏) | 100kHz |
| ENS160 SDA | PC9 | I2C3_SDA (AF4, 开漏) | 100kHz |
| 光照 ADC(预留) | PC0 | ADC1_IN10 | 本项目未启用 |
| KEY1 | PC2 | EXTI2,下降沿,上拉 | 手动=风扇 |
| KEY2 | PC3 | EXTI3,下降沿,上拉 | 进/出手动模式 |
| KEY3 | PA1 | EXTI1,下降沿,上拉 | 非手动=自动;手动=窗帘 |
| KEY4 | PB10 | EXTI15_10,下降沿,上拉 | 非手动=远程/协议;手动=加热 |
| 蓝牙复位 | PC1 | GPIO 输出 | 上电置高 |
| 调试 LED | PC13 | GPIO 输出 | 串口发送完成翻转 |
| DHT11 LED | PA4 | GPIO 输出 | 自动模式状态指示 |
| ENS160 LED | PB2 | GPIO 输出 | 备用 |
| LED4 | PA5 | GPIO 输出 | 备用 |
关于
AF7、AF4:这是"复用功能编号",同一个引脚可以当普通 IO,也可以交给串口/I2C 用。编号选错,外设就是不出波形。这部分在 CubeMX 里点选即可,不要手写。
四、逐个模块接线
4.1 DHT11(PB1)
| 模块引脚 | 接到 |
|---|---|
| VCC | 3.3V(模块支持 3.3~5.5V) |
| DATA | PB1 |
| GND | GND |
要点:
- DATA 建议外接 4.7k~10k 上拉到 3.3V。很多模块自带,模块上没有就必须加,否则读出来全是
0xFF或校验和错误。 - 线尽量短,控制在 20cm 以内。线一长,边沿变缓,40µs 的采样点就采错位了。
- 两次读取间隔至少 1 秒。DHT11 手册明确要求,读太快会返回旧数据或直接失败。本项目代码里用
DHT11_RETRY=1、间隔 2 秒,就是为了守这条。 - 上电后等 1 秒再读,让传感器稳定。
4.2 ENS160(I2C3)
| 模块引脚 | 接到 |
|---|---|
| VCC | 3.3V(绝对不能接 5V) |
| GND | GND |
| SCL | PA8 |
| SDA | PC9 |
| ADDR | 见下面说明 |
要点:
- 地址由 ADDR 引脚决定:ADDR 接低是
0x52,接高是0x53。本项目代码按 7 位地址 0x53 写(HAL 内部左移后是0xA6)。 - 如果你的模块 ADDR 是悬空的,读出来的地址可能时对时错。最稳的做法:把 ADDR 明确接到 3.3V(用 0x53)或 GND(用 0x52),然后代码里同步改地址。
- I2C 是开漏总线,必须有上拉电阻(模块一般自带 4.7k 到 3.3V)。没有上拉,
HAL_I2C_Mem_Read会一直返回超时,扫描也扫不到任何设备。 - SCL/SDA 不要接反,也不要和 5V 器件混在同一组 I2C 上。
- 上电后 ENS160 需要预热,前几分钟数据会偏高,属正常现象。
4.3 风扇与加热片
| 信号 | 接到 |
|---|---|
| 风扇 PWM | PA6(扩展板 MOS 驱动输入) |
| 加热 PWM | PA7(扩展板 MOS 驱动输入) |
要点:
- 不要用 IO 直接驱动电机或加热片,电流完全不够,还会烧 IO。扩展板上已经有 MOS 管,PA6/PA7 只负责给控制信号。
- 风扇是感性负载,驱动端最好有续流二极管,否则断电瞬间的反电动势会打 MOS 管。
- 加热片是纯阻性负载,电流大,供电线要粗,不要用细杜邦线。
- 加热片工作时会发烫,不要贴着塑料外壳或杜邦线。
- 风扇、加热的电源和 STM32 必须共地,否则 PWM 信号没有参考电平,表现为"有时候转有时候不转"。
4.4 SG90 舵机(PA0)
| 线色 | 接到 |
|---|---|
| 橙(信号) | PA0 |
| 红(电源) | 独立 5V |
| 棕(地) | GND(与 STM32 共地) |
要点:
- 控制信号是 50Hz PWM,高电平 500~2000µs。本项目用 500µs 表示"拉开"、2000µs 表示"关闭"。
- 超出 500~2000µs 的范围,舵机会不响应甚至堵转。代码里如果算出负数或超过 2000,先检查限幅。
- 换独立电源时,只把 GND 和板子连起来,不要把 5V 接到板子的 5V 上(除非你确认板子能承受反向灌流)。
- 舵机上电瞬间会抖一下,这是正常的自检动作,不代表程序有问题。
- 舵机抖动、走到一半回弹,基本都是供电不足;在舵机电源附近并一颗 470µF 以上电解电容会明显改善。
- 不要用手硬拧舵机臂,容易扫齿。
4.5 HC-06 蓝牙
| 模块引脚 | 接到 |
|---|---|
| VCC | 5V 或 3.3V(看模块丝印,两种版本都有) |
| GND | GND |
| TXD | PA3(MCU 的 RX) |
| RXD | PA2(MCU 的 TX) |
要点:
- 交叉接:模块的 TX 接单片机的 RX,模块的 RX 接单片机的 TX。接成 TX-TX 的典型现象是"能发不能收",串口日志里
recv:永远是空的。 - 默认波特率是 9600 8N1,不是 115200。这一点几乎每个人都踩过。
- 手机配对密码一般是
1234或0000。 - 模块上的 LED:快闪 = 未连接,常亮 = 已连接。调试时先看灯,比看代码快。
- HC-06 是经典蓝牙,iPhone 连不上,安卓需要支持 SPP 的串口助手 App。
4.6 ESP-12F(WiFi)
| 引脚 | 接到 | 说明 |
|---|---|---|
| 3.3V | 3.3V(≥500mA) | 不要用 USB 转 TTL 的 3.3V |
| GND | GND | 必须共地 |
| EN / CH_PD | 3.3V | 悬空不启动 |
| RST | 3.3V | 低电平复位 |
| GPIO0 | 3.3V | 拉低会进下载模式,不能正常跑 AT |
| GPIO15 | GND | 悬空可能启动失败 |
| TXD | PA3 | 交叉接 |
| RXD | PA2 | 交叉接 |
要点:
- EN(CH_PD)必须拉高,这是新手第一大坑。悬空时模块电流极小,串口一个字都没有,看起来像"模块坏了"。
- 裸模块的 GPIO15 必须接 GND,GPIO0 和 GPIO2 保持高电平,才能从 Flash 正常启动 AT 固件。带底板(NodeMCU 那种)的模块一般已经处理好。
- 供电必须 ≥500mA。用电脑 USB 转 TTL 的 3.3V 供电,现象是日志里反复出现
ready,模块不停重启。 - ESP 刚上电时会先以 74880 波特率打印一段启动日志,然后才切到 115200 的 AT 模式。所以刚上电看到乱码是正常的,不要以为是波特率配错了。
- ESP 和蓝牙不能同时接在 PA2/PA3,必须用拨码开关二选一。
五、拨码开关:USART2 的二选一
5.1 为什么必须用开关
STM32 只有一组 USART2(PA2/PA3),却要接两个模块。如果不做切换:
- 两个模块的 TX 同时接到 PA3,会互相驱动、电平对打;
- 现象不是"完全不工作",而是随机乱码、时通时不通,这种问题最难查。
所以必须用双刀双掷(2P2T)拨码开关,把 PA2、PA3 同时切过去。
5.2 接线方式
┌── A 侧:PA2 ↔ HC-06 RXD ,PA3 ↔ HC-06 TXD
PA2 ── 公共端 1 ┤
└── B 侧:PA2 ↔ ESP RXD ,PA3 ↔ ESP TXD
┌── A 侧:同上
PA3 ── 公共端 2 ┤
└── B 侧:同上
也就是说:
- 开关的两个公共端分别接 PA2、PA3;
- 开关的 A 侧接蓝牙的 RXD、TXD;
- 开关的 B 侧接 ESP 的 RXD、TXD;
- 开关拨到哪一侧,USART2 就接到哪个模块。
5.3 三条铁律
- 必须同时切 PA2 和 PA3。 只切一根线,另一根还连着两个模块,照样会打架。这就是为什么用双刀,而不是两个独立的单刀开关随便拨。
- 软件读不到开关状态。 所以拨到哪一侧,人必须记住,并且和软件里的协议选择保持一致。
- 切换前先断电。 至少也要保证当前没有数据在收发,否则切换瞬间可能出现电平冲突。
| 想用 | 拨码开关 | 软件操作 | 波特率 |
|---|---|---|---|
| 蓝牙 | 蓝牙侧(A) | 远程模式,默认 NET_BT | 9600 |
| WiFi / MQTT | WiFi 侧(B) | 远程模式下再按一次 KEY4 | 115200 |
后面 MQTT 初始化全 FAIL 时,第一个要查的就是这个开关。软件里选的是 MQTT,硬件却还在蓝牙侧,日志看起来就像"ESP 完全没反应"。
六、上电前自检清单
建议把这一节截图存手机,每次改完线都过一遍。
| 检查项 | 怎么查 | 合格标准 |
|---|---|---|
| 3.3V 与 GND 是否短路 | 万用表电阻档 / 二极管档 | 不导通(电容充电时短暂响一下正常) |
| 5V 与 GND 是否短路 | 同上 | 不导通 |
| 所有 GND 是否连通 | 万用表通断档,逐个模块量 | 全部导通 |
| 3.3V 实际电压 | 上电后万用表量 | 3.2V ~ 3.4V |
| 5V 实际电压 | 上电后量 | 4.8V ~ 5.2V |
| 串口是否交叉 | 目视 + 通断档 | MCU TX(PA9) → 模块 RX |
| ESP 的 EN | 万用表量 | 3.3V |
| ESP 的 GPIO15 | 万用表量 | 0V(裸模块) |
| 舵机供电 | 目视 | 独立 5V,且 GND 共地 |
| 拨码开关位置 | 目视 | 与软件要用的协议一致 |
| 杜邦线是否虚接 | 轻轻拉一下、通断档量 | 不松动、导通 |
| 模块供电电压 | 逐个量 VCC 对 GND | ENS160 / DHT11 都是 3.3V |
推荐的上电顺序:
- 断电接好所有线;
- 只给核心板上电,量 3.3V / 5V;
- 断电,再插传感器和通信模块;
- 再上电,逐个量模块 VCC;
- 最后才烧程序。
这个顺序看起来麻烦,但能保证"烧了模块"这种事不会发生在你身上。
七、上电后的分步验证
接完线不要直接烧完整程序,按这三步走:
第一步:只验证电源
上电,摸一下稳压芯片和 ESP,明显发烫就立刻断电。发烫通常意味着短路或接反。
第二步:验证调试串口
烧一个只打印 hello 的程序,确认 USB 转 TTL 能收到。这一步过了,说明 PA9/PA10 和共地都没问题。
第三步:逐个接模块
- 先接 DHT11,看串口能不能读到温湿度;
- 再接 ENS160,看 I2C 能不能读到 ID;
- 最后接 ESP / 蓝牙,看串口有没有数据。
一次只加一个模块,出问题时你立刻知道是谁。全接完再测,一旦不通,你面对的是 6 个可疑对象。
八、本章易错点总结
| 现象 | 真正原因 | 处理 |
|---|---|---|
串口能发不能收,recv: 一直为空 | TX/RX 接成 TX-TX、RX-RX | 交叉接:MCU TX → 模块 RX |
| ESP 串口一个字都没有 | EN/CH_PD 悬空 | 把 EN 接到 3.3V |
| 裸 ESP 启动失败、日志乱码 | GPIO15 悬空、GPIO0 被拉低 | GPIO15 接 GND,GPIO0/GPIO2 保持高 |
ESP 日志反复打印 ready | 供电电流不足,模块反复重启 | 独立稳定 3.3V,≥500mA,加 100µF 电容 |
| 蓝牙和 WiFi 都接上后随机乱码 | 两个 TX 同时驱动 PA3 | 用 2P2T 拨码开关二选一,且断电切换 |
| 拨码开关拨了但还是不通 | 只切了 PA2 或 PA3 其中一根 | 必须双刀同时切两根 |
| 舵机一动,板子就复位 | 舵机从板子 3.3V 取电,启动电流拉垮电源 | 舵机独立 5V,并共地 |
| 舵机抖动、回弹、不定位 | 供电不足或没共地 | 加大电容、检查 GND、确认 500~2000µs |
| ENS160 完全读不到 | I2C 没有上拉,或 SCL/SDA 接反 | 加上拉电阻,核对 PA8=SCL、PC9=SDA |
| ENS160 地址对不上 | ADDR 悬空导致地址在 0x52/0x53 之间漂移 | ADDR 明确接高或接低,代码同步改地址 |
| ENS160 上电就坏 | VCC 接了 5V | 只能接 3.3V |
DHT11 读数全是 0xFF 或校验错误 | 没上拉、线太长、读得太频繁 | 加上拉、缩短线、间隔 ≥1s |
| 风扇/加热"有时候转有时候不转" | 大电流设备没有和 MCU 共地 | 电源地、信号地全部连在一起 |
| 插拔杜邦线时火花、模块损坏 | 带电插拔 | 一律断电接线 |
| 换了根杜邦线就好了 | 杜邦线内部断芯 / 接触不良 | 用万用表通断档逐根检查 |
九、小结与下一篇
这一篇做完,硬件部分就有了一个可靠的起点:
- 三个电源域分清,舵机独立供电但共地;
- 每个模块的引脚、上拉、地址、交叉接法都固定下来;
- USART2 用 2P2T 拨码开关做二选一,硬件和软件必须一致;
- 上电前有清单,上电后分步验证,一次只加一个模块。
下一篇开始写代码:用 CubeMX 从零建工程,配置时钟树到 100MHz,把 GPIO、TIM3/TIM5、USART1/2、I2C3 全部配好,并解释每个参数为什么这么填。
如果这篇文章对你有帮助,欢迎点赞收藏。系列更新中,下一篇见。
本文详解STM32智能家居系统的硬件接线规范,涵盖三电源域划分、强制共地原则、关键电容配置;详细说明DHT11、ENS160、舵机、风扇/加热片、HC-06蓝牙及ESP-12F模块的引脚连接、电平匹配与抗干扰要点;重点阐述USART2通过双刀双掷拨码开关实现蓝牙与WiFi二选一的硬件切换机制,并提供上电前自检清单与分步验证流程,确保硬件可靠性为后续MQTT通信奠定基础。
255

被折叠的 条评论
为什么被折叠?



