基于单片机+华为云物联网平台设计的居家电路保护装置
一、前言
1.1 项目介绍
【1】项目开发背景
随着现代家庭电器设备的日益增多,家庭用电安全问题逐渐成为人们关注的重点。为了确保家庭电路的安全可靠运行,预防因电路故障或不当使用电器而导致的安全事故,设计一款高效、智能的居家电路保护装置显得尤为重要。该装置不仅能够实时监测家庭电路中的电压、电流和功率等关键参数,还能对环境温湿度及烟雾浓度进行监控,从而为用户提供全方位的家庭用电安全保障。
在传统家庭电路保护方案中,通常仅依靠断路器来提供过载保护,但这种方式无法实现精细化管理,也无法为用户提供详细的用电信息反馈。因此,我们基于单片机与物联网技术,开发了一款集成了多种功能的智能居家电路保护装置。这款装置安装于家庭总电表输出端,支持多达20路独立线路的连接,每一路都可以单独监控其用电情况,包括电压、电流、功率的变化。通过内置的高精度电力参数采集模块,装置能够准确测量并分析各线路的用电数据,一旦检测到异常,如电流或功率超过设定阈值,它将立即切断电源,并通过本地蜂鸣器发出警报,同时向用户的手机APP发送通知,以便用户及时采取措施。
考虑到智能家居系统的普及以及用户对于远程监控的需求,我们的设计方案特别加入了WIFI联网功能。利用MQTT协议,所有状态信息都可以上传至华为云物联网服务器,用户无论身处何地,只需打开手机上的Android应用程序,即可查看家中的用电状况,了解历史变化趋势,并可查看以波形或数字形式呈现的数据。此外,通过这个应用程序,用户还能够实现远程控制,例如恢复被切断的电源或者调整报警阈值。
为了让用户更直观地掌握当前的用电情况,我们在装置上配置了一个OLED显示屏,可以实时显示采集到的所有信息。这样即使没有智能手机,用户也能一目了然地看到重要的用电数据。同时,我们也选用了SHT30传感器来监测环境温湿度,以及MQ2传感器用于烟雾浓度监测,这些都进一步增强了装置的安全性和功能性。
整个项目采用STM32F103RCT6作为主控芯片,它具有高性能、低功耗的特点,非常适合处理复杂的计算任务和通信任务。软件方面,STM32的开发使用Keil5工具链,编程语言选择C语言,而Android应用则采用Qt框架进行开发,编程语言为C++。这种组合不仅保证了硬件和软件之间的紧密配合,也使得系统具备良好的稳定性和扩展性。通过这样一个智能居家电路保护装置,我们希望能够为每一个家庭带来更加安心、便捷的用电体验。
【2】设计实现的功能
当前项目使用的硬件模块对应的代码工程已经更新到网盘:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
(1) 电路监测与保护功能 支持直流电和单相交流电的电压、电流、功率监测功能。当检测到某一路线路的电流或功率超过设定阀值时,装置会立即切断电源,同时通过本地蜂鸣器报警,上传告警信息至物联网服务器,并推送到手机APP。
(2) 多路电路独立监控 支持最多20路独立线路的用电参数监测,包括电压、电流、功率等。各路参数的历史变化数据会以波形图或数字形式在手机APP中显示,方便用户掌握各电器的用电情况。
(3) 环境温湿度监测功能 通过SHT30传感器实时测量周围环境的温度和湿度,并将数据上传到物联网服务器和手机APP,同时支持在本地OLED显示屏上显示当前的环境信息。
(4) 烟雾浓度检测功能 利用MQ2传感器监测空气中的烟雾浓度。如果烟雾浓度超过设定的安全阈值,装置会立即触发本地蜂鸣器报警,同时将告警信息上传至物联网服务器,并推送到手机APP进行远程提醒。
(5) 数据上云与远程监控 支持通过WIFI模块与物联网服务器连接,采用MQTT协议上传设备的各类数据(包括电路监测数据、环境温湿度数据、烟雾浓度数据等)。用户可通过Android手机APP实时查看设备状态,获取数据历史记录,并远程操作和管理设备。
(6) 本地实时数据显示 采用0.96英寸OLED显示屏,实时显示所有监测数据,包括电压、电流、功率、环境温湿度、烟雾浓度等信息,便于用户在现场查看设备工作状态。
(7) 超限保护与告警功能 当检测到任何线路的电流、功率超出设定阀值,或烟雾浓度超标时,装置会自动切断相关线路的电源,并发出蜂鸣器告警,同时通过物联网服务器将信息传递至手机APP。
(8) 历史数据存储与波形显示 支持电压、电流、功率等参数的历史变化数据存储,并通过手机APP以波形图形式显示,方便用户进行用电分析和趋势判断。
(9) 手机APP远程控制功能 用户可通过手机APP远程控制设备,包括开关各路电路、修改参数阈值,以及查看历史数据和告警记录等。
(10) 智能化与模块化设计 所有功能模块化设计,方便硬件扩展与维护,同时通过软件配置和调试实现灵活功能升级,适应不同家庭需求。
(11) 全面的安全与节能方案 通过精准的监测和智能控制,帮助用户在确保安全的前提下合理用电、减少浪费,实现节能减排的目标。
【3】项目硬件模块组成
(1) 主控模块:采用STM32F103RCT6作为核心控制器,该芯片具备高性能ARM Cortex-M3内核,提供丰富的外设接口和足够的处理能力,以满足对多路电力参数的实时监测、数据处理以及与云端通信的需求。
(2) 电力参数采集模块:选用支持串口通信的电力参数采集模块,用于精确测量每一路电路中的电压、电流和功率等电能参数。此模块能够将采集到的数据通过串行接口发送给主控MCU进行分析处理,确保了数据的准确性与稳定性。
(3) 环境温湿度传感器:安装SHT30数字温湿度传感器,用以监控周围环境的温度和湿度变化。该传感器具有高精度和快速响应的特点,可以为用户提供准确的室内环境信息,并帮助检测潜在的安全隐患。
(4) 烟雾浓度检测模块:集成MQ2气体传感器,专门用来探测空气中烟雾浓度。当检测到异常高的烟雾水平时,系统会触发报警机制,提醒用户可能存在火灾风险。
(5) 无线通信模块:采用ESP8266 WIFI模块,负责实现设备与互联网之间的连接,使得装置可以通过MQTT协议向华为云物联网平台上传数据。此外,它还支持远程配置和控制功能,允许用户通过手机APP管理家居用电情况。
(6) 本地显示模块:配备一块OLED显示屏,用于直观地呈现当前各路电路的电压、电流、功率状态,以及环境温湿度和烟雾浓度等信息。OLED屏幕提供了清晰的视觉效果,便于用户即时了解家庭用电状况。
(7) 声光报警模块:包括一个高电平触发的有源蜂鸣器,当检测到任何危险信号(如过载、短路或者高烟雾浓度)时,蜂鸣器会发出响亮的声音警报;同时还可以添加LED指示灯来增强视觉警示效果。
(8) 电源管理模块:设计专门的电源管理系统,确保整个系统的稳定供电。考虑到不同应用场景下的需求,该模块应能兼容直流和单相交流输入,并且拥有适当的过压、欠压保护措施,以保障系统长期可靠运行。
(9) 继电器控制模块:为了实现对各路电路的通断控制,每个回路上都会串联一个小型继电器。这些继电器受主控MCU控制,在发生异常情况时迅速切断相关电路,防止事故扩大化。
1.2 设计思路
本项目设计的核心思路是将电路保护功能与物联网技术相结合,构建一个智能化、模块化的居家电路保护装置。通过对家庭电路的实时监控和远程管理,实现对电路安全的全面保障和对用电信息的高效管理。整个设计从功能需求出发,综合硬件选型、软件开发、数据通信和用户体验等多个方面展开,力求提供一套完整且实用的解决方案。
基于对家庭用电安全问题的分析,确定了装置的主要功能,包括电路监测与保护、环境参数监测、烟雾浓度检测等。为了实现这些功能,选择STM32F103RCT6作为主控芯片,利用其性能稳定、资源丰富的特点,通过与外部传感器和模块的结合,构建多功能数据采集与处理系统。设计中采用的电力参数采集模块通过串口通信采集电压、电流、功率等关键参数,确保数据的精确性和可靠性。同时,为提升系统的适用性,支持最多20路独立线路的电路监控与保护,满足大多数家庭的用电需求。
考虑到家庭环境对安全和舒适的双重要求,设计中加入了环境温湿度监测和烟雾浓度检测功能。环境温湿度通过SHT30传感器获取,实时反映家庭的环境状态,帮助用户及时调整室内环境。烟雾浓度通过MQ2传感器检测,当烟雾浓度超限时触发报警,及时预警潜在火灾风险,为家庭安全提供额外保障。这些功能的加入,不仅丰富了装置的应用场景,还显著提升了用户的安全感。
为了实现设备的智能化和远程管理,项目设计中引入了物联网技术。装置通过WIFI模块接入互联网,利用MQTT协议与华为云物联网服务器通信。所有数据,包括电路参数、环境参数和报警信息,都将实时上传至服务器。用户可通过Android手机APP查看这些数据,APP采用Qt开发,提供直观的用户界面和高效的交互方式。此外,APP还支持远程操作,包括线路开关控制、参数阈值设置等,极大地提升了用户的便捷性和对设备的掌控能力。
数据展示方面,项目设计兼顾了远程和本地两种场景。在远程端,手机APP提供波形和数字两种显示方式,满足用户对用电数据的详细分析需求。在本地端,使用0.96英寸OLED显示屏实时显示当前监测的所有数据,方便用户在现场直观了解设备的运行状态。此外,历史数据的存储和展示功能,使用户能够回顾和分析各项参数的变化趋势,帮助优化用电习惯。
为了确保系统的稳定性与可靠性,设计中采用了模块化思路,各功能模块相对独立,互不干扰。例如,电路监测模块、环境监测模块、烟雾检测模块和数据通信模块分别设计和测试,在主控芯片的统一管理下协调运行。这样不仅简化了硬件设计和软件开发过程,还提高了系统的可维护性和扩展性。
整体设计还充分考虑了设备的安全性。通过硬件和软件的结合,装置在检测到电路超载或烟雾超标时,能迅速切断电源并发出警报,最大程度降低风险。同时,利用物联网技术实现远程报警提醒,让用户即使不在家中也能及时掌握安全状况。综合以上设计思路,本项目不仅满足了现代家庭对电路保护的基本需求,还通过智能化手段提升了用户体验,为建设更加安全、舒适和节能的家庭环境提供了可靠的技术支持。
1.3 系统功能总结
功能模块 | 描述 |
---|---|
主控模块 | 使用STM32F103RCT6作为核心控制器,负责整体数据处理、逻辑控制及与各子系统的通信。 |
电力参数监测 | 实时监测每一路线路上的电压、电流和功率,并在超过设定阈值时自动切断电源并报警。 |
环境温湿度监测 | 通过SHT30传感器实时监测环境温度和湿度,提供室内环境信息,帮助识别潜在的安全风险。 |
烟雾浓度监测 | 利用MQ2传感器检测空气中的烟雾浓度,在浓度超标时触发警报并向用户发送通知。 |
无线通信功能 | 内置WIFI模块ESP8266,使用MQTT协议将设备状态上传至华为云物联网平台,支持远程监控。 |
本地显示功能 | 配备OLED显示屏,实时显示当前用电情况、环境参数等信息,方便用户查看。 |
声光报警功能 | 包含高电平触发的有源蜂鸣器和可能的LED指示灯,在检测到异常情况时发出声音和灯光警示。 |
远程控制功能 | 用户可通过手机APP实现对设备的远程控制,包括但不限于调整报警阈值、恢复被切断的电源等。 |
历史数据分析 | 支持对测量的电压、电流、功率参数的历史变化进行记录,并能在APP上以波形或数字形式展示。 |
电源管理功能 | 设计有专门的电源管理系统,确保系统稳定供电,同时具备过压、欠压保护等功能。 |
继电器控制功能 | 每个回路配备小型继电器,用于快速响应异常情况下的断电操作,保障安全。 |
外部接口扩展功能 | 提供扩展接口,为未来的硬件升级或连接额外传感器留出空间。 |
1.4 开发工具的选择
【1】设备端开发
STM32的编程语言选择C语言,C语言执行效率高,大学里主学的C语言,C语言编译出来的可执行文件最接近于机器码,汇编语言执行效率最高,但是汇编的移植性比较差,目前在一些操作系统内核里还有一些低配的单片机使用的较多,平常的单片机编程还是以C语言为主。C语言的执行效率仅次于汇编,语法理解简单、代码通用性强,也支持跨平台,在嵌入式底层、单片机编程里用的非常多,当前的设计就是采用C语言开发。
开发工具选择Keil,keil是一家世界领先的嵌入式微控制器软件开发商,在2015年,keil被ARM公司收购。因为当前芯片选择的是STM32F103系列,STMF103是属于ARM公司的芯片构架、Cortex-M3内核系列的芯片,所以使用Kile来开发STM32是有先天优势的,而keil在各大高校使用的也非常多,很多教科书里都是以keil来教学,开发51单片机、STM32单片机等等。目前作为MCU芯片开发的软件也不只是keil一家独大,IAR在MCU微处理器开发领域里也使用的非常多,IAR扩展性更强,也支持STM32开发,也支持其他芯片,比如:CC2530,51单片机的开发。从软件的使用上来讲,IAR比keil更加简洁,功能相对少一些。如果之前使用过keil,而且使用频率较多,已经习惯再使用IAR是有点不适应界面的。
【2】上位机开发
上位机的开发选择Qt框架,编程语言采用C++;Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。Qt能轻松创建具有原生C++性能的连接设备、用户界面(UI)和应用程序。它功能强大且结构紧凑,拥有直观的工具和库。
二、部署华为云物联网平台
华为云官网: https://www.huaweicloud.com/
打开官网,搜索物联网,就能快速找到 设备接入IoTDA
。
2.1 物联网平台介绍
华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。
使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。
物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。
设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。
业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。
2.2 开通物联网服务
地址: https://www.huaweicloud.com/product/iothub.html
点击立即创建
。
正在创建标准版实例,需要等待片刻。
创建完成之后,点击实例名称。 可以看到标准版实例的设备接入端口和地址。
在上面也能看到 免费单元的限制。
开通之后,点击总览
,也能查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。
总结:
端口号: MQTT (1883)| MQTTS (8883)
接入地址:ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
根据域名地址得到IP地址信息:
打开Windows电脑的命令行控制台终端,使用ping
命令。ping
一下即可。
Microsoft Windows [版本 10.0.19045.4170]
(c) Microsoft Corporation。保留所有权利。
C:\Users\11266>ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
正在 Ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:
来自 117.78.5.125 的回复: 字节=32 时间=35ms TTL=93
来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=93
来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=93
来自 117.78.5.125 的回复: 字节=32 时间=39ms TTL=93
117.78.5.125 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 35ms,最长 = 39ms,平均 = 36ms
C:\Users\11266>
MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。
2.3 创建产品
(1)创建产品
(2)填写产品信息
根据自己产品名字填写,下面的设备类型选择自定义类型。
(3)产品创建成功
创建完成之后点击查看详情。
(4)添加自定义模型
产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。
模型简单来说: 就是存放设备上传到云平台的数据。
你可以根据自己的产品进行创建。
比如:
烟雾可以叫 MQ2
温度可以叫 Temperature
湿度可以叫 humidity
火焰可以叫 flame
其他的传感器自己用单词简写命名即可。 这就是你的单片机设备端上传到服务器的数据名字。
先点击自定义模型。
再创建一个服务ID。
接着点击新增属性。
2.4 添加设备
产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。
(1)注册设备
(2)根据自己的设备填写
(3)保存设备信息
创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。
(4)设备创建完成
(5)设备详情
2.5 MQTT协议主题订阅与发布
(1)MQTT协议介绍
当前的设备是采用MQTT协议与华为云平台进行通信。
MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前MQTT拥有各种平台和设备上的客户端,已经形成了初步的生态系统。
MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;MQTT协议是工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;所以,只要具备TCP协议栈的网络设备都可以使用MQTT协议。 本次设备采用的ESP8266就具备TCP协议栈,能够建立TCP连接,所以,配合STM32代码里封装的MQTT协议,就可以与华为云平台完成通信。
华为云的MQTT协议接入帮助文档在这里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
业务流程:
(2)华为云平台MQTT协议使用限制
描述 | 限制 |
---|---|
支持的MQTT协议版本 | 3.1.1 |
与标准MQTT协议的区别 | 支持Qos 0和Qos 1支持Topic自定义不支持QoS2不支持will、retain msg |
MQTTS支持的安全等级 | 采用TCP通道基础 + TLS协议(最高TLSv1.3版本) |
单帐号每秒最大MQTT连接请求数 | 无限制 |
单个设备每分钟支持的最大MQTT连接数 | 1 |
单个MQTT连接每秒的吞吐量,即带宽,包含直连设备和网关 | 3KB/s |
MQTT单个发布消息最大长度,超过此大小的发布请求将被直接拒绝 | 1MB |
MQTT连接心跳时间建议值 | 心跳时间限定为30至1200秒,推荐设置为120秒 |
产品是否支持自定义Topic | 支持 |
消息发布与订阅 | 设备只能对自己的Topic进行消息发布与订阅 |
每个订阅请求的最大订阅数 | 无限制 |
(3)主题订阅格式
帮助文档地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
对于设备而言,一般会订阅平台下发消息给设备 这个主题。
设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。
如果设备想要知道平台下发的消息,需要订阅上面图片里标注的主题。
以当前设备为例,最终订阅主题的格式如下:
$oc/devices/{device_id}/sys/messages/down
最终的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down
(4)主题发布格式
对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。
这个操作称为:属性上报。
帮助文档地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
根据帮助文档的介绍, 当前设备发布主题,上报属性的格式总结如下:
发布的主题格式:
$oc/devices/{device_id}/sys/properties/report
最终的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
发布主题时,需要上传数据,这个数据格式是JSON格式。
上传的JSON数据格式如下:
{
"services": [
{
"service_id": <填服务ID>,
"properties": {
"<填属性名称1>": <填属性值>,
"<填属性名称2>": <填属性值>,
..........
}
}
]
}
根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。
根据这个格式,组合一次上传的属性数据:
{"services": [{"service_id": "stm32","properties":{"DHT11_T":30,"DHT11_H":10,"BH1750":1,"MQ135":0}}]}
2.6 MQTT三元组
MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。
接下来介绍,华为云平台的MQTT三元组参数如何得到。
(1)MQTT服务器地址
要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。
帮助文档地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home
MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。
根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的)
华为云的MQTT服务器地址:117.78.5.125
华为云的MQTT端口号:1883
如何得到IP地址?如何域名转IP? 打开Windows的命令行输入以下命令。
ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
(2)生成MQTT三元组
华为云提供了一个在线工具,用来生成MQTT鉴权三元组: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。
下面是打开的页面:
填入设备的信息: (上面两行就是设备创建完成之后保存得到的)
直接得到三元组信息。
得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。
ClientId 663cb18871d845632a0912e7_dev1_0_0_2024050911
Username 663cb18871d845632a0912e7_dev1
Password 71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237
2.7 模拟设备登录测试
经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。
(1)填入登录信息
打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。
(2)打开网页查看
完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。
点击详情页面,可以看到上传的数据:
到此,云平台的部署已经完成,设备已经可以正常上传数据了。
(3)MQTT登录测试参数总结
MQTT服务器: 117.78.5.125
MQTT端口号: 183
//物联网服务器的设备信息
#define MQTT_ClientID "663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define MQTT_UserName "663cb18871d845632a0912e7_dev1"
#define MQTT_PassWord "71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"
//订阅与发布的主题
#define SET_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down" //订阅
#define POST_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report" //发布
发布的数据:
{"services": [{"service_id": "stm32","properties":{"DHT11_T":30,"DHT11_H":10,"BH1750":1,"MQ135":0}}]}
2.8 创建IAM账户
创建一个IAM账户,因为接下来开发上位机,需要使用云平台的API接口,这些接口都需要token进行鉴权。简单来说,就是身份的认证。 调用接口获取Token时,就需要填写IAM账号信息。所以,接下来演示一下过程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
【1】获取项目凭证 点击左上角用户名,选择下拉菜单里的我的凭证
项目凭证:
28add376c01e4a61ac8b621c714bf459
【2】创建IAM用户
鼠标放在左上角头像上,在下拉菜单里选择统一身份认证
。
点击左上角创建用户
。
创建成功:
【3】创建完成
用户信息如下:
主用户名 l19504562721
IAM用户 ds_abc
密码 DS12345678
2.9 获取影子数据
帮助文档:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html
设备影子介绍:
设备影子是一个用于存储和检索设备当前状态信息的JSON文档。
每个设备有且只有一个设备影子,由设备ID唯一标识
设备影子仅保存最近一次设备的上报数据和预期数据
无论该设备是否在线,都可以通过该影子获取和设置设备的属性
简单来说:设备影子就是保存,设备最新上传的一次数据。
我们设计的软件里,如果想要获取设备的最新状态信息,就采用设备影子接口。
如果对接口不熟悉,可以先进行在线调试:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow
在线调试接口,可以请求影子接口,了解请求,与返回的数据格式。
调试完成看右下角的响应体,就是返回的影子数据。
设备影子接口返回的数据如下:
{
"device_id": "663cb18871d845632a0912e7_dev1",
"shadow": [
{
"service_id": "stm32",
"desired": {
"properties": null,
"event_time": null
},
"reported": {
"properties": {
"DHT11_T": 18,
"DHT11_H": 90,
"BH1750": 38,
"MQ135": 70
},
"event_time": "20240509T113448Z"
},
"version": 3
}
]
}
调试成功之后,可以得到访问影子数据的真实链接,接下来的代码开发中,就采用Qt写代码访问此链接,获取影子数据,完成上位机开发。
链接如下:
https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow
三、上位机开发(C++版)
为了方便查看设备上传的数据,接下来利用Qt开发一款Android手机APP 和 Windows上位机。
使用华为云平台提供的API接口获取设备上传的数据,进行可视化显示,以及远程控制设备。
3.1 Qt开发环境安装
Qt的中文官网: https://www.qt.io/zh-cn/
QT5.12.6的下载地址:https://download.qt.io/archive/qt/5.12/5.12.6
打开下载链接后选择下面的版本进行下载:
如果下载不了,可以在网盘里找到安装包下载: 飞书文档记录的网盘地址:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
软件安装时断网安装,否则会提示输入账户。
安装的时候,第一个复选框里的编译器可以全选,直接点击下一步继续安装。
选择编译器: (一定要看清楚了)
3.2 新建上位机工程
前面2讲解了需要用的API接口,接下来就使用Qt设计上位机,设计界面,完成整体上位机的逻辑设计。
【1】新建工程
【2】设置项目的名称。
【3】选择编译系统
【4】选择默认继承的类
【5】选择编译器
【6】点击完成
【7】工程创建完成
3.3 切换编译器
在左下角是可以切换编译器的。 可以选择用什么样的编译器编译程序。
目前新建工程的时候选择了2种编译器。 一种是mingw32
这个编译Windows下运行的程序。 一种是Android
编译器,可以生成Android
手机APP。
不过要注意:Android的编译器需要配置一些环境才可以正常使用,这个大家可以网上找找教程配置一下就行了。
比如:https://blog.csdn.net/xiaolong1126626497/article/details/117254453
windows的编译器就没有这么麻烦,安装好Qt就可以编译使用。
下面我这里就选择的 mingw32
这个编译器,编译Windows下运行的程序。
3.4 编译测试功能
创建完毕之后,编译测试一下功能是否OK。
点击左下角的绿色三角形按钮
。
正常运行就可以看到弹出一个白色的框框。这就表示工程环境没有问题了。 接下来就可以放心的设计界面了。
3.5 设计UI界面与工程配置
【1】打开UI文件
打开默认的界面如下:
【2】开始设计界面
根据自己需求设计界面。
3.6 编译Windows上位机
点击软件左下角的绿色三角形按钮进行编译运行。
3.7 配置Android环境
如果想编译Android手机APP,必须要先自己配置好自己的Android环境。(搭建环境的过程可以自行百度搜索学习)
然后才可以进行下面的步骤。
【1】选择Android编译器
【2】创建Android配置文件
创建完成。
【3】配置Android图标与名称
【3】编译Android上位机
Qt本身是跨平台的,直接选择Android的编译器,就可以将程序编译到Android平台。
然后点击构建。
成功之后,在目录下可以看到生成的apk
文件,也就是Android手机的安装包,电脑端使用QQ
发送给手机QQ,手机登录QQ接收,就能直接安装。
生成的apk
的目录在哪里呢? 编译完成之后,在控制台会输出APK文件的路径。
知道目录在哪里之后,在Windows的文件资源管理器里,找到路径,具体看下图,找到生成的apk文件。
四、PyQt5(Python版)
4.1 安装PyQt5
在Python中安装PyQt库非常简单,可以使用pip
这个包管理工具来完成。PyQt有两个主要版本:PyQt5(基于Qt 5)和PyQt6(基于Qt 6)。
我这里安装Qt5,以Qt5为例进行开发。
要安装PyQt5,打开命令行界面,然后运行以下命令:
pip install PyQt5
安装过程中:
安装完毕。
4.2 安装QtDesigner
如果想使用PyQt5的设计工具(Qt Designer),用图形方式设计界面,可以安装pyqt5-tools
:
pip install pyqt5-tools
安装过程如下:
安装过程中
安装完毕。
4.3 测试Qt环境
安装完成后,先写一份测试代码,创建一个窗口,运行测试Qt环境是否正常。
新建一个文件:hello_pyqt.py
编写代码如下:
import sys
from PyQt5.QtWidgets import QApplication, QWidget # 如果使用PyQt6,这里改为 from PyQt6.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('Hello PyQt')
window.show()
sys.exit(app.exec_())
在终端命令行中运行:
python hello_pyqt.py
如果一切正常,应该能看到一个标题为Hello PyQt
的空白窗口。这表明PyQt已经成功安装并且可以正常使用了。
4.4 设计代码
用 PyQt5 展示了获取数据后如何构建图形界面,实时显示温度、湿度、烟雾浓度、电压、电流、功率的数值及其波形图。
安装依赖:
pip install pyqt5 pyqtchart
完整代码
import sys
import random
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget
from PyQt5.QtChart import QChart, QChartView, QLineSeries
from PyQt5.QtCore import QTimer, QPointF
class DataFetcher:
"""模拟从服务器获取数据的类"""
def get_data(self):
"""获取模拟数据"""
return {
"temperature": random.uniform(20.0, 30.0),
"humidity": random.uniform(40.0, 60.0),
"smoke_level": random.randint(200, 400),
"voltage": random.uniform(220.0, 240.0),
"current": random.uniform(5.0, 15.0),
"power": random.uniform(500, 2000)
}
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Home Circuit Protection Monitor")
# 初始化布局和标签
self.temperature_label = QLabel("Temperature: 0 °C")
self.humidity_label = QLabel("Humidity: 0 %")
self.smoke_label = QLabel("Smoke: 0 ppm")
self.voltage_label = QLabel("Voltage: 0 V")
self.current_label = QLabel("Current: 0 A")
self.power_label = QLabel("Power: 0 W")
# 初始化波形图
self.voltage_chart, self.voltage_series = self.create_chart("Voltage Waveform")
self.current_chart, self.current_series = self.create_chart("Current Waveform")
self.power_chart, self.power_series = self.create_chart("Power Waveform")
# 布局
layout = QVBoxLayout()
layout.addWidget(self.temperature_label)
layout.addWidget(self.humidity_label)
layout.addWidget(self.smoke_label)
layout.addWidget(self.voltage_label)
layout.addWidget(self.current_label)
layout.addWidget(self.power_label)
layout.addWidget(QChartView(self.voltage_chart))
layout.addWidget(QChartView(self.current_chart))
layout.addWidget(QChartView(self.power_chart))
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
# 初始化数据获取器
self.data_fetcher = DataFetcher()
# 定时器,每秒刷新数据
self.timer = QTimer()
self.timer.timeout.connect(self.update_data)
self.timer.start(1000)
# 时间步计数
self.time_step = 0
def create_chart(self, title):
"""创建一个带有标题的波形图"""
chart = QChart()
chart.setTitle(title)
series = QLineSeries()
chart.addSeries(series)
chart.createDefaultAxes()
chart.axisX().setTitleText("Time")
chart.axisY().setTitleText("Value")
return chart, series
def update_data(self):
"""更新界面和波形图的数据"""
data = self.data_fetcher.get_data()
# 更新文本标签
self.temperature_label.setText(f"Temperature: {data['temperature']:.1f} °C")
self.humidity_label.setText(f"Humidity: {data['humidity']:.1f} %")
self.smoke_label.setText(f"Smoke: {data['smoke_level']} ppm")
self.voltage_label.setText(f"Voltage: {data['voltage']:.1f} V")
self.current_label.setText(f"Current: {data['current']:.1f} A")
self.power_label.setText(f"Power: {data['power']:.1f} W")
# 更新波形图
self.update_chart(self.voltage_series, data['voltage'])
self.update_chart(self.current_series, data['current'])
self.update_chart(self.power_series, data['power'])
self.time_step += 1
def update_chart(self, series, value):
"""更新指定波形图的数据"""
series.append(QPointF(self.time_step, value))
if series.count() > 100: # 限制最大点数
series.remove(0)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(800, 600)
window.show()
sys.exit(app.exec_())
五、STM32代码开发
当前项目使用的相关软件工具、传感器代码工程,已经上传到网盘:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
【1】完整代码
下面是核心框架和主程序。
#include "stm32f10x.h"
#include "usart.h"
#include "oled.h"
#include "buzzer.h"
#include "sht30.h"
#include "mq2.h"
#include "esp8266.h"
#include "power_monitor.h"
// 定义电流和功率阈值
#define CURRENT_THRESHOLD 15.0 // 15A
#define POWER_THRESHOLD 3000.0 // 3000W
// 烟雾浓度阈值
#define SMOKE_THRESHOLD 300 // 示例值
// 全局变量
float voltage = 0.0;
float current = 0.0;
float power = 0.0;
float energy = 0.0;
float temperature = 0.0;
float humidity = 0.0;
uint16_t smoke_level = 0;
// 警告标志
uint8_t overcurrent_flag = 0;
uint8_t overpower_flag = 0;
uint8_t smoke_alarm_flag = 0;
// 初始化函数
void System_Init(void) {
// 初始化串口
USART_Init();
// 初始化OLED显示屏
OLED_Init();
// 初始化蜂鸣器
Buzzer_Init();
// 初始化环境温湿度传感器
SHT30_Init();
// 初始化烟雾传感器
MQ2_Init();
// 初始化ESP8266 WiFi模块
ESP8266_Init();
// 初始化电力参数采集模块
PowerMonitor_Init();
}
// 读取传感器数据
void Read_Sensors(void) {
// 读取电力参数
PowerMonitor_Read(&voltage, ¤t, &power, &energy);
// 读取温湿度
SHT30_Read(&temperature, &humidity);
// 读取烟雾浓度
smoke_level = MQ2_Read();
}
// 显示数据到OLED
void Display_Data(void) {
OLED_Clear();
OLED_ShowString(0, 0, "Voltage:");
OLED_ShowFloat(56, 0, voltage, 1);
OLED_ShowString(90, 0, "V");
OLED_ShowString(0, 10, "Current:");
OLED_ShowFloat(56, 10, current, 1);
OLED_ShowString(90, 10, "A");
OLED_ShowString(0, 20, "Power:");
OLED_ShowFloat(56, 20, power, 1);
OLED_ShowString(90, 20, "W");
OLED_ShowString(0, 30, "Temp:");
OLED_ShowFloat(56, 30, temperature, 1);
OLED_ShowString(90, 30, "C");
OLED_ShowString(0, 40, "Humi:");
OLED_ShowFloat(56, 40, humidity, 1);
OLED_ShowString(90, 40, "%");
OLED_ShowString(0, 50, "Smoke:");
OLED_ShowNumber(56, 50, smoke_level);
OLED_Refresh();
}
// 检查报警条件
void Check_Alarm(void) {
overcurrent_flag = (current > CURRENT_THRESHOLD);
overpower_flag = (power > POWER_THRESHOLD);
smoke_alarm_flag = (smoke_level > SMOKE_THRESHOLD);
if (overcurrent_flag || overpower_flag || smoke_alarm_flag) {
Buzzer_On(); // 启动蜂鸣器
} else {
Buzzer_Off(); // 关闭蜂鸣器
}
}
// 上传数据到云端
void Upload_Data(void) {
char mqtt_message[256];
sprintf(mqtt_message,
"{ \"voltage\": %.1f, \"current\": %.1f, \"power\": %.1f, "
"\"temperature\": %.1f, \"humidity\": %.1f, \"smoke\": %d }",
voltage, current, power, temperature, humidity, smoke_level);
ESP8266_MQTT_Publish("home/protection", mqtt_message);
}
// 主程序
int main(void) {
System_Init(); // 系统初始化
while (1) {
Read_Sensors(); // 读取传感器数据
Display_Data(); // 显示数据到OLED
Check_Alarm(); // 检查是否报警
Upload_Data(); // 上传数据到云端
}
}
【2】说明
-
模块初始化:
-
初始化所有必要的模块,包括串口、OLED、蜂鸣器、传感器和WiFi模块。
-
-
传感器读取:
-
通过调用子模块的接口,获取电力参数、温湿度以及烟雾浓度。
-
-
数据展示:
-
使用OLED显示屏展示实时数据。
-
-
报警检查:
-
比较测量值与设定的阈值,如果超出范围,激活蜂鸣器报警。
-
-
数据上传:
-
通过ESP8266模块,利用MQTT协议上传数据到华为云物联网平台。
-
-
主循环:
-
循环读取数据、显示数据、检查报警和上传云端数据。
-
六、总结
在本项目中,设计并开发了一款基于单片机和物联网技术的智能居家电路保护装置。这一装置不仅解决了传统家庭电路保护方案中信息反馈不足、管理粗放的问题,还通过引入先进的传感技术和网络通信手段,实现了对家庭用电情况的精细化管理和全方位监控。该装置安装于家庭总电表输出端,能够支持多达20路独立线路的连接,并为每一路提供电压、电流和功率的实时监测服务。
通过集成高精度的电力参数采集模块,装置可以准确地测量并分析各线路的用电数据,确保了监测结果的真实性和可靠性。一旦检测到异常情况,如电流或功率超过设定阈值,系统会立即采取行动:切断电源以防止潜在的安全事故,并通过本地蜂鸣器发出警报提醒用户。同时,借助内置的WIFI模块,所有状态信息都可以上传至华为云物联网平台,用户无论身处何地,只需打开手机上的Android应用程序,即可查看家中的用电状况,了解历史变化趋势,并可查看以波形或数字形式呈现的数据。此外,通过这个应用程序,用户还可以实现远程控制,例如恢复被切断的电源或者调整报警阈值,极大地提升了用户体验。
为了增强装置的功能性与安全性,我们在设计中加入了环境温湿度传感器SHT30和烟雾浓度检测传感器MQ2,它们分别用于监控室内环境条件和空气中的烟雾水平。这些额外的监测功能进一步提高了装置对于突发状况的响应能力,使得它不仅仅是一个电路保护设备,更成为了一个智能家居生态系统的重要组成部分。OLED显示屏的应用,则让用户无需依赖智能手机也能随时掌握当前的用电情况和其他关键信息,提供了更加直观的操作体验。
在硬件选型方面,选择了STM32F103RCT6作为主控芯片,它具备高性能ARM Cortex-M3内核,不仅满足了复杂的计算任务需求,也保证了系统的稳定运行。软件开发采用了Keil5工具链进行编程,结合C语言编写代码,而Android应用则使用Qt框架开发,采用C++语言编写,确保了不同部分之间的无缝对接。整个项目的实施过程中,注重每一个细节,从选择合适的元器件到优化算法逻辑,力求打造出一个高效、可靠且易于使用的智能居家电路保护解决方案。
这款智能居家电路保护装置集成了多种先进技术,为用户提供更加安全、便捷的家庭用电管理方式。它不仅是现代家居生活中不可或缺的安全保障工具,也是迈向智慧生活的一大步。随着智能家居市场的不断发展和技术的进步,我们相信,这一装置将为更多家庭带来安心、舒适的居住体验,并推动智能家居领域向着更高层次发展。
- 点赞
- 收藏
- 关注作者
评论(0)