基于STM32的车间安全智能监测系统设计
摘要
本文旨在设计并实现一个基于STM32C8T6单片机的车间安全智能监测系统。该系统集成了DHT11温湿度传感器、SPG30二氧化碳传感器模块、ESP8266 WiFi模块、OLED显示屏、按键控制、蜂鸣器以及风扇模块。通过STM32C8T6单片机的数据处理能力和丰富的外设接口,实现了车间内温湿度和二氧化碳浓度的实时监测,并能根据监测数据自动或手动控制风扇的启动,以确保车间的环境安全。同时,用户还可以通过手机APP远程查看实时数据和控制风扇。
关键词
STM32C8T6;智能监测;DHT11;SPG30;ESP8266;OLED
第一章 引言
随着现代工业的发展,车间环境的安全监测变得越来越重要。温湿度和二氧化碳浓度是影响车间环境舒适度和工作效率的关键因素。传统的人工监测方式不仅耗时耗力,而且容易出现误差。因此,开发一种能够实时监测车间环境参数并根据参数变化自动控制的智能监测系统具有重要意义。
本系统以STM32C8T6单片机为核心,结合DHT11温湿度传感器、SPG30二氧化碳传感器模块、ESP8266 WiFi模块等外围设备,设计了一套完整的车间安全智能监测系统。该系统具有实时监测、自动控制和远程监控等功能,大大提高了车间环境管理的效率和准确性。
第二章 系统总体设计
2.1 系统架构设计
本系统主要包括传感器模块、数据处理模块、执行器模块和用户界面模块。其中,传感器模块负责采集环境数据,包括温湿度和二氧化碳浓度;数据处理模块对采集到的数据进行处理和分析;执行器模块实现相应的安全控制操作,如风扇的启动和停止;用户界面模块提供用户与系统进行交互的界面,包括OLED显示屏和按键控制。
2.2 传感器和执行器选择
2.2.1 传感器选择
- DHT11温湿度传感器:DHT11是一种数字温湿度传感器,包含一个电阻式感湿元件和一个NTC测温元件,通过单总线与单片机通信,具有测量准确、响应迅速、性价比高等优点。
- SPG30二氧化碳传感器模块:SPG30能够检测环境中的二氧化碳浓度和甲醛浓度,采用IIC协议与单片机通信,适用于环境检测和智能家居设计。
2.2.2 执行器选择
- 风扇模块:用于根据环境参数的变化自动调节车间内的空气流通,以达到降温和通风的效果。
- 蜂鸣器:用于在环境参数异常时发出报警声音,提醒用户及时处理。
2.3 接口设计
传感器和执行器的接口设计要考虑到与STM32C8T6单片机的连接方式。常见的接口有GPIO、SPI、I2C等。DHT11传感器通过单总线与单片机连接,SPG30传感器通过IIC协议与单片机通信,风扇模块和蜂鸣器通过GPIO接口控制。
第三章 系统硬件设计
3.1 主控芯片选择
本系统选用STM32C8T6单片机作为主控芯片。STM32C8T6是STM32F103系列的一款高性能单片机,具有丰富的外设接口和强大的数据处理能力,能够满足本系统对数据采集、处理和控制的需求。
3.2 传感器模块设计
3.2.1 DHT11温湿度传感器模块
DHT11温湿度传感器模块包含一个DHT11传感器和一个单总线接口电路。DHT11传感器通过单总线与单片机连接,单片机通过发送指令和读取数据来实现对温湿度信息的采集。
3.2.2 SPG30二氧化碳传感器模块
SPG30二氧化碳传感器模块包含一个SPG30传感器和一个IIC接口电路。SPG30传感器通过IIC协议与单片机通信,单片机通过发送读写指令来实现对二氧化碳浓度的采集。
3.3 执行器模块设计
3.3.1 风扇模块
风扇模块包含一个风扇和一个风扇驱动电路。风扇驱动电路通过GPIO接口与单片机连接,单片机通过控制GPIO口的高低电平来实现对风扇的启动和停止控制。
3.3.2 蜂鸣器
蜂鸣器通过GPIO接口与单片机连接,单片机通过控制GPIO口的高低电平来实现对蜂鸣器的控制。当环境参数异常时,单片机输出高电平信号驱动蜂鸣器发出报警声音。
3.4 用户界面模块设计
3.4.1 OLED显示屏
OLED显示屏通过SPI或I2C接口与单片机连接,单片机通过发送显示指令和数据来实现对OLED显示屏的控制。OLED显示屏用于实时显示温湿度和二氧化碳浓度等信息。
3.4.2 按键控制
按键控制模块包含若干按键和一个按键扫描电路。按键扫描电路通过GPIO接口与单片机连接,单片机通过扫描按键的状态来实现对按键的控制。按键用于切换系统的自动和手动模式。
3.5 网络通信模块设计
网络通信模块采用ESP8266 WiFi模块,通过UART接口与单片机连接。ESP8266 WiFi模块支持TCP/IP协议,单片机通过发送AT指令来实现对ESP8266 WiFi模块的控制,从而实现数据的远程传输和远程控制。
第四章 系统软件设计
4.1 软件开发环境
本系统采用Keil uVision作为软件开发环境,Keil uVision是一款功能强大的集成开发环境,支持STM32系列单片机的编程和调试。
4.2 传感器数据采集与处理
4.2.1 DHT11温湿度数据采集
DHT11温湿度数据采集的流程图如图4-1所示。单片机首先发送启动信号给DHT11传感器,然后等待DHT11传感器响应并发送数据。单片机接收到数据后,进行校验和解析,最终得到温湿度值。
图4-1 DHT11温湿度数据采集流程图
(此处插入DHT11温湿度数据采集流程图)
4.2.2 SPG30二氧化碳数据采集
SPG30二氧化碳数据采集的流程图如图4-2所示。单片机首先发送读写指令给SPG30传感器,然后等待SPG30传感器响应并发送数据。单片机接收到数据后,进行校验和解析,最终得到二氧化碳浓度值。
图4-2 SPG30二氧化碳数据采集流程图
(此处插入SPG30二氧化碳数据采集流程图)
4.3 控制算法设计
4.3.1 自动模式控制算法
在自动模式下,系统根据采集到的温湿度和二氧化碳浓度值进行判断,当二氧化碳浓度过高(超过设定阈值)或者温度过高(超过设定阈值)时,单片机控制风扇启动,以降低二氧化碳浓度和温度。同时,单片机通过OLED显示屏实时显示当前的温湿度和二氧化碳浓度值。
4.3.2 手动模式控制算法
在手动模式下,用户可以通过按键控制风扇的启动和停止。当用户按下启动按键时,单片机控制风扇启动;当用户按下停止按键时,单片机控制风扇停止。同时,单片机通过OLED显示屏实时显示当前的温湿度和二氧化碳浓度值。
4.4 用户界面设计
用户界面设计包括OLED显示屏的显示界面设计和按键控制设计。OLED显示屏的显示界面设计如图4-3所示,包括温湿度和二氧化碳浓度的实时显示,以及当前系统模式的显示(自动模式或手动模式)。按键控制设计包括启动按键、停止按键和模式切换按键。
图4-3 OLED显示屏显示界面设计
(此处插入OLED显示屏显示界面设计图)
4.5 网络通信设计
网络通信设计包括ESP8266 WiFi模块的初始化和数据远程传输设计。ESP8266 WiFi模块的初始化流程图如图4-4所示,包括设置WiFi模块的工作模式、连接WiFi网络、设置服务器的IP地址和端口号等步骤。数据远程传输设计包括单片机通过ESP8266 WiFi模块发送数据到服务器,以及服务器接收数据并存储到数据库中。
图4-4 ESP8266 WiFi模块初始化流程图
(此处插入ESP8266 WiFi模块初始化流程图)
4.6 手机APP设计
手机APP设计包括用户界面设计和网络通信设计。用户界面设计包括实时数据显示界面和控制界面,实时数据显示界面用于显示当前的温湿度和二氧化碳浓度值,控制界面用于远程控制风扇的启动和停止。网络通信设计包括手机APP与服务器之间的数据通信协议和数据传输方式。
第五章 系统测试与优化
5.1 系统测试
系统测试包括单元测试和综合测试。单元测试主要针对各个模块的功能进行测试,包括传感器数据采集测试、控制算法测试、用户界面测试和网络通信测试等。综合测试主要针对整个系统的功能进行测试,包括自动模式和手动模式的切换测试、远程监控和控制测试等。
5.2 优化建议
在系统测试过程中,发现了一些问题和不足之处,针对这些问题,提出以下优化建议:
- 传感器校准:定期对传感器进行校准,以确保数据采集的准确性。
- 数据滤波:对采集到的数据进行滤波处理,以减少噪声干扰。
- 电源管理:优化电源管理,降低系统功耗。
- 用户界面优化:优化OLED显示屏的显示界面和按键控制,提高用户体验。
- 网络通信优化:优化网络通信协议和数据传输方式,提高数据传输的稳定性和实时性
性和实时性。
第六章 系统应用与展望
6.1 系统应用
本系统可广泛应用于各类车间、仓库、实验室等需要监测环境参数的场所。通过实时监测温湿度和二氧化碳浓度,并自动或手动控制风扇的启动,可以有效改善室内环境,提高工作效率和舒适度。同时,通过手机APP远程查看和控制,使得用户能够随时随地了解环境状况,及时进行干预和调整。
6.2 展望
随着物联网技术的不断发展,未来可以将本系统进一步扩展为基于物联网的车间环境智能监测系统。通过增加更多的传感器和执行器,如光照传感器、PM2.5传感器、空调控制器等,实现更加全面的环境监测和控制。同时,可以利用云计算和大数据技术,对采集到的环境数据进行深度挖掘和分析,为用户提供更加精准的环境管理建议和预警服务。
此外,还可以将本系统与其他智能设备进行联动,如智能照明系统、智能安防系统等,实现车间的智能化管理和控制。通过构建完整的物联网生态系统,将车间环境监测与生产管理、能耗管理等相结合,为企业提供更加全面、高效的智能化解决方案。
第七章 结论
本文设计并实现了一种基于STM32C8T6单片机的车间安全智能监测系统。该系统集成了DHT11温湿度传感器、SPG30二氧化碳传感器模块、ESP8266 WiFi模块、OLED显示屏、按键控制、蜂鸣器和风扇模块等外围设备,实现了对车间环境参数的实时监测和自动控制。同时,用户还可以通过手机APP远程查看和控制系统。
通过系统测试和优化,验证了本系统的可靠性和实用性。本系统不仅提高了车间环境管理的效率和准确性,还为用户提供了更加便捷、智能的监测和控制方式。未来,随着物联网技术的不断发展,本系统还有很大的扩展和升级空间,将为企业的智能化管理和生产提供更加全面、高效的解决方案。
参考文献
(此处列出相关的学术文献、技术文档、标准规范等,具体参考文献根据实际研究背景和成果进行选择和引用)
- STM32C8T6单片机数据手册
- DHT11温湿度传感器数据手册
- SPG30二氧化碳传感器数据手册
- ESP8266 WiFi模块数据手册
- Keil uVision集成开发环境使用手册
- 物联网技术及应用相关文献
附录
附录A:电路图
(此处插入系统的电路图,包括传感器模块、执行器模块、用户界面模块和网络通信模块的电路连接图)
附录B:程序代码
(此处列出系统的部分程序代码,包括传感器数据采集、控制算法实现、用户界面设计和网络通信等关键部分的代码)
致谢
感谢导师的悉心指导和支持,感谢团队成员的共同努力和协作,感谢相关企业和机构提供的实验设备和技术支持。同时,也感谢所有在研究和开发过程中给予帮助和支持的人员。
/**
******************************************************************************
* @file algorithm.c
* @author 张东
* @version V1.0.0
* @date 2019-12-28
* @brief 基础计算算法
******************************************************************************
*/
/*--Include-start-------------------------------------------------------------*/
#include "algorithm.h"
#include "stm32f10x.h"
/*base value define-----------------------------------------------------------*/
#define XPI (3.1415926535897932384626433832795)
#define XENTRY (100)
#define XINCL (XPI/2/XENTRY)
#define PI 3.1415926535897932384626433832795028841971 //定义圆周率值
/*Global data space ----------------------------------------------------------*/
//正弦值对应表
static const double XSinTbl[] = {
0.00000000000000000 , 0.015707317311820675 , 0.031410759078128292 , 0.047106450709642665 , 0.062790519529313374 ,
0.078459095727844944 , 0.094108313318514325 , 0.10973431109104528 , 0.12533323356430426 , 0.14090123193758267 ,
0.15643446504023087 , 0.17192910027940955 , 0.18738131458572463 , 0.20278729535651249 , 0.21814324139654256 ,
0.23344536385590542 , 0.24868988716485479 , 0.26387304996537292 , 0.27899110603922928 , 0.29404032523230400 ,
0.30901699437494740 , 0.32391741819814940 , 0.33873792024529142 , 0.35347484377925714 , 0.36812455268467797 ,
0.38268343236508978 , 0.39714789063478062 , 0.41151435860510882 , 0.42577929156507272 , 0.43993916985591514 ,
0.45399049973954680 , 0.46792981426057340 , 0.48175367410171532 , 0.49545866843240760 , 0.50904141575037132 ,
0.52249856471594880 , 0.53582679497899666 , 0.54902281799813180 , 0.56208337785213058 , 0.57500525204327857 ,
0.58778525229247314 , 0.60042022532588402 , 0.61290705365297649 , 0.62524265633570519 , 0.63742398974868975 ,
0.64944804833018377 , 0.66131186532365183 , 0.67301251350977331 , 0.68454710592868873 , 0.69591279659231442 ,
0.70710678118654757 , 0.71812629776318881 , 0.72896862742141155 , 0.73963109497860968 , 0.75011106963045959 ,
0.76040596560003104 , 0.77051324277578925 , 0.78043040733832969 , 0.79015501237569041 , 0.79968465848709058 ,
0.80901699437494745 , 0.81814971742502351 , 0.82708057427456183 , 0.83580736136827027 , 0.84432792550201508 ,
0.85264016435409218 , 0.86074202700394364 , 0.86863151443819120 , 0.87630668004386369 , 0.88376563008869347 ,
0.89100652418836779 , 0.89802757576061565 , 0.90482705246601958 , 0.91140327663544529 , 0.91775462568398114 ,
0.92387953251128674 , 0.92977648588825146 , 0.93544403082986738 , 0.94088076895422557 , 0.94608535882754530 ,
0.95105651629515353 , 0.95579301479833012 , 0.96029368567694307 , 0.96455741845779808 , 0.96858316112863108 ,
0.97236992039767667 , 0.97591676193874743 , 0.97922281062176575 , 0.98228725072868872 , 0.98510932615477398 ,
0.98768834059513777 , 0.99002365771655754 , 0.99211470131447788 , 0.99396095545517971 , 0.99556196460308000 ,
0.99691733373312796 , 0.99802672842827156 , 0.99888987496197001 , 0.99950656036573160 , 0.99987663248166059 ,
1.00000000000000000 };
//向下取整
double my_floor(double x)
{
double y=x;
if( (*( ( (int *) &y)+1) & 0x80000000) != 0) //或者if(x<0)
return (float)((int)x)-1;
else
return (float)((int)x);
}
//求余运算
double my_fmod(double x, double y)
{
double temp, ret;
if (y == 0.0)
return 0.0;
temp = my_floor(x/y);
ret = x - temp * y;
if ((x < 0.0) != (y < 0.0))
ret = ret - y;
return ret;
}
//正弦函数
double XSin( double x )
{
int s = 0 , n;
double dx , sx , cx;
if( x < 0 )
s = 1 , x = -x;
x = my_fmod( x , 2 * XPI );
if( x > XPI )
s = !s , x -= XPI;
if( x > XPI / 2 )
x = XPI - x;
n = (int)( x / XINCL );
dx = x - n * XINCL;
if( dx > XINCL / 2 )
++n , dx -= XINCL;
sx = XSinTbl[n];
cx = XSinTbl[XENTRY-n];
x = sx + dx*cx - (dx*dx)*sx/2
- (dx*dx*dx)*cx/6
+ (dx*dx*dx*dx)*sx/24;
return s ? -x : x;
}
//余弦函数
double XCos( double x )
{
return XSin( x + XPI/2 );
}
//开平方
int qsqrt(int a)
{
uint32_t rem = 0, root = 0, divisor = 0;
uint16_t i;
for(i=0; i<16; i++)
{
root <<= 1;
rem = ((rem << 2) + (a>>30));
a <<= 2;
divisor = (root << 1) + 1;
if(divisor <= rem)
{
rem -= divisor;
root++;
}
}
return root;
}
/*********************************FFT*********************************
快速傅里叶变换C函数
函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依
赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复
数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的
复数
使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的
应该为2的N次方,不满足此条件时应在后面补0
函数调用:FFT(s);
时 间:2010-2-20
版 本:Ver1.0
参考文献:
**********************************************************************/
/*******************************************************************
函数原型:struct compx EE(struct compx b1,struct compx b2)
函数功能:对两个复数进行乘法运算
输入参数:两个以联合体定义的复数a,b
输出参数:a和b的乘积,以联合体的形式输出
*******************************************************************/
struct compx EE(struct compx a,struct compx b)
{
struct compx c;
c.real=a.real*b.real-a.imag*b.imag;
c.imag=a.real*b.imag+a.imag*b.real;
return(c);
}
/*****************************************************************
函数原型:void FFT(struct compx *xin,int N)
函数功能:对输入的复数组进行快速傅里叶变换(FFT)
输入参数:*xin复数结构体组的首地址指针,struct型
*****************************************************************/
void FFT(struct compx *xin)
{
int f,m,nv2,nm1,i,k,l,j=0;
struct compx u,w,t;
nv2=FFT_N/2; //变址运算,即把自然顺序变成倒位序,采用雷德算法
nm1=FFT_N-1;
for(i=0;i<nm1;i++)
{
if(i<j) //如果i<j,即进行变址
{
t=xin[j];
xin[j]=xin[i];
xin[i]=t;
}
k=nv2; //求j的下一个倒位序
while(k<=j) //如果k<=j,表示j的最高位为1
{
j=j-k; //把最高位变成0
k=k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为0
}
j=j+k; //把0改为1
}
{ //FFT运算核,使用蝶形运算完成FFT运算
int le,lei,ip;
f=FFT_N;
for(l=1;(f=f/2)!=1;l++) //计算l的值,即计算蝶形级数
;
for(m=1;m<=l;m++) // 控制蝶形结级数
{ //m表示第m级蝶形,l为蝶形级总数l=log(2)N
le=2<<(m-1); //le蝶形结距离,即第m级蝶形的蝶形结相距le点
lei=le/2; //同一蝶形结中参加运算的两点的距离
u.real=1.0; //u为蝶形结运算系数,初始值为1
u.imag=0.0;
w.real=XCos(PI/lei); //w为系数商,即当前系数与前一个系数的商
w.imag=-XSin(PI/lei);
for(j=0;j<=lei-1;j++) //控制计算不同种蝶形结,即计算系数不同的蝶形结
{
for(i=j;i<=FFT_N-1;i=i+le) //控制同一蝶形结运算,即计算系数相同蝶形结
{
ip=i+lei; //i,ip分别表示参加蝶形运算的两个节点
t=EE(xin[ip],u); //蝶形运算,详见公式
xin[ip].real=xin[i].real-t.real;
xin[ip].imag=xin[i].imag-t.imag;
xin[i].real=xin[i].real+t.real;
xin[i].imag=xin[i].imag+t.imag;
}
u=EE(u,w); //改变系数,进行下一个蝶形运算
}
}
}
}
//读取峰值
int find_max_num_index(struct compx *data,int count)
{
int i=START_INDEX;
int max_num_index = i;
//struct compx temp=data[i];
float temp = data[i].real;
for(i=START_INDEX;i<count;i++)
{
if(temp < data[i].real)
{
temp = data[i].real;
max_num_index = i;
}
}
//printf("max_num_index=%d\r\n",max_num_index);
return max_num_index;
}
//直流滤波器
int dc_filter(int input,DC_FilterData * df)
{
float new_w = input + df->w * df->a;
int16_t result = 5*(new_w - df->w);
df->w = new_w;
return result;
}
int bw_filter(int input,BW_FilterData * bw) {
bw->v0 = bw->v1;
// v1 = (3.04687470e-2 * input) + (0.9390625058 * v0);
bw->v1 = (1.241106190967544882e-2*input)+(0.97517787618064910582 * bw->v0);
return bw->v0 + bw->v1;
}