1. 功能介绍
自地球上出现森林以来,森林火灾平均每年发生20多万次。森林火灾不仅烧树,直接减少森林面积,而且严重破坏森林结构和森林环境,导致森林生态系统失衡、生物量、生产力、牲畜和鸟类,甚至牺牲一些重要的东西。高强度火灾会破坏土壤的化学和物理性质,减少水的积累和土壤的渗透性,增加部分林区的地下水位,导致沼泽;此外,焦土的干燥也会加速,导致杂草的过度生长。近年来,世界各地每年都会发生许多火灾。大多数国家的直接火灾损失超过了国民经济总量的0.2%。事实上,除了直接的经济死亡和财产损失外,火灾后还有重大的间接损失。因此,有必要发展和加强防火和火灾报警。
本文采用华为云iot快速搭建物联网平台森林火灾预警联动控制系统模型
,模拟演示检测森林火灾后,如何快速向云平台报告,向相关指定服务器发送数据报告,并自动向抽水泵发送指令,打开开关抽水灭火。
MCU: STM32F103ZET6
物联网云平台: 华为IOT云平台
气体检测传感器: MQ2-烟雾传感器,MQ135-空气质量检测传感器
火焰检测: 采用火焰检测传感器
抽水机: 水泵采用直流电机模拟,开关喷水灭火
上网网卡: 采用GSM模块SIM800C,使用物联网专用卡,包年只能上网。
与云服务器的通信协议: 采用终端设备MQTT3.1.1协议与华为云服务器登录连接。
温湿度检测传感器: DHT11
供电方式: 电池 太阳能供电
https://download.csdn.net/download/xiaolong1126626497/81993720
火警(烟雾)检测装置和灭火(直流电机)装置分为两种独立的设备,分别连接到云端。
火灾检测装置连接到物联网服务器后,可以在服务器上配置数据处理规则。如果烟雾浓度超标,可以自动向灭火装置发送指令进行灭火操作。服务器收到火灾报警检测装置上传的烟雾浓度、空气质量等数据后,可将数据转发给自己的私人服务器,方便自己的服务器在收到数据后进行分析和存储,如: 邮件发送到指定邮箱,手机APP推送通知栏,向指定用户推送短信提示等。
2. 创建产品(火警预警装置)
打开官网链接: https://www.huaweicloud.com/s/JeeJqeiBlOe9kSU
(1)选择设备接入IotTDA选项。
(2)选择免费试用。
(3)在产品页面选择创建新的产品。
(4)填写产品信息,创建产品
(5)选择刚创建的产品,创建数据模型,点击自定义模型
(6)选择添加属性
该添加属性是设备端报告的数据类型。 比如: MQ烟雾传感器检测的烟雾数据值类型。
此页面上还有一个添加命令的功能,用于云向设备端发送指令。目前,该设备是一个火灾报警检测装置,只需向服务器报告数据,不需要发送指令,这里只需要添加属性。
根据自己设备的具体情况填写。如果报告的数据有多种类型,则创建多个属性。
3. 创建产品(灭火装置)
创建的过程与上述相同,增加了命令下发的功能,方便云远程控制电机开关,实现灭火功能。
(1)创建产品
(2)产品创建完毕之后,添加服务器ID
(3)添加属性,可读写电机属性,范围设置为0和1,只能开关
(4)添加命令,用于云远程向设备发出指令,设备收到指令后可进行相应的逻辑处理
然后选择新的输入参数:
最后点击确定。
现在产品已经创建好了。
4. 创建设备(火警预警装置)
(1)在设备页面上,选择注册设备,选择相应的产品,设备标识码一般填写设备的硬件标识。
(2)设备成功创建后,弹出窗口会弹出,点击保存关闭,下载窗口会自动弹出。这是一个存储密钥信息的文本文件
{
"device_id": "61bacdc02b2aa20288c5a094_QQ1126626497", "secret": "1126626497" }
5. 创建设备(灭火装置)
该过程与上述火灾报警装置相同。
{
"device_id": "61bad0564d9b020287193be2_QQ1126626497", "secret": "1126626497" }
6. 生成MQTT协议登录ID和密匙
设备创建完成接下来的生成MQTT登录帐号、密钥,方便设备登录云平台。
官网工具地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
刚创建设备时,保存下载文件中的信息,填写弹出窗口,最后生成ID、用户名、密码参数MQTT协议登录使用。
(1)生成火警预警装置登录参数
ClientId 61bacdc02b2aa20288c5a094_QQ1126626497_0_0_2021121605 Username 61bacdc02b2aa20288c5a094_QQ1126626497 Password 43ed43bcbddc48772694fc2b18ec1112170f4d6cc52fbf1e01401c2ea1748475
(2)灭火装置
ClientId 61bad0564d9b020287193be2_QQ1126626497_0_0_2021121605 Username 61bad0564d9b020287193be2_QQ1126626497 Password 43ed43bcbddc48772694fc2b18ec1112170f4d6cc52fbf1e01401c2ea1748475
7. 报告属性格式和主题订阅格式
产品设备、MQTT登录参数到位。接下来,当设备向服务器报告数据时,需要知道如何报告,格式是什么。
在总览选项页面,点击多协议接入选项,就能看到了。
如果选择MQTT协议接入:
域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
如果你的设备不能解析域名,也可以直接填IP地址 121.36.42.100
端口号: 1883
在产品页面,选择自己的产品,进去之后就能看到主题的格式介绍页面了。
为了方便后续复制粘贴,这里总结下格式:
格式: $oc/devices/{
device_id}/sys/messages/down
//订阅主题: 平台下发消息给设备
$oc/devices/61bacdc02b2aa20288c5a094_QQ1126626497/sys/messages/down
格式: $oc/devices/{
device_id}/sys/properties/report
//设备上报数据
$oc/devices/61bacdc02b2aa20288c5a094_QQ1126626497/sys/properties/report
格式: $oc/devices/{
device_id}/sys/messages/down
//订阅主题: 平台下发消息给设备
$oc/devices/61bad0564d9b020287193be2_QQ1126626497/sys/messages/down
格式: $oc/devices/{
device_id}/sys/properties/report
//设备上报数据
$oc/devices/61bad0564d9b020287193be2_QQ1126626497/sys/properties/report
官方文档介绍: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html
上报的数据就是JSON格式,一次性可以上传多个属性数据,JSON数组里按照顺序增加即可。
重要的字段含义解释:这两个字段后面的数据需要自己根据自己的设备产品去填充的。
service_id 示设备服务的ID。
properties 是设备服务的属性列表,具体字段在设备关联的产品模型中定义。
{
"services": [{
"service_id": "MQ2","properties":{
"MQ2":100}}]}
{
"services": [{
"service_id": "motor","properties":{
"motor":1}}]}
8. 使用MQTT客户端模拟设备测试
(1)登录火警预警装置
(2)灭火装置登录
可以看到,设备已经成功登录服务器,完成了数据上报。这也证明服务器端设备创建已经全部OK,正常。
9. 配置设备联动
使用两个MQTT客户端分别模拟火警预警装置和灭火装置,当烟雾浓度超过100时,查看灭火装置是否收到云端下发的指令。
10. 数据转发
如果数据需要转发到其他地方,可以自己创建规则配置。
11. 硬件设备测试
设备端采用GSM模块SIM800C完成上网功能,主控MCU采用STM32F103ZET6。
任意只要能上网的设备都可以使用当前代码连接服务器,因为当前模拟的是户外设备,只能采用GSM模块上网。
如果是智能家居,屋里小区的设备,有WIFI的可以采用ESP8266这些无线网卡。
代码校对较多,这里只贴出核心代码,需要完整工程的在评论区留言。
1. SIM800C.c
这是SIM800C的配置代码
#include "sim800c.h"
/* 函数功能:向SIM800C模块发送指令 函数参数: char *cmd 发送的命令 char *check_data 检测返回的数据 返回值: 0表示成功 1表示失败 */
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++) //等待的时间(ms单位)
{
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;
}
/* 函数 功能:GSM模块初始化检测 函数返回值:1表示模块检测失败,0表示成功 */
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);
/* 返回格式如下: +CNUM: "","+8613086989413",145,7,4 OK */
return 0;
}
/* 函数 功能:GSM模块短信模式设置 函数返回值:0表示模块设置成功 */
u8 SIM800C_SetNoteTextMode(void)
{
if(SIM800C_SendCmd("AT+CSCS=\"GSM\"\r\n","OK"))return 1;// "GSM"字符集
else printf("短信GSM字符集设置成功!\r\n");
if(SIM800C_SendCmd("AT+CMGF=1\r\n","OK"))return 2; //文本模式
else printf("短信文本模式设置成功!\r\n");
return 0;
}
/* 函数功能:发送短信 函数参数: num:电话号码 text:短信内容 函数返回值: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;
}
/* 函数功能:NTP网络同步时间 */
void SIM800C_NtpUpdate(void)
{
SIM800C_SendCmd("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK");//配置承载场景1
SIM800C_SendCmd("AT+SAPBR=3,1,\"APN\",\"CMNET\"\r\n","OK");
SIM800C_SendCmd("AT+SAPBR=1,1\r\n","OK"); //激活一个GPRS上下文
DelayMs(5);
SIM800C_SendCmd("AT+CNTPCID=1\r\n","OK"); //设置CNTP使用的CID
SIM800C_SendCmd("AT+CNTP=\"202.120.2.101\",32\r\n","OK"); //设置NTP服务器和本地时区(32时区 时间最准确)
SIM800C_SendCmd("AT+CNTP\r\n","+CNTP: 1"); //同步网络时间
printf("同步网络时间:%s\r\n",USART2_RX_BUFF);
}
/* 函数功能:GPRS数据通信初始化 返 回 值: 0表示成功 */
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; //设置GPRS移动台类别为B,支持包交换和数据交换
if(SIM800C_SendCmd("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n","OK"))return 2;//设置PDP上下文,互联网接协议,接入点等信息
if(SIM800C_SendCmd("AT+CGATT=1\r\n","OK"))return 3; //附着GPRS业务
if(SIM800C_SendCmd("AT+CIPCSGP=1,\"CMNET\"\r\n","OK"))return 4; //设置为GPRS连接模式
if(SIM800C_SendCmd("AT+CIPHEAD=1\r\n","OK"))return 5; //设置接收数据显示IP头(方便判断数据来源)
return 0;
}
/* 函数功能: 连接TCP服务器 函数参数: ipaddr:ip地址 port:端口 返 回 值: 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;
}
/* 函数功能: TCP客户端模式下发送数据 返 回 值: 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;
}
2. adc.c
这是烟雾传感器的ADC通道配置代码。
// // 功能描述 : 智能环境检测系统 // 时间 : 20190605 // 版本 : v3.3 // 版权所有,盗版必究。 //Copyright(C) DS小龙哥 2016 - 2020 /// #include "adc.h" /* 函数功能: ADC1的初始化 规则通道方式 */ void ADC1_Init(void) { /*1. 配置ADC采集输入的IO口*/ RCC->APB2ENR |= 1 << 3;//PB GPIOB->CRL &= 0xFFFFFFF0; GPIOB->CRL |= 0x00000000;//配置PB0为模拟输入模式 /*2.配置ADC1时钟*/ RCC->APB2ENR|=1<<9; //开启ADC1时钟 RCC->APB2RSTR|=1<<9; //开启复位时钟 RCC->APB2RSTR&=~(1<<9); //关闭复位时钟 /*3. 配置ADC的预分频器*/ RCC->CFGR&=~(0x3<<14); //清空预分频 RCC->CFGR|=0x2<<14; //12MHZ /*4. 配置ADC CR1基本寄存器*/ ADC1->CR1&=~(0xF<<16); //0000:独立模式 ADC1->CR2|=1<<23; //1:启用
温度传感器和VREFINT。 //ADC1->CR2|=1<<22; //1:开始转换规则通道。 ADC1->CR2|=1<<20; //1:使用外部事件启动转换 ADC1->CR2|=0x7<<17; //111: SWSTART ADC1->CR2&=~(1<<11); //0:右对齐; ADC1->CR2&=~(1<<1); //0:单次转换模式; /*5. 配置ADC规则序列寄存器*/ ADC1->SQR1&=~(0xF<<20); //0000: 1个转换 ADC1->SMPR2|=0x7<<3; //配置通道1 111: 239.5周期 ADC1->SMPR1|=0x7<<18; //配置通道16 111: 239.5周期 ADC1->CR2|=1<<0; //1:开启ADC并启动转换。 ADC1->CR2|=1<<3; //1:初始化校准寄存器。 ADC1->CR2|=1<<2; //1:开始校准 while(ADC1->CR2&1<<2){ } //等待校准结束 } /* 函数功能: 获取指定通道的ADC值 函数参数: u8 ch 通道号 */ u16 ADC1_GetCHx(u8 ch) { ADC1->SQR3&=0xFFFFFFE0; //00000 ADC1->SQR3|=ch<<0; //规则序列中的第1个转换 ADC1->CR2|=1<<22; //1:开始转换规则通道。 while(!(ADC1->SR&1<<1)){ } //等待转换完成 return ADC1->DR; //返回接收到的数据值 }
3. DHT11.c
这是温湿度检测代码。
// // 功能描述 : 智能环境检测系统 // 时间 : 20190605 // 版本 : v3.3 // 版权所有,盗版必究。 //Copyright(C) DS小龙哥 2016 - 2020 /// #include "dht11.h" #include "delay.h" /* 复位DHT1 */ void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //拉低DQ delay_ms(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(30); //主机拉高20~40us } /* 等待DHT11的回应 返回1:未检测到DHT11的存在 返回0:存在 */ u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN();//SET INPUT while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; else retry=0; while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; return 0; } /* 从DHT11读取一个位 返回值:1/0 */ u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry<100)//等待变为低电平 { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_IN&&retry<100)//等待变高电平 { retry++; delay_us(1); } delay_us(40);//等待40us if(DHT11_DQ_IN)return 1; else return 0; } /* 从DHT11读取一个字节 返回值:读到的数据 */ u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for(i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit() 标签:
湿度传感器等评论列表无线空气温湿度变送器2b560气体传感器