1, 前言
本文将给大家介绍一个项目,基于STM32空气质量监测系统,希望大家有所收获,拉到文末可以领取资料哈~
2, 器件准备
- STM32F103C8T6单片机
- 使用DHT11模块检测温湿度
- 使用MQ-7传感器检测一氧化碳浓度
- 使用BH1750传感器检测光照强度
- 使用GP2Y1014AU传感器检测PM2.5浓度
- OLED显示温度,湿度,一氧化碳浓度,光照强度等数据
- 一氧化碳浓度、PM2.5浓度超标时蜂鸣器报警,同时打开风扇通风
- ESP8266模块实现 WIFI通讯数据传输,wifi通讯需借助一个有网络wifi热点
- 有APP可实时查看传感器数据,控制风扇,蜂鸣器和LED
下面是APP的截图,有显示界面,也可以远程控制风扇,蜂鸣器和LED。数据是通过onenet平台对数据进行收集的,而界面也是可以动态根据需求进行修改的。
3, 原理图
原理图使用立创EDA平台进行制作的,这个平台很适合新手入门。而且每月还有免费打板次数,简直不要太爽!
4, 示例代码
由于代码内容过多,给大家展示部分代码。
1.main文件
#include "led.h"
#include "delay.h"
#include "LCD1602.h"
#include "stmflash.h"
#include "adc.h"
#include "OLED_I2C.h"
#include "usart.h"
#include "timer.h"
#include "MHZ14.h"
#include "dht11.h"
#include "PM2.h"
#include "MQ.h"
#include "bh1750.h"
//网络设备
#include "net_device.h"
//协议文件
#include "onenet.h"
#include "fault.h"
//C库
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
u16 MQ2,PM25,light,CO; //烟雾浓度
//extern unsigned short CO2; //二氧化碳浓度
u8 mode = 0; //模式:0自动模式 根据环境控制风扇 1:手动控制风扇
u8 temp,humi,water;
//数据流
DATA_STREAM dataStream[] = {
{"Mode", &mode,TYPE_UCHAR, 1},
{"LED1", &gpioStatus.Led1Sta, TYPE_BOOL, 1},
{"Beep", &gpioStatus.BeepSta, TYPE_BOOL, 1},
{"JD0", &gpioStatus.Jd0Sta, TYPE_BOOL, 1},
// {"CO2", &CO2,TYPE_USHORT, 1},
{"CO", &CO,TYPE_USHORT, 1},
{"MQ2", &MQ2,TYPE_UCHAR, 1},
// {"water", &water,TYPE_UCHAR, 1},
{"light", &light,TYPE_UCHAR, 1},
{"PM25", &PM25,TYPE_UCHAR, 1},
{"temp", &temp,TYPE_UCHAR, 1},
{"humi", &humi,TYPE_UCHAR, 1},
{"errType", &faultTypeReport, TYPE_UCHAR, 1},
};
unsigned char dataStreamLen = sizeof(dataStream) / sizeof(dataStream[0]);
int main(void)
{
u16 adcx;
char buf[20];
unsigned char *dataPtr;
unsigned int runTime = 0;
_Bool sendFlag = 0;
unsigned int Num = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
LED_Init(); //初始化与控制设备连接的硬件接口
uart_init(115200); //串口初始化为9600
DHT11_Init();
BH1750_Init(); //鍒濆鍖朾h1750;
printf( "开始\r\n");
I2C_Configuration();
OLED_Init();
OLED_Fill(0x00);
// OLED_ShowCN(0,2,4); //烟雾
// OLED_ShowCN(16,2,5);
// OLED_ShowStr(32,2,":--%",2);
OLED_ShowCN(0,0,17); //温度
OLED_ShowCN(16,0,19);
OLED_ShowStr(32,0,":--C",2);
OLED_ShowCN(64,0,18); //湿度
OLED_ShowCN(80,0,19);
OLED_ShowStr(96,0,":--%",2);
OLED_ShowCN(0,2,9); //光照强度
OLED_ShowCN(16,2,21);
OLED_ShowCN(32,2,22);
OLED_ShowCN(48,2,19);
OLED_ShowStr(64,2,":--Lux",2);
OLED_ShowCN(0,4,20); //一氧化碳
OLED_ShowCN(16,4,1);
OLED_ShowCN(32,4,2);
OLED_ShowCN(48,4,3);
OLED_ShowStr(64,4,":--ppm",2);
// OLED_ShowStr(0,4,"Water",2);
// OLED_ShowStr(40,4,":--mm",2);
OLED_ShowStr(0,6,"PM2.5",2);
OLED_ShowStr(40,6,":--ug/m^3",2);
2. onenet模块
//单片机头文件
#include "stm32f10x.h"
//网络设备
#include "net_device.h"
//协议文件
#include "onenet.h"
#include "fault.h"
//硬件驱动
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "OLED_I2C.h"
#include "timer.h"
//图片数据文件
//#include "image_2k.h"
//C库
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
EdpPacket *send_pkg; //协议包
ONETNET_INFO oneNetInfo = {"1083535530", "vJgsIms24zojT1Y0ylvhfz=nyUg=", 0, 0, 0, 0};
extern DATA_STREAM dataStream[];
/*
************************************************************
* 函数名称: OneNet_DevLink
*
* 函数功能: 与onenet创建连接
*
* 入口参数: devid:创建设备的devid
* auth_key:创建设备的masterKey或apiKey
*
* 返回参数: 无
*
* 说明: 与onenet平台建立连接,成功或会标记oneNetInfo.netWork网络状态标志
************************************************************
*/
void OneNet_DevLink(const char* devid, const char* auth_key)
{
unsigned char *dataPtr;
printf( "OneNet_DevLink\r\n"
"DEVID: %s, APIKEY: %s\r\n"
, devid, auth_key);
#if 1
send_pkg = PacketConnect1(devid, auth_key); //根据devid 和 apikey封装协议包
#else
send_pkg = PacketConnect2(devid, auth_key); //根据产品id 和 鉴权信息封装协议包
#endif
NET_DEVICE_SendData(send_pkg->_data, send_pkg->_write_pos); //上传平台
dataPtr = NET_DEVICE_GetIPD(250); //等待平台响应
if(dataPtr != NULL)
{
oneNetInfo.netWork = OneNet_EDPKitCmd(dataPtr); //解析数据
}
DeleteBuffer(&send_pkg); //删包
if(oneNetInfo.netWork) //如果接入成功
{
printf( "Tips: NetWork OK\r\n");
oneNetInfo.errCount = 0;
NET_DEVICE_Set_DataMode(DEVICE_DATA_MODE); //设置为数据收发模式
}
else
{
printf( "Tips: NetWork Fail\r\n");
if(++oneNetInfo.errCount >= 5) //如果超过设定次数后,还未接入平台
{
oneNetInfo.netWork = 0;
faultType = faultTypeReport = FAULT_NODEVICE; //标记为硬件错误
}
}
}
5, 应用场景
这个基于STM32的空气质量检测系统的应用场景相当广泛,尤其是在对室内空气质量要求较高的场所,具体可能包括:
- 智能家居环境:在家庭环境中,它可以作为智能家居系统的一部分,实时监测家中的空气质量,并根据一氧化碳浓度、PM2.5浓度等指标自动调整空气净化器、新风系统或智能窗户等设备的工作状态,从而确保家庭成员呼吸到健康、清新的空气。
- 办公室和会议室:在封闭的办公环境中,空气质量同样重要。该系统可以实时检测空气质量,并在超标时自动开启通风设备,避免员工因空气质量不佳而感到不适,提高工作效率。
- 学校和教育机构:在教室、图书馆等场所,学生的健康和学习效率都与空气质量息息相关。安装该系统可以确保学生在一个舒适、安全的环境中学习和生活。
- 博物馆和艺术品展馆:在这些对空气质量要求较高的场所,该系统可以实时监测并控制空气质量,避免空气中的污染物对文物和艺术品造成损害。
- 工业车间和仓库:在一些可能存在有毒有害气体或粉尘的工业车间和仓库中,该系统可以作为安全监测系统的一部分,及时发现并处理危险情况,确保工人的安全和生产的顺利进行。
- 公共场所:如商场、医院、酒店等公共场所,人流量大,空气质量容易受到影响。安装该系统可以实时监测并改善空气质量,提高顾客的舒适度和满意度。
=======================================
6,资料领取
资料可以点击链接进行获取:免费领取单片机资料