本文正在参加星光计划3.0–夏日挑战赛
1. 功能介绍
自从地球上出现森林以来,每年平均发生森林火灾超过20万次。森林火灾不仅烧毁树木,直接减少森林面积,而且严重破坏森林结构和森林环境,导致森林生态系统失衡,森林生物量下降,生产力下降,牲畜减少和鸟类减少,甚至牺牲一些重要东西。高强度的火灾会破坏土壤的化学和物理性质,降低水的积累和土壤,使部分林区地下水位升高而溃败,造成沼泽;此外,通过焦化和使土壤表面变暖,也会加速焦土的干燥,导致杂草过度生长。近年来,世界各地每年都会发生许多火灾。大多数国家的火灾直接损失超过国民经济总量的0.2%。事实上,除了直接的经济死亡和财产损失外,火灾后还有重大的间接损失,因此,有必要发展和加强防火和火灾报警。
这篇文章就采用华为云iot物联网平台快速搭建一个森林火灾预警联动控制系统模型
,模拟演示检测到森林火灾之后,如何快速上报到云平台,向关联的指定服务器发送数据报告,并自动向抽水泵发送指令,打开开关抽水灭火。
硬件平台介绍:
MCU: STM32F103ZET6
物联网云平台: 华为IOT云平台
气体检测传感器: MQ2-烟雾传感器、MQ135-空气质量检测传感器
火焰检测: 采用火焰检测传感器
抽水机: 采用直流电机模拟水泵,打开开关抽水喷水灭火
上网网卡: 采用GSM模块SIM800C,使用的是物联网专用卡,包年只能上网这种。
与云端服务器的通信协议: 终端设备采用MQTT3.1.1协议与华为云服务器进行登录连接。
温湿度检测传感器: DHT11
供电方式: 电池+太阳能供电



为了演示联动控制,火警(烟雾)检测装置和灭火(直流电机)装置分为两个独立的设备,分别连接上云端。
火警检测装置连接上物联网服务器之后,可以在服务器上配置数据处理规则,如果烟雾浓度超标,可以自动向灭火装置发送指令,进行灭火操作。服务器收到火警检测装置上传的烟雾浓度、空气质量等数据后,可以向自己的私有服务器转发数据,方便自己服务器收到数据后做分析存储处理,比如: 向指定邮箱发送邮件、手机APP推送通知栏、向指定用户推送短消息提示等等。
2. 创建产品(火警预警装置)
打开官网链接: https://www.huaweicloud.com/s/JeeJqeiBlOe9kSU
(1)选择设备接入IotTDA选项。

(2)选择免费试用。

(3)在产品页面选择创建新的产品。

(4)填入产品信息,创建产品


(5)选择自己刚才创建的产品,创建数据模型,点击自定义模型


(6)选择添加属性
这个添加的属性就是设备端上报的数据类型。 比如: MQ2烟雾传感器检测的烟雾数据值类型。
在这个页面上还有一个添加命令的功能,这是用于云端下发指令给设备端使用的。当前这个设备是火警检测装置,只需要上报数据给服务器,不需要下发指令,这里就只需要添加属性就行了。


根据自己的设备的具体情况填写即可,如果上报的数据有多种类型就创建多个属性。

3. 创建产品(灭火装置)
创建的流程和上面一样,这是多增加了一个命令下发的功能,方便云端远程控制电机开启和关闭,实现灭火功能。
(1)创建产品

(2)产品创建完毕之后,添加服务器ID

(3)添加属性,电机属性是可以读可以写的,范围设置为0和1,只能开关

(4)添加命令,这个命令用于云端远程向设备下发指令,设备收到指令后可以做出相应的逻辑处理

接着选择新增输入参数:

最后点击确定即可。

现在产品已经创建完毕。

4. 创建设备(火警预警装置)
(1)在设备页面,选择注册设备,选择自己的对应的产品,设备标识码一般填自己设备的硬件标号。

(2)设备创建成功之后会弹出弹窗,点击保存并关闭,会自动弹出下载窗口,是个文本文件,存放了密匙信息

