猿创征文|基于STM32设计的物联网熏艾空气消毒装置(STM32+华为云IOT)

Posted DS小龙哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猿创征文|基于STM32设计的物联网熏艾空气消毒装置(STM32+华为云IOT)相关的知识,希望对你有一定的参考价值。

1. 前言

基于目前的艾熏市场,产品太过原始,几乎所有产品都存在艾草燃烧烟雾冲鼻刺鼻的现象。经过信息搜集和实地市场调研分析,发现艾草在市场中以理疗产品为主,艾熏防疫产品仅传统式艾条出售,但是使用不便,存在安全隐患等问题导致普通居住空间不便使用。所以现在普通家庭室内消毒方式以“84”消毒为主,使用体验感欠佳。结合艾草药用机理研发的熏艾式的空气消毒装置,让其挥发出经过净化的艾叶中药烟渗透肌肤,可以温通经络,行气活血,祛湿逐寒,温经止痛,平衡阴阳,促进血液循环,调整脏腑功能,促进机体新陈代谢,增强抵抗力 。结合艾熏通过挥发油抗菌、抗病毒作用的机制,考虑与其通过改变细菌细胞膜的通透性从而产生抑菌作用,以及参与阻止病毒的表面蛋白同细胞的表面受体相结合或是与影响病毒在细胞内的复制有关,具体机制仍有待明确。通过结合以上专家研究成果,把传统艾熏结合科技,研究更创新的点燃艾草及中药提取液或结合物(类似蚊香)的方式,以及更新艾草的燃烧形态来让艾熏方式更适宜现代居住空间。




2. 功能及需求概述

按照要求指导以及团队目标,要搞一个以熏艾式的空气消毒装置,就是把艾草燃烧或者用电芯直接加热艾草精油,使其挥发。

**实现目标:**加热芯加热艾草精油实现一个熏艾式的空气消毒装置。

**实现的整体思路:**主控MCU采用STM32,利用MQ2检测空气中的熏艾的浓度,当熏艾的浓度高于设定阀值时,就停止加热挥发,可以通过手机APP或者物理按键启动加热棒加热艾草精油,当气雾到达顶端阀门时,气雾会由顶端阀门处放置的风扇以及紫外线杀菌装置杀菌后吹出,通过DS18B20防水温度传感器检测加热温度,控制温度恒温。 通过ESP8266连接华为云物联网平台,上传当前加热棒加热的温度情况,当前空气的质量指数等信息,设计一个手机APP实现从物联网平台获取传感器数据进行显示,在手机APP上还可以控制熏艾的浓度的阀值。

功能细分总结:

(1)设备需要向华为云IO上传哪些数据?

环境温度(DHT11)、环境湿度(DHT11)、艾草精油温度(加热棒)、空气中艾草精油挥发的浓度(MQ2)、加热芯的工作状态

(2)手机APP需要向设备发送哪些数据?

艾草精油加热芯与挥发风扇的控制开关状态、熏艾浓度的最高阀值。

3. 硬件选型

3.1 DS18B20防水温度传感器

3.2 继电器

3.3 加热棒-5V电压

3.4 USB公头电源线

这个一段插充电宝,一段插继电器,继电器给加热芯供电,继电器的控制由STM32控制,STM32采集DS18B20温度,判断是否要继续加热。

3.5 杜邦线

3.6 ESP8266 WIFI

(1)模块采用串口(LVTTL)与MCU(或其他串口设备)通信,内置TCP/IP协议栈,能够实现串口与WIFI之间的转换
(2)模块支持LVTTL串口,兼容3.3V和5V单片机系统
(3)模块支持串口转WIFI STA、串口转AP和WIFI STA+WIFIAP的模式,从而快速构建串口-WIFI数据传输方案

3.7 MQ-135空气质量传感器

MQ135传感器对氨气、硫化物、苯系蒸汽的灵敏度高,对烟雾和其它有害的监测也很理想。这种传感器可检测多种有害气体,是一款适合多种应用的低成本传感器。

