小白也能做的DIY智能家居:STM32+ESP32+Home Assistant实战
万事开头难但智能家居这件事我试过之后发现最难的其实是“决定开始”的那一步。今天要分享的这个项目是我自己从零搭起来的一套智能家居系统核心思路就一句话小白也能做不需要预埋、不需要改线、不需要卖房重装。整套系统用到了STM32、传感器、继电器和一块开发板配合开源的Home Assistant做中枢实现手机控制、语音控制、离家自动关灯、温度过高自动开风扇这些基础联动。不夸张地说这套方案的成本压到了几百块钱而且全程没有一个需要焊几十个点的复杂电路。这篇文章我会按实际操作顺序来讲涵盖整体架构、硬件选型、服务端部署、设备接入、自动化配置还有我踩过的一些坑。不管你是完全没接触过嵌入式的纯小白还是已经玩过Arduino想升级到正经智能家居的老手这套方案都能给你一个能跑起来的完整闭环。我先说结论整套系统跑通之后我家的灯泡、风扇、窗帘电机、温湿度计、门磁全部接入了同一个平台每天自动化的触发次数在20次以上稳定性比我预想的好很多。下面直接进入正题。1. 项目思路与整体架构1.1 为什么要走“纯DIY”这条路市面上现成的智能家居产品其实不少小米、华为、天猫精灵买回来连上WiFi就能用。但如果你真的像我一样想把家里“所有”设备拉到同一个平台并且不想被某个品牌的生态绑死那成品方案的缺点就非常明显了不同品牌之间协议不通、设备之间不能真正联动、云端一断就全瞎、数据全部在别人服务器上。我最初的目标不是“买一堆智能插座”而是搭一套能按自己的生活习惯自定义逻辑的系统所以一开始就决定走纯DIY路线。另一个原因是成本。成品智能家居最便宜的灯泡也要几十块一个智能开关面板动辄一两百全屋下来是一笔不小的开销。而我用的这套方案单个传感器模块的价格普遍在几块钱到十几块钱ESP32开发板也就二十几块STM32的核心板更便宜。加上继电器、电源模块、杜邦线这些耗材一个三室一厅的基础智能化改造总成本能控制在三百元以内。而且所有硬件都裸露在外坏了哪块换哪块完全不心疼。最关键的还是学习价值。在这个项目里你会接触到嵌入式开发、WiFi通信、MQTT协议、自动化逻辑设计、甚至一点前端仪表盘配置这些技能是玩成品智能家居永远学不到的。把这套东西跑通你对“物联网”三个字的理解会完全不一样。1.2 总体拓扑与关键技术选型先说我最终采用的系统拓扑画个文字版给你看传感器/门磁/按钮STM32/ESP32采集 ↓ MQTT BrokerMosquitto运行在NAS或树莓派上 ↓ Home Assistant自动化引擎 手机控制面板 语音助手接入 ↓ WiFi/红外/继电器控制风扇、灯、窗帘、插座整套系统里有几个核心选型我先说结论再解释为什么中枢平台用Home AssistantHA免费开源、本地化部署、支持上千种设备接入社区生态非常庞大。装上之后手机、平板、电脑都能通过网页访问面板。通信协议用MQTT它是物联网领域最常用的轻量级发布/订阅协议30行代码就能对接延迟低、消息可靠比HTTP轮询省资源得多。所有设备都走MQTT上报数据、接收指令协议全开放以后加任何新设备都方便。终端控制器用STM32和ESP32混搭。STM32负责采集传感器数据、控制继电器这些底层IO操作功耗低、稳定、便宜ESP32负责WiFi通信通过串口和STM32互通。如果不想搞两颗芯片直接用ESP32单芯片也能做但体验STM32的裸机开发是另一个层面的收获。自动化逻辑全部放在HA里做不在终端设备上写死。好处是以后想改逻辑不用重新烧固件直接在网页上改配置就行。这个架构的核心思想就是模块化、解耦终端只管采集和执行平台只管逻辑和展示互不干扰。这也是生产级物联网系统的通用设计思路从一个小白项目能直接学到架构层面的东西性价比极高。2. 硬件清单与准备细节2.1 全套硬件清单与选型参考直接上我实购的清单价格是参考价实际略有浮动。你在某宝搜索对应关键词都能找到建议搜“XX模块”而不是“XX开发板”价格差别很大。硬件型号/规格参考价用途核心板ASTM32F103C8T6最小系统板约10元采集传感器、控制继电器核心板BESP32 DevKitC V4约25元WiFi通信连接MQTT温湿度传感器DHT11模块约5元房间温湿度采集人体红外传感器HC-SR501模块约4元人来自动亮灯、人走关灯门磁传感器干簧管磁铁套装约3元门窗开关状态检测继电器模块5V光耦隔离继电器 4路约12元控制灯光、风扇等电源模块AMS1117-3.3V稳压模块约3元给STM32供电电源适配器5V 2A USB电源约10元给整个终端设备供电蜂鸣器模块有源蜂鸣器约2元报警/提示音面包板杜邦线面包板1块公母杜邦线若干约15元原型搭建OLED屏幕0.96寸 SSD1306 I2C约15元显示传感器数据和设备状态服务器端我用的是一台旧笔记本装的Ubuntu Server跑Docker容器部署HA和Mosquitto。没有旧电脑的话用树莓派也可以或者直接用一台不用的安卓手机装Linux Deploy再退一步先在一台Windows电脑上装虚拟机跑HA也不是不行。总之服务端硬件不需要额外花钱把手头能用的设备利用起来就行。这套清单里我建议你刚开始可以先买前五项先把“采集温度 上报 手机看到数据”这个链路跑通再逐步加执行器。一次性买全所有模块容易积灰我第一套方案最后剩了三个继电器没用上都是因为前期规划没做好。2.2 传感器与执行器的避坑要点选传感器的时候我踩过一个大坑贪便宜买了裸片传感器而不是模块。DHT11有裸片和PCB模块两种形态裸片只有三个引脚需要自己接上拉电阻而且不带排针对新手极不友好。模块版的引脚齐全、板上自带上拉和滤波直接用杜邦线插面包板就行。所以芯片采购时一定要留意“模块”字样。人体红外传感器HC-SR501有两个可调电位器分别控制灵敏度检测距离和延时时间输出持续高电平时间。我第一次拿到时没调直接接上去发现人走过去好几秒了灯才灭后来把延时电位器逆时针调到最小约5秒灵敏度调到大概3米测试起来才顺手。这个模块上电后有约30秒的初始化时间这期间输出会乱跳属于正常现场测试时别慌。继电器模块这里必须单独强调一下家用电是220V交流危险程度极高绝对不要直接用手触碰裸露的接线端子。如果只是做学习和原型验证建议先用低压直流设备如12V风扇、LED灯带当负载测试不要一上来就控制220V吸顶灯。等彻底搞懂了接线方式再考虑用带外壳的成品继电器模块控制强电或者直接买智能断路器替换原来的空气开关——但从安全角度我个人更推荐用低压设备验证逻辑实际改造再叫电工操作。3. 服务端部署与自动化配置3.1 部署Home Assistant搭建家庭中枢先装好系统层面的依赖。假设你已经有一台Ubuntu Server或者树莓派第一步装Docker和Docker Compose# 安装 DockerUbuntu 22.04 实测 curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER newgrp docker # 创建目录 mkdir -p ~/ha cd ~/ha然后写一个docker-compose.yml把HA和Mosquitto一次性拉起来version: 3.9 services: homeassistant: container_name: hass image: ghcr.io/home-assistant/home-assistant:stable volumes: - ./config:/config - /etc/localtime:/etc/localtime:ro restart: unless-stopped network_mode: host privileged: true mqtt: container_name: mqtt image: eclipse-mosquitto:2.0 ports: - 1883:1883 - 9001:9001 volumes: - ./mosquitto/config:/mosquitto/config - ./mosquitto/data:/mosquitto/data restart: unless-stopped注意HA用的是network_mode: host因为HA的发现功能需要广播和访问局域网内的各种设备NAT模式下会漏掉不少设备我当初没设这个参数导致小米网关一直发现不了排查半天才发现是这个原因。Mosquitto需要建一个配置文件在./mosquitto/config/下创建mosquitto.confpersistence true persistence_location /mosquitto/data/ listener 1883 allow_anonymous true第一次跑通可以先开匿名访问方便测试。但一旦接入互联网环境一定要加用户名密码不要裸奔。启动之后浏览器访问http://服务器IP:8123首次会要求创建账号设置好之后HA的初始配置就完成了。3.2 设备接入与MQTT设备建模现在到了最关键的部分把STM32/ESP32采集到的数据接进HA。先讲终端部分。我用STM32读取DHT11和HC-SR501通过串口将数据发给ESP32ESP32负责WiFi连接和MQTT上报。这部分在STM32上的核心代码逻辑如下// STM32 读取DHT11并发送给ESP32伪代码 uint8_t temperature, humidity; DHT11_ReadData(temperature, humidity); if (HC_SR501_Read() HIGH) { presence 1; // 有人 } else { presence 0; // 无人 } char buf[64]; sprintf(buf, TH:%.2d:%.2d:P%d\r\n, temperature, humidity, presence); UART_SendString(USART1, buf); HAL_Delay(3000); // 每3秒上报一次ESP32端就是接收串口数据解析后发布MQTT消息// ESP32 接串口数据并发布MQTT伪代码 void loop() { if (Serial.available()) { String data Serial.readStringUntil(\n); if (data.startsWith(TH:)) { // 解析温度、湿度、人体状态 float temp data.substring(3, 5).toFloat(); float humi data.substring(6, 8).toFloat(); int presence data.substring(10, 11).toInt(); char topic[40]; char payload[20]; sprintf(topic, home/room1/temperature); sprintf(payload, %.1f, temp); mqtt.publish(topic, payload); sprintf(topic, home/room1/humidity); sprintf(payload, %.1f, humi); mqtt.publish(topic, payload); sprintf(topic, home/room1/presence); sprintf(payload, %d, presence); mqtt.publish(topic, payload); } } }MQTT的topic命名我用了三段式home/房间/数据项比如home/room1/temperature。这种命名方式在后续加设备时特别清晰home下一层是区域再下一层是具体数据项用通配符也能批量子订阅比如home//temperature就可以订阅所有房间的温度。然后去HA里配置MQTT集成。在configuration.yaml里加入mqtt: sensor: - name: 室温 state_topic: home/room1/temperature unit_of_measurement: °C device_class: temperature - name: 湿度 state_topic: home/room1/humidity unit_of_measurement: % device_class: humidity - name: 人体存在 state_topic: home/room1/presence payload_on: 1 payload_off: 0如果你和我一样用的ESP32刷的是ESPHome固件而不是手写代码HA还能自动发现设备连配置都不用写这块的体验更好。但手写一遍MQTT流程能帮你把协议吃透所以我还是推荐至少在原型阶段手写一次。3.3 语音控制与自动化联动场景传感器数据接进HA之后设备控制就顺理成章了。HA里有三种方式下发指令仪表盘按钮、语音助手、自动化规则。我最终用得最多的是自动化和语音。自动化配置既可以用自带的“自动化编辑器”可视化管理也可以写YAML。下面这条是我用得最频繁的场景晚上7点后如果检测到有人进入房间就自动打开风扇开3档持续3分钟没有检测到人再自动关掉。alias: 房间夜间自动风扇 trigger: - platform: state entity_id: binary_sensor.r1_presence to: on condition: - condition: time after: 19:00:00 before: 23:30:00 action: - service: select.select_option target: entity_id: select.fan_speed data: option: 3档 - service: switch.turn_on target: entity_id: switch.fan_power mode: single语音控制方面我接入的是天猫精灵通过HA的开放对话能力经过路由器局域网互通的方案配置好之后说“天猫精灵打开卧室风扇”就能触发。如果你是苹果生态也可以用HomeKit Bridge直接把HA设备同步到家庭App里Siri直接控制不需要额外买任何硬件。这两个方案我都试过HomeKit Bridge的稳定性更好天猫精灵需要走云对云的中转偶尔有明显延迟。4. 常见问题与排查技巧实录4.1 常见故障速查与解决思路我把这套系统跑起来之后前两周遇到的所有问题整理成一张速查表每个都是真实踩过的坑按频率排序问题现象根本原因解决方法HA页面看不到设备数据MQTT集成未配置或topic不匹配在MQTT Explorer里订阅topic前缀确认消息是否真的到达Broker温湿度读数显示为0或乱码DHT11时序要求严格杜邦线过长/接触不良换短杜邦线模块与STM32距离尽量小于20cm或改用DHT12I2C彻底避免时序问题人体传感器误触发HC-SR501装在空调风口附近热风导致误判调整安装位置或调低灵敏度电位器风扇继电器“嗒嗒”响GPIO初始化为低电平时继电器吸合上电瞬间抖动在STM32初始化阶段先拉高GPIO再配置为输出模式继电器模块单独供电设备离线/掉线WiFi信号弱或DNS解析问题给ESP32固定IP路由器设置静态DHCP语音控制没有反应语音设备与HA不在同一网段确保手机/音箱与HA服务器在同一个局域网自动场景不触发自动化条件的时区不对检查HA的系统时区设置容器启动时要挂载/etc/localtime这里重点说一个问题DHT11的时序问题。DHT11这个传感器用的是单总线协议对时序精度要求到了微秒级。如果你用的杜邦线太长超过30cm或者面包板接触不良读取大概率失败。我后来换了DHT12I2C版之后整个数据链路就再没出过问题。对于新手我建议直接跳过DHT11买DHT12价格差不多稳定性好太多。4.2 后期稳定性优化与扩展方向系统跑通到基本稳定之后我开始做稳定性加固。第一件事是加了个定时任务每天凌晨3点检查MQTT连接如果发现ESP32掉线就自动重启对应终端电源——这个电源是一个智能插座控制的由HA下发指令重启。这套“自我恢复”机制帮我省去了绝大部分人工维护。第二件事是给传感器数据加了一个“双保险”。原来只上报一个温度后面我在STM32端加了本地判断逻辑如果温度超过40度就直接开继电器接通风扇电源就算MQTT、HA全挂了这套本地保护逻辑依然生效。这和工业控制里的“看门狗”是一个思路把关键安全逻辑下放到终端不依赖云端。后续扩展的话我现在已经加上了窗帘电机控制35块买了一个220V的交流电机控制器通过继电器模块联动定时开关窗帘一个烟雾报警器MQ-2模块检测到烟雾后HA会推送手机通知和蜂鸣器报警还有一个人体存在传感器LD2410毫米波模块比HC-SR501准得多能检测微动比如在椅子上玩手机不会误判为无人。每加一个设备都是在MQTT的topic树上多挂一个节点架构完全不需要动。最后再说说对我个人而言这套系统的价值。做出这套智能家居之后我才真正理解了“物联网”不只是手机App控灯而是一套从物理世界到数据世界再到控制指令的完整环路。每次半夜起床上厕所卫生间的灯自己亮起来走廊的灯跟着亮几秒再熄灭——这种体验不是装逼而是系统真正在按我的习惯运转。小白也能做这句话不是鸡汤。我就是从“不知道PIN是什么”开始一步一步把面包板上的乱线变成了全屋自动化。如果你也手痒先从最便宜的那几家模块买起跑通“温度上报到手机”这一件事大概率就回不去了。

