基于SpringBoot的小型智能家居系统设计与实现 | SpringBoot+STM32+MQTT | X501081
发布时间:2026/10/7 15:08:39 作者:尧图编辑部 阅读量:1,286

原创文章 · 全文约 4600 字 · 建议阅读 13 分钟 · 技术栈STM32F103C8T6 / ESP8266 / MQTT / SpringBoot / MySQL写在前面这套系统解决什么问题。智能家居的入门项目大多停在「传感器读数显示在串口助手上」这一步而真正要在家里用起来至少要补齐三件事数据要能远程看到、报警要能按人在不在家分别处理、阈值要能在页面上改而不用拆机重烧固件。本项目围绕这三件事做的取舍是五路环境与安防信号全部进 STM32判定放在片内完成网络只负责搬运数据与控制指令。一句话技术路线。STM32F103C8T6 最小系统板采集 DHT11 温湿度、光敏电阻模拟量、MQ-2 烟雾模拟量、火焰数字量与门磁开关五路信号在片内按当前工作模式做阈值判定与联动经 ESP8266 走 MQTT 协议上报到服务器服务端为 jeeSite 平台上的 Java / SpringBoot 工程数据落 MySQL前端用 Bootstrap 出实时状态卡、三张曲线图与历史记录列表并把页面改过的阈值反向推回设备。本文的数据从哪来。文中全部引脚分配、参数取值、遥测读数与界面字段逐项取自原理图 PDF 的文字层、运行中的系统截图与硬件实拍 —— 不含推测值凡属按网表或界面归纳之处均在正文中显式标注。一、项目基本情况给家里的温湿度、光照、烟雾、火焰与门窗状态做一套能远程看、能自动响应、阈值还能改的监测与控制装置是智能家居里最基础也最实用的一个场景。这类需求看着简单落到工程上却有三个绕不开的点。第一数据要能被远程看到—— 只在本地串口助手上读数人出门了就什么都不知道第二报警要区分人在不在家—— 同一条门磁信号家人自己开门进来是正常事件主人不在家时被打开才是异常事件两者混在一起必然误报第三阈值不能写死在固件里—— 冬夏温差、厨房油烟浓度都在变每改一次阈值就要拆机接烧录器这套系统在真实家庭里撑不过一个季度。本项目围绕这三件事确定了技术路线五路信号全部进 STM32判定在片内完成网络只承担「把数据搬过去、把指令搬回来」两件事。这样做的直接好处是断网时本地联动仍然照常运行而阈值由上位机页面维护、经下行链路推给设备改完即生效。1.1 需求方案与技术选型项目的需求方案以一张思维导图的形式确定下来软件、硬件、交付内容与设计实现五条要求都写在同一张图上后续开发即以这张图为依据。图 1 需求方案思维导图软件web / 服务端 / 关键技术、硬件构成 / 关键技术 / 连接模式、交付内容三块底部粉底块为设计实现的五条要求图中硬件一栏把构成写得很明确MCU 为 STM32F103传感器包含 DHT11、光敏电阻模块、继电器模块 1 个模拟家电、门磁 1 个、MQ-2、火焰、蜂鸣器、LED 模块与 SG90 舵机传输模块为 ESP8266硬件连接模式为「扩展板 杜邦线连接」。软件一栏则点明两件事web 端要实现用户登录、终端管理、实时监控与历史数据查询服务端要「后端实现 MQTT 客户端通过与硬件订阅相应的主题实现数据交互」技术栈为 jeeSite 平台与 Java / SpringBoot / MySQL / Bootstrap。通信协议一栏的原文是「传输采用 mqtt 协议方式实现服务器采用自建emqx、巴法云、hivemq 等均可」—— 也就是说 broker 是可替换的这一点决定了固件侧只能依赖标准 MQTT 语义不能绑定某一家云平台的私有接口。1.2 设计实现的五条要求方案图底部的粉底块是这份需求文档里最要紧的部分它把「做成什么样才算完成」写成了五条可核对的要求· ① 数据周期性上传至服务器并展示在 web 页面上· ② 设置回家模式与外出模式 —— 其中回家模式下可一键开启 LED 灯与继电器模拟的家电离家模式下门磁打开或烟雾异常、火焰异常、温度异常则声光报警· ③ 可单独控制各执行单元开关继电器 1 个模拟 1 个电器、SG90 舵机门锁、LED 灯· ④ LED 灯在回家模式下会根据光照自动调整亮度· ⑤ 温度、烟雾报警阈值可以远程配置。说明方案图原文写「可一键开启 led灯、继电器模拟的加点」其中「加点」按上下文应为「家电」本文与后续所有图中统一写作「家电」不影响原意。把第 ④ 条与第 ⑤ 条放在一起看能看出这套系统在「自动化」与「可配置」之间的取舍亮度调节这种需要毫秒级响应的动作放在设备侧自动完成而阈值这种需要人来判断的参数放在服务端可配置 —— 两者的共同点是都不需要人去现场碰设备。1.3 交付内容按方案图「交付内容」一栏本项目交付四部分材料与一项服务硬件实物、软硬件程序源码、硬件原理图、演示视频以及远程协助环境搭建、程序调试与答疑。其中硬件原理图同时提供嘉立创 EDA 的源文件json / schdoc 双格式与 PDF、PNG 出图便于自行改板或复核网表。二、系统架构设计2.1 系统功能结构把方案图摊开成三栏能更清楚地看到这套系统里什么是「给用户看的」、什么是「跑在设备上的」、什么是「交付给使用者的」。图 2 系统功能结构Web 上位机功能 / 硬件与通信 / 交付内容值得单独说明的是第三栏里的最后一句话 —— 「传感器 → STM32 判定 → ESP8266 上报 → 服务端落库 → 页面出数 → 页面下发控制」。这六个环节构成一条完整闭环缺任何一环系统就退回到「只能看数」或「只能控制」的半成品。本文后续的架构、引脚、模式与时序四节都是在把这条闭环逐段摊开。2.2 系统总体架构整套系统自上而下分为五层表现层、服务层、通信层、控制层与数据层。分层的目的不是为了好看而是为了让「换掉其中一层」这件事变得便宜 —— 换 broker、换数据库、改阈值都只需要动一层。图 3 系统总体架构自上而下五层表现层 / 服务层 / 通信层 / 控制层 / 数据层五层之间其实只有两处约定一是上行报文里各分量的顺序二是数据库的表结构。只要这两处不变其余部分都可以独立替换。这也解释了为什么方案图会把 broker 写成「自建 emqx、巴法云、hivemq 等均可」—— 在 MQTT 标准语义之下broker 只是一个转发者换掉它不需要改固件以外的任何东西。2.3 硬件系统与引脚分配硬件侧的引脚分配是本项目最需要精确的部分。下图中的每一处网络标号都逐条取自原理图 PDF 的文字层并用高倍渲染逐区核对过 —— 不是为了好看而是因为引脚一旦接错固件写得再对也没用。图 4 硬件系统原理框图五路传感器与四路执行单元的引脚分配主控引脚连接对象信号类型原理图元件位号PA0光敏电阻模块 AO模拟量U3PA1MQ-2 烟雾传感器 AO模拟量GAS1PA2火焰传感器 DO数字量U8PA4门磁开关 COM数字量U6PA11DHT11 温湿度 DATA单总线数字量U2PA8SG90 舵机 SIGNALPWMU4PB1蜂鸣器 2 脚数字量BUZZER1PB4LED 指示灯经 R1 220Ω数字量LED1PB11灯光继电器模块 IN数字量U7PA9 / PA10ESP8266 RX / TX串口U5有一处细节可以说明这版原理图的严谨光敏电阻模块与烟雾传感器的 DO 引脚在图上都是悬空的。这不是漏画 —— 两者都只用了模拟量输出AO参与判定用一路模拟量既能判「有没有」也能判「多少」比再接一路数字量更省引脚也不用为两个模块分别调电位器。与之相对火焰传感器与门磁开关用的都是数字量火焰传感器输出的是「有火 / 无火」门磁输出的是「开 / 关」本质上都是开关量没有中间状态走模拟量反而是浪费。图 5 嘉立创 EDA 原理图出图ESP8266、蜂鸣器、灯光继电器模块、火焰 / 门磁 / 光敏 / 烟雾 / DHT11 传感器与 STM32F103C8T6 最小系统板原理图右上角的灯光继电器模块用的是「1 路光耦隔离继电器模块 XSW」接线端子标明 Relay-1 的 NO / COM / NC 三端。光耦隔离的意义在于把负载侧与主控侧在电气上隔开 —— 模拟的虽然是家电但继电器的线圈动作会产生反电动势隔离之后这条干扰不会窜回 PB11 影响主控。图 6 硬件实物STM32F103C8T6 最小系统板居中四周经杜邦线接出 ESP8266、舵机、继电器、传感器与面包板实物形态与方案图里「扩展板 杜邦线连接」的描述一致主控最小系统板居中蓝色继电器模块、SG90 舵机、ESP8266 与各路传感器经杜邦线接出。整套装置不需要定制 PCB因此复现门槛很低 —— 照着原理图把线插对即可出问题也容易逐根排查。2.4 工作模式与联动逻辑「模式」是这套系统里最容易被低估的一个变量。它不是一个显示状态而是一个决定报警判据是否生效的开关。图 7 工作模式与联动逻辑回家模式 / 离家模式的分工离家模式下的四项报警判定链以及四个可单独控制的执行单元回家模式下门磁、烟雾、火焰、温度四项报警判定全部静默避免「自己开门回家」触发声光报警此时 LED 灯按当前光照自动调整亮度并可一键开启 LED 灯与继电器模拟的家电。离家模式下四项报警判定全部启用门磁打开、烟雾异常、火焰异常、温度异常四个条件任一成立即触发声光报警由蜂鸣器PB1与 LED 指示灯PB4共同承担。报警阈值就落在界面控制区下方的阈值设定区某次运行截面上温度阈值设为 20、烟雾阈值设为 5页面同步回显了「当前阈值温度【20℃】烟雾【5ppm】」。把阈值放在页面上而不是固件里最实际的价值是改完点一次确定即可生效不必重新烧写固件。2.5 数据交互时序下面这张时序图把 2.1 节里那条闭环摊开成了一次完整的往返上行从传感器到页面出数下行从页面操作到执行单元动作。图 8 系统数据交互时序一次采样上报到页面出数再到下发控制的完整往返上行与下行是两条独立路径。遥测帧由主控主动发控制指令由页面发起、经服务端与 broker 到达设备因此断网时设备侧的本地判定仍然照常运行只是页面看不到数、也下不了指令。阈值的往返则是闭环里最容易被忽略的一段 —— 页面改完阈值后要先落库、再经下行路径推给设备设备下一次判定才生效。2.6 软件实现服务端构建在 jeeSite 平台上技术栈为 Java / SpringBoot / MySQL / Bootstrap按方案图的说法服务端要「后端实现 MQTT 客户端通过与硬件订阅相应的主题实现数据交互」。落到实现上服务端的职责可以拆成四件事· 作为 MQTT 客户端订阅上报主题接收硬件侧周期性发来的遥测报文并解析出各传感器分量· 把解析后的采样记录逐条写入数据库同时维护终端的在线状态与最后上报时间· 对外提供查询接口供页面取实时数据与历史记录· 接收页面提交的控制指令与阈值修改经下发主题推送到设备。前端沿用 jeeSite 的多标签页框架菜单在左、页签在上地址形如/a/index#/a/char/index#实时数据查询切换标签不刷新整页因此在实时数据页停留多久都不会打断数据刷新。页面共四个功能页登录页、终端管理、实时数据查询与历史数据查询。三、系统界面展示以下四张图取自运行中的系统页面标题、字段名与取值均为原样未作修饰。3.1 登录页图 9 登录页页面标题「小型智能家居系统」左侧为智能家居场景示意右侧为登录表单登录页由左侧的场景示意图与右侧的登录表单两部分组成表单只保留登录账号与登录密码两项下方另有「忘记密码 联系管理员」入口。系统内部页面统一以「小型智能家居系统」作为标题。3.2 终端管理图 10 终端管理按终端编号、终端名称、安装地址三个条件检索列表当前一条记录终端管理页维持终端与系统的绑定关系查询条件为终端编号、终端名称与安装地址操作按钮有查询、重置与新增。截面上列表只有一条记录ZDBH01/ 智能家居安装地址一列显示为「-」表示该终端尚未登记安装位置。3.3 实时数据查询图 11 实时数据查询9 项传感器状态卡、工作模式与执行单元控制区、阈值设定区以及温度 / 湿度 / 烟雾三张折线图实时数据查询页是这套系统的门面一屏之内解决了三件事看数据、下指令、改阈值。页面顶部给出更新时间与告警信息传感器下拉框选定「智能家居」后点查询即刷新。该截面2025-01-10 23:30:57的九项状态如下指标当次取值说明温度26.4℃DHT11 · DATA→PA11湿度20%DHT11 · DATA→PA11光照380光敏电阻模块 · AO→PA0烟雾4.97ppmMQ-2 · AO→PA1火焰正常火焰传感器 · DO→PA2门磁关闭门磁开关 · COM→PA4电器停止灯光继电器模块 · IN→PB11LED关闭LED 指示灯 · PB4经 R1 220Ω模式在家模式回家模式 / 离家模式同一屏的下方还有三块内容。一是控制区工作模式可选离家模式或在家模式LED 开关可选开灯或关灯电器开关可选打开或关闭另有一键开启与打开门锁两个便捷按钮。二是阈值设定区该截面显示「当前阈值温度【20℃】烟雾【5ppm】」下方两个输入框可分别修改温度阈值与烟雾阈值。三是图表展示区温度、湿度、烟雾三张折线图并列纵轴刻度自适应每条曲线的极值点直接标在图上 —— 温度曲线标注了 26.6 与 26.4 两个点湿度稳定在 20烟雾曲线标注了 5.59 与 4.73。说明页面顶部的告警栏在该截面显示「告警温度异常;」—— 因为温度阈值此时为 20℃、实测为 26.4℃判定为超阈值。这恰好说明报警判定依据的是页面上的阈值参数而不是固件里的固定值。3.4 历史数据查询图 12 历史数据查询按终端编号与终端名称检索八列采样记录每页 20 条累计 6902 条历史数据查询页负责回看。查询条件为终端编号与终端名称列表共八列终端编号、终端名称、温度℃、湿度%、烟雾ppm、火焰、光照与更新时间。截图截面上可见前四条记录终端编号温度(℃)湿度(%)烟雾(ppm)火焰光照更新时间ZDBH0126.60205.85正常3852025-01-10 23:30:04ZDBH0126.60205.42正常3872025-01-10 23:30:02ZDBH0126.60205.45正常3872025-01-10 23:30:01ZDBH0126.60205.59正常3872025-01-10 23:29:59值得注意的是记录之间的时间间隔并不固定23:30:04 与 23:30:02 相隔 2 秒23:30:02 与 23:30:01 只隔 1 秒再往前到 23:29:59 又隔了 2 秒。这说明数据帧并非严格等周期落库而是设备上报一批、服务端写入一批与「数据周期性上传」的描述一致。页面底部的分页条显示「当前 1 页每页 20 条共 6902 条」页码直达 346 页 —— 按每页 20 条估算这就是连续运行约 41 小时积累下来的采样量。对于一套家用监测装置而言这个数据量本身也说明采集链路是稳定跑着的。把这一页与实时数据页对照还能发现一处有意思的差异历史记录里的烟雾值在 5.4~5.9ppm 区间光照在 385~391 之间而实时页同一时段的读数为 4.97ppm 与 380。两组数据来自两次不同时刻的界面刷新数值本就随时间变化 —— 本文两处均如实标注不取平均、不做合并。四、系统视频展示演示视频完整记录了从设备上电、联网到实时数据跳动、切换回家 / 离家模式、触发声光报警、修改阈值并生效的全过程并同时给出上位机页面与硬件装置两侧的画面便于对照「页面上的变化」与「设备上的动作」。图 13 演示视频封面左侧为原理图右侧为硬件装置实拍视频目录另提供无水印版与水印版两套便于不同用途取用。从封面可以看出演示的组织方式 —— 画面左侧是嘉立创 EDA 打开的原理图右侧是装置实拍演示时把「图纸上怎么接」与「实物上怎么动」放在同一屏里对照复核时不必反复在文档与视频之间来回切换。五、获取方法本文所述系统包含硬件实物、软硬件程序源码、硬件原理图与演示视频四部分材料并可按需提供远程协助环境搭建、程序调试与答疑。如需获取完整资料或就实现细节进一步交流可通过下列方式联系。附界面地址一览下列地址为系统在本机运行时的访问路径端口 8889实际部署时把主机名换成本机地址即可。页面访问地址登录页(c, /a/login)系统主页(c, /a/index)终端管理(c, /a/index#/a/zdbh/zdbh/list#终端管理)实时数据查询(c, /a/index#/a/char/index#实时数据查询)历史数据查询(c, /a/index#/a/iotps/facpsp/list#历史数据查询)本文为个人开发记录的整理所述系统为面向家庭场景的软硬件一体项目文中所有引脚、参数、取值与界面字段均可在随项目提供的原理图与源码中逐项复核。本文所述系统的引脚分配、参数取值、报文原文与界面字段均逐项取自原理图 PDF 的文字层、运行中的系统截图与硬件实拍不含推测值凡属按网表或界面归纳之处均已在正文中显式标注。