3.8 DHT11温湿度传感器

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有可靠性与卓越的长期稳定性,成本低、相对湿度和温度测量、快响应、抗干扰能力强、信号传输距离长、数字信号输出、精确校准。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。可用于暖通空调、除湿器、测试及检测设备、消费品、汽车、自动控制、数据记录器、气象站、家电、湿度调节器、医疗、其他相关湿度检测控制。

特点如下:

1、可以检测周围环境的湿度

2、可以检测周围环境的温度

3、湿度测量范围:20%-95%(0度-50度范围)湿度测量误差:±5%4、温度测量范围:o度-50度温度测量误差:±2度

4、工作电压3.3V-5V

5、输出形式数字输出

3.9 STM32系统板

主控CPU采用STM32F103RCT6,这颗芯片包括48 KB SRAM、256 KB Flash、2个基本定时器、4个通用定时器、2个高级定时器、51个通用IO口、5个串口、2个DMA控制器、3个SPI、2个I2C、1个USB、1个CAN、3个12位ADC、1个12位DAC、1个SDIO接口,芯片属于大容量类型,配置较高,整体符合硬件选型设计。当前选择的这款开发板自带了一个1.4寸的TFT-LCD彩屏,可以显示当前传感器数据以及一些运行状态信息。

3.10 洞洞板

3.11 艾草精油-加热消毒

3.12 风扇-5V电压

3.13 紫色LED灯

紫色LED灯模拟紫外灯,可以利用紫外线的照射,穿透微生物的细胞膜,破坏各种细菌、病毒等微生物的DNA结构,毁坏其核酸分子键,使细菌、病毒当即死亡或不能繁衍后代,从而杀菌消毒。

4. 创建华为云IOT云端产品

消毒装置需要实现云端管理,能够使用手机APP在任何地方随时查看设备状态,启动设备加热消毒。这里就采用华为云IOT物联网平台作为服务器,设备上传数据到服务器,手机通过服务器提供的API接口拉取设备上传的数据进行显示。下面就介绍如何在云端创建产品,设备,实现数据上传、指令下发等流程。

4.1 创建产品

官网地址: https://www.huaweicloud.com/?ticket=ST-2299857-JdPFxsBJCKH0HfVGUEQJNDDV-sso

(1)选择IoTDA

(2)点击免费试用

(3)创建产品

根据自己的产品类型,填写产品信息,完成创建。

(4)定义产品模型

定义产品模型:简单的说就是设置设备上传和下发的数据的类型。根据自己传感器的数据类型进行设置即可。

(5)添加属性

这里添加传感器上传的数据属性信息。

设备上传的数据分为环境温度、环境湿度、加热棒温度、艾草烟熏浓度等数据。这些数据是设备上传不需要修改,所以这里数据类型改为只读。

加热状态是可读可写,云端可以控制风扇、加热芯工作。

创建完成。

4.2 创建设备

上面产品一个大框架类别,产品下面接着要创建具体的设备。产品下可以创建N个设备,设备就是真实设备,可以有很多个设备连接到这个产品模型下进行统一管理。接下来就介绍创建设备的流程。

(1)注册设备

(2) 填写设备信息

注册成功,保存设备密匙。后面MQTT登录时需要这些参数来生成账号和密码。


    "device_id": "62381267575fb713ee164ad2_xl_1",
    "1111secret": "12345678"

4.3 生成MQTT登录信息

华为云提供的MQTT账户信息生成在线小工具:

https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com

接着填入信息,这个信息在上一步创建设备时生成的,还提示下载保存。


    "device_id": "62381267575fb713ee164ad2_xl_1",
    "1111secret": "12345678"

ClientId 62381267575fb713ee164ad2_xl_1_0_0_2022032106
Username 62381267575fb713ee164ad2_xl_1
Password 124344feff3e3d96ff6af13cf36af36766619ff1eeee40e99cbae9b7b9739fe4

4.4 MQTT订阅与发布的主题

设备与云平台数据交互采用的是MQTT协议,MQTT协议里主要搞懂两个概念就行:主题发布和主题订阅。

(1)云平台地址