相关新闻

QuickRecorder:10MB 以内的免费开源 macOS 录屏工具

QuickRecorder:10MB 以内的免费开源 macOS 录屏工具

QuickRecorder:10MB 以内的免费开源 macOS 录屏工具 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/GitHub_Trend…

2026/9/20 3:16:16 阅读更多 →
GHelper 完整指南:华硕笔记本性能模式、风扇控制与显卡模式管理

GHelper 完整指南:华硕笔记本性能模式、风扇控制与显卡模式管理

GHelper 完整指南:华硕笔记本性能模式、风扇控制与显卡模式管理 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Ze…

2026/9/20 3:16:16 阅读更多 →
信创环境下WordPress公式兼容:Pandoc+MathJax批量转换方案

信创环境下WordPress公式兼容:Pandoc+MathJax批量转换方案

1. 先把问题拆透:公式兼容卡在哪一步1.1 信创环境下的WordPress部署栈提到信创环境,很多人第一反应就是"国产服务器、国产操作系统、国产数据库",但落到实际部署时,真正影响公式兼容问题的,往往是这三层&…

2026/9/20 3:16:16 阅读更多 →

最新新闻

自学编程第八天:白纸复盘变量内存,手写函数避坑指南

自学编程第八天:白纸复盘变量内存,手写函数避坑指南