5. 创建设备(灭火装置)
流程与上面火警预警装置设备一样的。


6. 生成MQTT协议登录ID和密匙
设备创建完成接来下生成MQTT登录账号、密匙,方便设备登录云端平台。
官网工具地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

填入刚才创建设备时,保存下载文件里的信息,对着弹窗填入,最后生成了ID、用户名、password参数,用于MQTT协议登录使用。
(1)火警预警装置生成登录参数

(2)灭火装置

7. 上报属性格式与主题订阅格式
产品设备、MQTT登录参数都到位了,接下来需要了解设备向服务器上报数据时,如何上报,格式是怎么样的。
(1)第一个问题是:华为云IoT物联网服务器的IP和端口号是多少?
在总览选项页面,点击多协议接入选项,就能看到了。


如果选择MQTT协议接入:
(2)第二个问题是:发布数据的主题和订阅数据的主题怎么填?
在产品页面,选择自己的产品,进去之后就能看到主题的格式介绍页面了。

为了方便后续复制粘贴,这里总结下格式:
火警预警装置:
灭火装置:
(3)第三个问题是:上报属性时,数据格式是什么?
官方文档介绍: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html


总结下格式: 上报的数据就是JSON格式,一次性可以上传多个属性数据,JSON数组里按照顺序增加即可。
重要的字段含义解释:这两个字段后面的数据需要自己根据自己的设备产品去填充的。
火警预警装置上传的数据:

灭火装置上传的数据:

8. 使用MQTT客户端模拟设备测试
(1)登录火警预警装置


(2)灭火装置登录


可以看到,设备已经成功登录服务器,完成了数据上报。这也证明服务器端设备创建已经全部OK,正常。
9. 配置设备联动
(1)创建规则

(2)填写规则信息

(3)添加触发条件,选择需要处理数据的设备,设置条件:当烟雾浓度大于等于100就触发

(4)添加执行动作,当烟雾浓度超过100就下发指令给灭火装置


(3)最后点击创建规则,生效规则


(4)测试效果
使用两个MQTT客户端分别模拟火警预警装置和灭火装置,当烟雾浓度超过100时,查看灭火装置是否收到云端下发的指令。

10. 数据转发
如果数据需要转发到其他地方,可以自己创建规则配置。

11. 硬件设备测试
设备端采用GSM模块SIM800C完成上网功能,主控MCU采用STM32F103ZET6。
任意只要能上网的设备都可以使用当前代码连接服务器,因为当前模拟的是户外设备,只能采用GSM模块上网。
如果是智能家居,屋里小区的设备,有WIFI的可以采用ESP8266这些无线网卡。
代码校对较多,这里只贴出核心代码,需要完整工程的在评论区留言,留下邮箱即可。
1. SIM800C.c
这是SIM800C的配置代码
#include "sim800c.h"
也可以去这里下载工程: https:
u8 SIM800C_SendCmd(char *cmd,char *check_data)
{
u16 i,j;
for(i=0;i<5;i++)
{
USART2_RX_FLAG=0;
USART2_RX_CNT=0;
memset(USART2_RX_BUFF,0,sizeof(USART2_RX_BUFF));
USART_X_SendString(USART2,cmd);
for(j=0;j<500;j++)
{
if(USART2_RX_FLAG)
{
USART2_RX_BUFF[USART2_RX_CNT]='\0';
if(strstr((char*)USART2_RX_BUFF,check_data))
{
return 0;
}
else break;
}
delay_ms(20);
}
}
return 1;
}
u8 SIM800C_InitCheck(void)
{
if(SIM800C_SendCmd("AT\r\n","OK"))return 1;
else printf("SIM800模块正常!\r\n");
if(SIM800C_SendCmd("ATE0\r\n","OK"))return 2;
else printf("设置模块不回显成功!\r\n");
if(SIM800C_SendCmd("AT+CGMI\r\n","OK"))return 3;
else printf("查询制造商名称成功!%s\r\n",USART2_RX_BUFF);
if(SIM800C_SendCmd("AT+CGMM\r\n","OK"))return 4;
else printf("查询模块型号成功!%s\r\n",USART2_RX_BUFF);
DelayMs(1000);
DelayMs(1000);
if(SIM800C_SendCmd("AT+CNUM\r\n","+CNUM:"))return 5;
else printf("获取本机号码成功!%s\r\n",USART2_RX_BUFF);
return 0;
}
u8 SIM800C_SetNoteTextMode(void)
{
if(SIM800C_SendCmd("AT+CSCS=\"GSM\"\r\n","OK"))return 1;
else printf("短信GSM字符集设置成功!\r\n");
if(SIM800C_SendCmd("AT+CMGF=1\r\n","OK"))return 2;
else printf("短信文本模式设置成功!\r\n");
return 0;
}
u8 SIM800C_SendNote(u8 *num,u8 *text,u16 len)
{
char data[50];
char send_buf[2];
sprintf(data,"AT+CMGS=\"%s\"\r\n",num);
if(SIM800C_SendCmd(data,">"))return 1;
USART_X_SendData(USART2,text,len);
send_buf[0] = 0x1a;
send_buf[1] = '\0';
if(SIM800C_SendCmd(send_buf,"+CMGS"))return 2;
return 0;
}
void SIM800C_NtpUpdate(void)
{
SIM800C_SendCmd("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK");
SIM800C_SendCmd("AT+SAPBR=3,1,\"APN\",\"CMNET\"\r\n","OK");
SIM800C_SendCmd("AT+SAPBR=1,1\r\n","OK");
DelayMs(5);
SIM800C_SendCmd("AT+CNTPCID=1\r\n","OK");
SIM800C_SendCmd("AT+CNTP=\"202.120.2.101\",32\r\n","OK");
SIM800C_SendCmd("AT+CNTP\r\n","+CNTP: 1");
printf("同步网络时间:%s\r\n",USART2_RX_BUFF);
}
u8 SIM800C_GPRS_Init(void)
{
SIM800C_SendCmd("AT+CIPCLOSE=1\r\n","CLOSE OK");
SIM800C_SendCmd("AT+CIPSHUT\r\n","SHUT OK");
if(SIM800C_SendCmd("AT+CGCLASS=\"B\"\r\n","OK"))return 1;
if(SIM800C_SendCmd("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n","OK"))return 2;
if(SIM800C_SendCmd("AT+CGATT=1\r\n","OK"))return 3;
if(SIM800C_SendCmd("AT+CIPCSGP=1,\"CMNET\"\r\n","OK"))return 4;
if(SIM800C_SendCmd("AT+CIPHEAD=1\r\n","OK"))return 5;
return 0;
}
u8 SIM800C_Connect_TCP_Server(char *ipaddr,char *port)
{
char cmd_buff[100];
SIM800C_SendCmd("AT+CIPCLOSE=1\r\n","CLOSE OK");
SIM800C_SendCmd("AT+CIPSHUT\r\n","SHUT OK");
sprintf(cmd_buff,"AT+CIPSTART=\"TCP\",\"%s\",\"%s\"\r\n",ipaddr,port);
if(SIM800C_SendCmd(cmd_buff,"OK"))return 1;
return 0;
}
u8 SIIM800C_TCP_SendData(u8 *data,u32 len)
{
char send_buf[2];
if(SIM800C_SendCmd("AT+CIPSEND\r\n",">")==0)
{
USART_X_SendData(USART2,data,len);
DelayMs(50);
send_buf[0] = 0x1a;
send_buf[1] = '\0';
if(SIM800C_SendCmd(send_buf,"SEND OK"))return 2;
else return 0;
}
return 1;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
2. adc.c
这是烟雾传感器的ADC通道配置代码。
3. DHT11.c
这是温湿度检测代码。
如果需要整个工程源码的话,评论区留下邮箱即可。
17616522363@163.com
982728634@qq.com