端口: 1883
域名: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
IP地址: 121.36.42.100

(2)订阅主题格式

格式: $oc/devices/device_id/sys/messages/down
//订阅主题: 平台下发消息给设备
$oc/devices/62381267575fb713ee164ad2_xl_1/sys/messages/down

(3)发布主题格式

格式: $oc/devices/device_id/sys/properties/report
//设备上报主题请求
$oc/devices/62381267575fb713ee164ad2_xl_1/sys/properties/report
//上报的数据格式如下
"services": ["service_id": "STM32","properties":"DHT11-T":22,"DHT11-H":33,"T2":15,"MQ2":234,"motor":1]

4.5 虚拟设备模拟测试

上面的产品、设备已经创建完毕,下面采用软件虚拟一个设备登录云端服务器,测试数据上报是否OK。

登录成功之后,在网页端可以看到设备已经在线了。

并且可以看到上传的数据,已经正常的显示。

5. 开发上位机APP

为了方便远程查看设备信息,控制设备,可视化显示设备状态,还需要开发一款上位机APP与华为云IOT服务器进行对接,完成数据获取,指令下发等操作。

华为云物联网平台提供了应用端开发的API接口,可以通过对应的API完成数据交互。

5.1 应用侧开发接口

(1)查询设备影子数据

华为云IOT的应用侧接口里提供了查询设备影子数据的接口,也就是说可以获取设备上传的最新的一次数据。如果想要获取设备实时数据,可以采用查询属性接口,可以以同步形式发指令给设备,设备立即上传一次当前数据。

查询设备影子的接口,是不需要向设备测发送指令,它是查询设备最后一次上传到云端服务器的数据。

流程是:应用层调用这个API接口---->请求服务器----->返回给应用层调用处。

文档地址:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html

这个接口提供了在线调试功能,可以快速体验接口请求流程,返回的数据格式等等,非常的方便。

在线调试接口:https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IoTDA&api=ShowDeviceShadow

请求地址:

请求方式: GET
请求地址: 
https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/1bc2465ed2b6411dbf3ebad8d40c4b27/devices/62381267575fb713ee164ad2_xl_1/shadow

收到的数据格式:


 "device_id": "62381267575fb713ee164ad2_xl_1",
 "shadow": [
  
   "service_id": "STM32",
   "desired": 
    "properties": null,
    "event_time": null
   ,
   "reported": 
    "properties": 
     "DHT11-T": 22,
     "DHT11-H": 32,
     "T2": 15,
     "MQ2": 234,
     "motor": 1
    ,
    "event_time": "20220321T072441Z"
   ,
   "version": 1
  
 ]

(2)修改设备属性

设备的产品模型中定义了物联网平台可向设备下发的属性,应用服务器可调用此接口向指定设备下属性。平台负责将属性以同步方式发送给设备,并将设备执行属性结果同步返回。

文档地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0035.html

在线调试地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=UpdateProperties

请求URL: 
https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/611f253373344433821fb63448091eec/devices/62381267575fb713ee164ad2_xl_1/properties

请求体:

 "services": [
  
   "service_id": "STM32",
   "properties": 
    "motor": 1
   
  
 ]

设备响应格式:https://support.huaweicloud.com/api-iothub/iot_06_v5_3008.html

响应的主题格式:
$oc/devices/device_id/sys/properties/set/response/request_id=request_id

示例: 
$oc/devices/622ef2e8c4e6a958e356fe84_STM32/sys/properties/set/response/request_id=ad492c4f-7498-4243-b6ae-93089eda1945
 
响应的数据:
"result_code": 0,"result_desc": "success"

调试流程如下:

第一步:发起请求

第二步:设备测收到消息

第三步:设备测回应,网页端收到回应,完成。

5.2 创建IAM账户

创建一个IAM账户,方便接下来使用API接口访问华为云服务时,生成token登录密匙。

地址:https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users

(1)创建用户

(2)填充参数

(3)完成创建