这是记录学习计算机的第八天。今天没有往后面赶新进度,反而干了一件看起来挺“吃亏”的事:把前七天的知识从头到尾复盘了一遍,步骤简单到有点寒酸——一张白纸,一支笔,不翻笔记,不查资料。起因是昨晚学函数…

2026/9/20 3:50:36 阅读更多 →
免费本地文字转语音:ChatTTS-ui

免费本地文字转语音:ChatTTS-ui

免费本地文字转语音:ChatTTS-ui 【免费下载链接】ChatTTS-ui 一个简单的本地网页界面,使用ChatTTS将文字合成为语音,同时支持对外提供API接口。A simple native web interface that uses ChatTTS to synthesize text into speech, along with…

2026/9/20 3:50:36 阅读更多 →
网盘直链下载助手 LinkSwift 完整教程:快速获取 9 大网盘下载直链

网盘直链下载助手 LinkSwift 完整教程:快速获取 9 大网盘下载直链

网盘直链下载助手 LinkSwift 完整教程:快速获取 9 大网盘下载直链 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动…

2026/9/20 3:50:36 阅读更多 →
配电网重构实战:粒子群算法联合分层前推回代降线损

配电网重构实战:粒子群算法联合分层前推回代降线损

先聊一个很多做配网规划、配网自动化的人都绕不开的问题:网架差不多、线路参数差不多,但线损率就是比别人高几个百分点。很多时候问题不在设备上,而在运行方式上——线路里哪些开关该合、哪些该分,这个组合决定了潮流的走向&#…

2026/9/20 3:50:36 阅读更多 →
VS Code 远程开发配置指南:SSH 连接与 codex 安装排错

VS Code 远程开发配置指南:SSH 连接与 codex 安装排错

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 3:50:36 阅读更多 →
VS Code插件默认安装路径修改:告别C盘爆满,全平台实操指南

VS Code插件默认安装路径修改:告别C盘爆满,全平台实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 3:49:32 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →