STM32 从 0 到 1 做智能家居(三):硬件接线与拨码开关

本文详解STM32智能家居系统的硬件接线规范,涵盖三电源域划分、强制共地原则、关键电容配置;详细说明DHT11、ENS160、舵机、风扇/加热片、HC-06蓝牙及ESP-12F模块的引脚连接、电平匹配与抗干扰要点;重点阐述USART2通过双刀双掷拨码开关实现蓝牙与WiFi二选一的硬件切换机制,并提供上电前自检清单与分步验证流程,确保硬件可靠性为后续MQTT通信奠定基础。

系列第三篇。前两篇把项目结构和开发环境搞定了,这一篇开始真正碰硬件:电源怎么分、每个模块接哪个脚、拨码开关怎么做二选一,以及上电前必须检查的清单。

这一篇的所有结论,都是后面调 MQTT 时能救命的东西。接线错了,代码写得再对也没用。

一、接线前先立三条规矩

我第一个项目烧掉过一块 ENS160,原因很简单:模块丝印上写着 VCC,我想当然接了 5V。它其实是 3.3V 器件。

从那以后我给自己立了三条规矩,建议你也照做:

  1. 永远断电接线。 插拔杜邦线时先拔电源,尤其是 I2C、串口这类信号线,带电插拔可能瞬间打坏 IO。
  2. 先接电源和地,再接信号。 电源错了会烧模块,信号错了最多不通,风险等级完全不同。
  3. 每接完一个模块,立刻做一次通断检查。 不要等全部接完再查,那时候你根本不知道是哪一根线的问题。

再加一条很实用的习惯:固定线色。

颜色用途
红5V
橙 / 黄3.3V
黑GND
绿 / 蓝信号(TX、RX、SDA、SCL、PWM)

线色乱了,后面排查时你会盯着一堆一样的杜邦线发呆。

二、电源与共地(最容易被跳过的一节)

2.1 这个项目其实有三个电源域

电源域给谁供电要求
5V核心板、扩展板、加热片、风扇电流要够,建议 2A 以上适配器
3.3VSTM32 内核、DHT11、ENS160、ESP-12F、HC-06必须稳定,ESP 单独一路更好
独立 5VSG90 舵机独立电源,只共地,不共 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,十有八九是这个问题。

三、引脚总表(照抄即可)

把这张表打印出来放在手边。接线时以表为准,不要凭记忆。

功能引脚外设 / 模式备注
调试串口 TXPA9USART1_TX (AF7)115200,接 USB 转 TTL 的 RX
调试串口 RXPA10USART1_RX (AF7)接 USB 转 TTL 的 TX
蓝牙/WiFi TXPA2USART2_TX (AF7)经拨码开关选模块
蓝牙/WiFi RXPA3USART2_RX (AF7)经拨码开关选模块
语音模块(预留)PC6 / PC7USART6 (AF8)本项目未启用
风扇PA6TIM3_CH1 PWM1kHz,CCR 0~1000
加热片PA7TIM3_CH2 PWM1kHz,CCR 0~1000
窗帘电机(预留)PB0TIM3_CH3 PWM本项目改用舵机
舵机(窗帘)PA0TIM5_CH1 PWM50Hz,CCR 500~2000
DHT11 数据PB1GPIO 开漏 / 输入切换建议 4.7k~10k 上拉
ENS160 SCLPA8I2C3_SCL (AF4, 开漏)100kHz
ENS160 SDAPC9I2C3_SDA (AF4, 开漏)100kHz
光照 ADC(预留)PC0ADC1_IN10本项目未启用
KEY1PC2EXTI2,下降沿,上拉手动=风扇
KEY2PC3EXTI3,下降沿,上拉进/出手动模式
KEY3PA1EXTI1,下降沿,上拉非手动=自动;手动=窗帘
KEY4PB10EXTI15_10,下降沿,上拉非手动=远程/协议;手动=加热
蓝牙复位PC1GPIO 输出上电置高
调试 LEDPC13GPIO 输出串口发送完成翻转
DHT11 LEDPA4GPIO 输出自动模式状态指示
ENS160 LEDPB2GPIO 输出备用
LED4PA5GPIO 输出备用

关于 AF7、AF4:这是"复用功能编号",同一个引脚可以当普通 IO,也可以交给串口/I2C 用。编号选错,外设就是不出波形。这部分在 CubeMX 里点选即可,不要手写。

四、逐个模块接线

4.1 DHT11(PB1)

模块引脚接到
VCC3.3V(模块支持 3.3~5.5V)
DATAPB1
GNDGND

要点:

  • DATA 建议外接 4.7k~10k 上拉到 3.3V。很多模块自带,模块上没有就必须加,否则读出来全是 0xFF 或校验和错误。
  • 线尽量短,控制在 20cm 以内。线一长,边沿变缓,40µs 的采样点就采错位了。
  • 两次读取间隔至少 1 秒。DHT11 手册明确要求,读太快会返回旧数据或直接失败。本项目代码里用 DHT11_RETRY=1、间隔 2 秒,就是为了守这条。
  • 上电后等 1 秒再读,让传感器稳定。

4.2 ENS160(I2C3)

模块引脚接到
VCC3.3V(绝对不能接 5V)
GNDGND
SCLPA8
SDAPC9
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 风扇与加热片

信号接到
风扇 PWMPA6(扩展板 MOS 驱动输入)
加热 PWMPA7(扩展板 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 蓝牙

模块引脚接到
VCC5V 或 3.3V(看模块丝印,两种版本都有)
GNDGND
TXDPA3(MCU 的 RX)
RXDPA2(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.3V3.3V(≥500mA)不要用 USB 转 TTL 的 3.3V
GNDGND必须共地
EN / CH_PD3.3V悬空不启动
RST3.3V低电平复位
GPIO03.3V拉低会进下载模式,不能正常跑 AT
GPIO15GND悬空可能启动失败
TXDPA3交叉接
RXDPA2交叉接

要点:

  • 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 三条铁律

  1. 必须同时切 PA2 和 PA3。 只切一根线,另一根还连着两个模块,照样会打架。这就是为什么用双刀,而不是两个独立的单刀开关随便拨。
  2. 软件读不到开关状态。 所以拨到哪一侧,人必须记住,并且和软件里的协议选择保持一致。
  3. 切换前先断电。 至少也要保证当前没有数据在收发,否则切换瞬间可能出现电平冲突。
想用拨码开关软件操作波特率
蓝牙蓝牙侧(A)远程模式,默认 NET_BT9600
WiFi / MQTTWiFi 侧(B)远程模式下再按一次 KEY4115200

后面 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 对 GNDENS160 / DHT11 都是 3.3V

推荐的上电顺序:

  1. 断电接好所有线;
  2. 只给核心板上电,量 3.3V / 5V;
  3. 断电,再插传感器和通信模块;
  4. 再上电,逐个量模块 VCC;
  5. 最后才烧程序。

这个顺序看起来麻烦,但能保证"烧了模块"这种事不会发生在你身上。

七、上电后的分步验证

接完线不要直接烧完整程序,按这三步走:

第一步:只验证电源

上电,摸一下稳压芯片和 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 全部配好,并解释每个参数为什么这么填。

如果这篇文章对你有帮助,欢迎点赞收藏。系列更新中,下一篇见。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值