User     Name	Access Key Id	Secret Access Key
ds_abc	IQJXEPFKUALTIBKYKJ0Q	xweOS1ohe9c5KQ2fqyYPhwmdv37WicxGOaybi1FC

5.3 开发上位机软件

(1)开发环境介绍

上位机软件采用Qt框架设计,Qt是一个跨平台的C++图形用户界面应用程序框架。Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。简单来说,QT可以很轻松的帮你做带界面的软件,甚至不需要你投入很大精力。

QT官网: https://www.qt.io/

(2)学习教程

QT入门实战专栏: https://blog.csdn.net/xiaolong1126626497/category_11400392.html

(3)实现效果

(4)核心代码

//获取影子设备数据
void Widget::on_pushButton_addr_clicked()

    //表示影子设备数据获取
    function_select=0;

    QString requestUrl;
    QNetworkRequest request;

    //设置请求地址
    QUrl url;

    //获取token请求地址
    requestUrl = QString("https://iotda.%1.myhuaweicloud.com/v5/iot/%2/devices/%3/shadow")
                 .arg(SERVER_ID)
            .arg(PROJECT_ID)
            .arg(Device_id);

    //自己创建的TCP服务器,测试用
    //requestUrl="http://10.0.0.6:8080";

    //设置数据提交格式
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));

    //设置token
    request.setRawHeader("X-Auth-Token",Token);

    //构造请求
    url.setUrl(requestUrl);

    request.setUrl(url);

    //发送请求
    manager->get(request);



//设置属性
void Widget::on_pushButton_ditu_clicked()

    //修改属性
    function_select=2;

    QString requestUrl;
    QNetworkRequest request;

    //设置请求地址
    QUrl url;

    //修改属性的地址
    requestUrl=QString("https://iotda.%1.myhuaweicloud.com/v5/iot/%2/devices/%3/properties")
            .arg(SERVER_ID)
            .arg(PROJECT_ID)
            .arg(Device_id);

    //设置数据提交格式
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));

    //设置token
    request.setRawHeader("X-Auth-Token",Token);

    //构造请求
    url.setUrl(requestUrl);

    request.setUrl(url);

    //打包请求参数赋值
    QString post_param=QString("\\"service_id\\":\\"STM32\\",\\"properties\\":\\"motor\\":1");
    //发送请求
    manager->put(request, post_param.toUtf8());

6. STM32设备开发

6.1 硬件连线

硬件连接方式:

1. ESP8266 WIFI接线
ATK-ESP8266串口WIFI模块与STM32的串口2相连接。
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)

2. TFT 1.44 寸彩屏接线
GND   电源地
VCC   接5V或3.3v电源
SCL   接PC8(SCL)
SDA   接PC9(SDA)
RST   接PC10
DC    接PB7
CS    接PB8
BL	  接PB11

3. DHT11 温湿度
VCC--VCC
GND---GND
DAT---PA5 

4. 加热棒-加速熏艾的挥发
VCC--->5V
DAT--->PB12 
GND--->GND

5. 帮助烟雾挥发的小风扇
VCC--->5V
DAT--->PB13  
GND--->GND

6. MQ2烟雾浓度检测传感器
VCC--->5V
GND--->GND
DAT--->PA1

7. DS18B20温度传感器-检测熏艾的温度
VCC--->3.3V
DAT--->PB15 
GND--->GND

8. 板载LED灯接线
LED1---PA8
LED2---PD2

9. 板载按键接线
K0---PA0 
K1---PC5 
K2---PA15

10. 紫色杀菌LED灯接线
VCC--->3.3V
DAT--->PB14 
GND--->GND


1. 支持APP上远程启动或者关闭消毒 (APP上点击的按钮可以切换状态)
2. 支持按键可以控制 关闭或者启动消毒

启动消毒后,散热风扇就开始自动转动。加热棒开始自动加热-根据温度自动启停。

6.2 工程布局

6.3 main.c 代码

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "esp8266.h"
#include "motor.h"
#include "oled.h"
#include "dht11.h"
#include "adc.h"
#include <string.h>
#include <stdlib.h>
#include "font.h"
#include "mqtt.h"
#include "ds18b20.h"



//华为物联网服务器的设备信息
#define MQTT_ClientID "62381267575fb713ee164ad2_xl_1_0_0_2022032106"
#define MQTT_UserName "62381267575fb713ee164ad2_xl_1"
#define MQTT_PassWord "124344feff3e3d96ff6af13cf36af36766619ff1eeee40e99cbae9b7b9739fe4"

//订阅与发布的主题
#define SET_TOPIC  "$oc/devices/62381267575fb713ee164ad2_xl_1/sys/messages/down"  //订阅
#define POST_TOPIC "$oc/devices/62381267575fb713ee164ad2_xl_1/sys/properties/report"  //发布

//设置连接的路由器信息
#define CONNECT_WIFI  "Xiaomi_meizi6"   //将要连接的路由器名称 --不要出现中文、空格等特殊字符
#define CONNECT_PASS "12170307yu"       //将要连接的路由器密码

#define CONNECT_SERVER_IP "a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com"   //服务器IP地址
#define CONNECT_SERVER_PORT 1883            //服务器端口号

//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;	   
#define JTAG_SWD_DISABLE   0X02
#define SWD_ENABLE         0X01
#define JTAG_SWD_ENABLE    0X00		  
void JTAG_Set(u8 mode)

	u32 temp;
	temp=mode;
	temp<<=25;
	RCC->APB2ENR|=1<<0;     //开启辅助时钟	   
	AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
	AFIO->MAPR|=temp;       //设置jtag模式



u8 temp;
u8 humidity;
u8 motor_flag=0; //熏艾的启动状态   0表示关闭  1表示启动
u16 MQ2_data=0; //MQ2烟雾传感器的值
u16 DS18B20_data=0; //加热芯的温度
u16 DS18B20_temp;
char request_id[100];
char mqtt_message[100];

//WIFI发送数据存储区域
char data_buff[300];

int main()

    u8 esp8266_state=0;
    u8 key;
    u8 i;
    u32 time_cnt=0;
    u32 timer_hour_cnt=0; //记录定时的时间
    JTAG_Set(JTAG_SWD_DISABLE); //释放PA15
    LED_Init();
    KEY_Init();
    USART1_Init(115200);
    Moto_Init();  //风扇、加热棒初始化
    USART2_Init(115200);//串口-WIFI
    TIMER2_Init(72,20000); //超时时间20ms
    DHT11_Init();		//初始化DHT11
    Lcd_Init(); //LCD初始化
    Lcd_Clear(0); //清屏为黑色
    LCD_LED_SET;//通过IO控制背光亮		
    AdcInit();  //ADC初始化--检测MQ2烟雾传感器的数据
    DS18B20_Init();  //DS18B20
    
    printf("DS18B20_Check:%d\\r\\n",DS18B20_Check());
    printf("正在初始化WIFI请稍等.\\r\\n");
    
    for(i=0;i<5;i++)
    
        if(ESP8266_Init()==0)
        
            esp8266_state=1;
            break;
        
        else
        
            esp8266_state=0;
            printf("ESP8266硬件检测错误.\\n");  
        
    
  
   if(esp8266_state)
   
       printf("准备连接服务器....\\r\\n");
        //非加密端口
        printf("WIFI:%d\\n",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1));
         
        //2. MQTT协议初始化	
        MQTT_Init(); 

        //3. 连接服务器  
        for(i=0;i<5;i++)
        
            if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0<

以上是关于猿创征文|基于STM32设计的物联网熏艾空气消毒装置(STM32+华为云IOT)的主要内容,如果未能解决你的问题,请参考以下文章

基于物联网设计的自反馈深紫外杀菌消毒系统(STM32F407)

基于物联网设计的自反馈深紫外杀菌消毒系统(STM32F407)

基于OneNet平台设计的多节点温度采集系统-有人云4G模块+STM32

基于STM32室内空气净化监测系统设计

动手实践丨手把手教你用STM32做一个智能鱼缸

基于OneNet平台设计的多节点温度采集系统-有人云4G模块+STM32