欢迎光临
我们一直在努力

基于STM32的图书馆环境监测系统

摘 要
随着科技水平的提高,人们对食品的安全越来越重视,本文主要利用STM32单片机,连接其他外部传感器,对周围的环境进行检测,如温度、湿度、烟雾、PM2.5等。通过监测到的数据严格实时控制周围的环境参数,使其适合面粉的保存以保障面粉不会腐坏,避免浪费粮食,引起食物中毒和避免面粉引起的爆炸等事故。
基于STM32的图书馆环境监测系统是一种智能化系统,他集传感器技术、数据采集处理、无线通信等技术于一体。通电开机后本系统通过传感器采集数据环境,将数据传递给STM32微控制器。STM32微控制器根据预设的阈值判断监测出的环境参数是否超出设置的阈值,再利用蓝牙模块,将监测结果发送到上位机或者云端平台(本文采用云端平台),方便用于远程监控和管理。该系统具有实时监测、数据采集、无线传输、远程监控等功能,可以广泛应用于食品、医药、化工等行业的图书馆环境监测,保障图书馆内部环境的安全和稳定,提高仓储管理的效率和质量。
此外该系统还可以通过增加传感器的种类,提高数据采集精度等方式根据实际需求进行扩展和升级,以满足不同行业和场景的需求。随着科技的发展和应用,基于STM32的图书馆环境监测系统将成为仓储管理领域的重要工具之一。
关键字:STM32单片机;传感器;安全报警系统;蓝牙传输数据

ABSTRACT
With technological advancements, food safety has become a top priority. This study utilizes an STM32 microcontroller to integrate external sensors for monitoring environmental parameters including temperature, humidity, smoke, and PM2.5 levels. The system enables real-time control of these parameters to optimize flour storage conditions, preventing spoilage, food waste, food poisoning risks, and potential flour explosion hazards.
The STM32-based library environmental monitoring system is an intelligent solution that integrates sensor technology, data acquisition and processing, and wireless communication. Upon power-on, the system collects environmental data through sensors and transmits it to the STM32 microcontroller. The microcontroller evaluates whether detected parameters exceed preset thresholds using predefined values, then sends monitoring results to a host computer or cloud platform (this study employs cloud-based solutions) via Bluetooth module for remote monitoring and management. Featuring real-time monitoring, data acquisition, wireless transmission, and remote control capabilities, this system is widely applicable in library environments across food, pharmaceutical, and chemical industries. It ensures the safety and stability of library environments while enhancing the efficiency and quality of warehouse management.
Furthermore, the system can be expanded and upgraded to meet diverse industry and scenario requirements by adding more sensor types or enhancing data collection accuracy. With technological advancements and broader applications, the STM32-based library environment monitoring system is poised to become a key tool in warehouse management.
Key Words:STM32 MCU; Sensor; Security alarm system; Bluetooth data transfer

目 录
第1章 绪论1
1.1 研究目的及意义1
1.2 国内外研究现状1
1.3 本文主要工作2
第2章 系统总体设计4
2.1 系统整体设计4
2.2 单片机的选择5
2.3 温湿度传感器的选择5
2.4 烟雾传感器的选择5
第3章 系统硬件设计7
3.1 总体硬件原理及原理图7
3.2 单片机最小系统7
3.3 按键控制电路原理9
3.4 报警电路10
3.5 OLED液晶显示电路设计10
3.6 蓝牙无线传输电路设计11
3.7 温湿度传感器监测电路12
3.8 PM2.5传感器模块电路设计13
3.9 烟雾传感器模块14
第4章 系统软件设计17
4.1 软件设计的工具17
4.2 软件主程序逻辑结构17
4.3 OLED的显示流程18
4.4 无线蓝牙传输数据逻辑19
4.5 温湿度传感器监测流程图20
4.6 按键程序控制21
4.7 PM2.5传感器监测流程22
4.8 报警程序流程22
第5章 系统测试23
5.1 系统的测试23
5.2 产生干扰的后果25
5.3 硬件抗干扰的设计26
第6章 总结与展望27
6.1 总结27
6.2 展望27
参考文献29
致谢30

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
#include "adc.h"
#include "usart1.h"
#include "usart3.h"
#include "LCD1602.h"
#include "string.h"
#include "stdio.h"
#include "dht11.h"

u16 CH20_MAX_val = 100;//甲醛报警值
u16 CH2O_mgvalue = 0;//甲醛
u8 ch20Buf[9];

void Change_data_handle(void);
void SHOW_AND_BAOJING_Handle(void);
u8 KEY_SCAN(void); //按键函数

u16 PPM;
u16 PPM_MAX=50;
u16 CO;
u16 CO_MAX=40;
u8 SHOW_BUF[16],SEND_BUF[16];
u8 key,Temperature,HUM;
u16 Temperature_MAX=40,HUM_MAX=70;//温湿度上限初始值
u16 write_buf[4];
u8 display_mode=0;
char WIFI_SEND_BUF[]="TEMP:00C,HUM:00%,CH20:0.00mg/m3,YW:00%,CO:00%, \\r\\n";

///////串口相关
extern char RxCounter,Usart1RecBuf[64];//串口1接收数据缓存
extern char bUsart1RecFlag; //串口1收到数据标志位
char *strx=0;

#define STM32_RX3_BUF Usart3RecBuf
#define STM32_Rx3Counter Rx3Counter
#define STM32_RX3BUFF_SIZE USART3_RXBUFF_SIZE

void Clear_Buffer(void)//清空缓存
{
u8 i;
for(i=0;i<64;i++)
Usart1RecBuf[i]=0;//缓存
RxCounter=0;
}

void esp_ap_mode(void)
{
Clear_Buffer();
Uart1_SendStr("AT+CWMODE=2\\r\\n");////<mode>:1-Station模式,2-AP模式,3-AP兼Station模式
strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
while(strx == NULL)
{
Clear_Buffer();
Uart1_SendStr("AT+CWMODE=2\\r\\n");
delay_ms(500);
strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
}

/*
<ssid>:字符串参数,接入点名称
<pwd>:字符串参数,密码最长64字节,ASCII
<chl>:通道号
< ecn >:0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK
*/
Clear_Buffer();
Uart1_SendStr("AT+CWSAP=\\"TEST\\",\\"12345678\\",1,3\\r\\n");
strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
while(strx == NULL)
{
Clear_Buffer();
Uart1_SendStr("AT+CWSAP=\\"TEST\\",\\"12345678\\",1,3\\r\\n");
delay_ms(500);
strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
}

/*
AT+CIPMUX=1

OK
*/
Clear_Buffer();
Uart1_SendStr("AT+CIPMUX=1\\r\\n");
strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
while(strx == NULL)
{
Clear_Buffer();
Uart1_SendStr("AT+CIPMUX=1\\r\\n");
delay_ms(500);
strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
}

/*
AT+CIPMUX=1时才能开启服务器;关闭server模式需要重启?
AT+CIPSERVER=1,8080

OK
*/
Clear_Buffer();
Uart1_SendStr("AT+CIPSERVER=1,8080\\r\\n");
strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
while(strx == NULL)
{
Clear_Buffer();
Uart1_SendStr("AT+CIPSERVER=1,8080\\r\\n");
delay_ms(500);
strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
}
}

void esp8266_init()//esp8266初始化
{
Usart1_Init(115200);
Uart1_SendStr("ESP8266 Init\\r\\n");
Uart1_SendStr("AT\\r\\n");//模块测试
strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
while(strx == NULL)
{
Clear_Buffer();
Uart1_SendStr("AT\\r\\n");
delay_ms(500);
strx=strstr((const char*)Usart1RecBuf,(const char*)"OK");
}
esp_ap_mode();
}

void esp_send_buf(unsigned char conn_id, char * buf, unsigned char len)//发送数据
{
printf("AT+CIPSEND=%d,%d\\r\\n",conn_id,len);
strx = strstr((const char*)Usart1RecBuf,(const char*)">");
delay_ms(200);
if(strx==NULL)
{
return;
}

Uart1_SendStr(buf);
strx = strstr((const char*)Usart1RecBuf,(const char*)"SEND OK");
delay_ms(100);
if(strx==NULL)
{
return;
}
}

void Get_CH2O(void)//获取甲醛
{
char i = 0;

if(STM32_RX3_BUF[i+5] == STM32_RX3_BUF[i]+STM32_RX3_BUF[i+1]+STM32_RX3_BUF[i+2]+STM32_RX3_BUF[i+3]+STM32_RX3_BUF[i+4])//校验
{
CH2O_mgvalue = STM32_RX3_BUF[1]*256 + STM32_RX3_BUF[2];//计算甲醛
}
STM32_Rx3Counter = 0;
}

int main(void)
{
u16 test,test_adc;

delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
KEY_IO_Init();

USART3_Init(9600);
TIM2_Int_Init(1000,72-1); //定时器初始化,定时1MS
delay_ms(300);
DHT11_Init();//DHT11初始化
BEEP_DISENABLE(); //蜂鸣器初始化
Adc_Init();
LCD_Init(); // 1602初始化
LCD_Write_String(0,0,"ESP8266 Init… ");
esp8266_init();
LCD_Write_String(0,0," ");
while(1)
{
test_adc = Get_Adc_Average(ADC_Channel_9,20);
PPM = test_adc*99/4095;
PPM = PPM >= 99? 99: PPM;
CO = Get_Adc_Average(ADC_Channel_8,20);//读取CO的AD
CO = CO*99/4095;
CO = CO >= 99? 99: CO;

DHT11_Read_Data(&Temperature,&HUM);//读取温湿度值
Get_CH2O();//获取甲醛值
SHOW_AND_BAOJING_Handle();
Change_data_handle();//按键调节
if(test++ > 5)
{
test = 0;
esp_send_buf(0,WIFI_SEND_BUF,56);
}
delay_ms(100);
}
}

extern u8 FLICKER;

void SHOW_AND_BAOJING_Handle(void)
{
unsigned char show_buf[16];//显示缓存区
if(display_mode==0)
{
if(Temperature >= Temperature_MAX)//温度超限
{
if(FLICKER)//超标显示闪烁
{
LCD_Write_String(0,0," ");
}
else
{
sprintf(show_buf,"%02dC",(u16)Temperature);
LCD_Write_String(0,0,show_buf);//显示
}
}
else
{
sprintf(show_buf,"%02dC",(u16)Temperature);
LCD_Write_String(0,0,show_buf);//显示
}

if(HUM >= HUM_MAX)//湿度超限
{
if(FLICKER)//超标显示闪烁
{
LCD_Write_String(4,0," ");
}
else
{
sprintf(show_buf,"%02d%%RH",(u16)HUM);
LCD_Write_String(4,0,show_buf);//显示
}
}
else
{
sprintf(show_buf,"%02d%%RH",(u16)HUM);//转换显示格式为HUM:00%
LCD_Write_String(4,0,show_buf);
}
if(PPM >= PPM_MAX && FLICKER)//烟雾超限
{
LCD_Write_String(10,0," ");
}
else
{
sprintf(show_buf,"YW:%02d%%",PPM);//转换显示格式为SMOKE:00%
LCD_Write_String(10,0,show_buf);
}

if(CH2O_mgvalue >= CH20_MAX_val && FLICKER)//甲醛超限
{
LCD_Write_String(0,1," ");
}
else
{
LCD_Write_Char(0,1,'C');
LCD_Write_Char(1,1,'H');
LCD_Write_Char(2,1,'2');
LCD_Write_Char(3,1,'O');
LCD_Write_Char(4,1,':');
LCD_Write_Char(5,1,CH2O_mgvalue/100+'0');
LCD_Write_Char(6,1,'.');
LCD_Write_Char(7,1,CH2O_mgvalue%100/10+'0');
LCD_Write_Char(8,1,CH2O_mgvalue%10+'0');
LCD_Write_Char(9,1,'m');
LCD_Write_Char(10,1,'g');
LCD_Write_Char(11,1,'/');
LCD_Write_Char(12,1,'m');
LCD_Write_Char(13,1,'3');
}
}
else
{
if(CO >= CO_MAX && FLICKER)//CO超限
{
LCD_Write_String(5,0," ");
}
else
{
sprintf(show_buf,"CO:%02d%%",CO);//转换显示格式为CO:00%
LCD_Write_String(5,0,show_buf);
}
if(RTHW==1)
{
LCD_Write_String(0,1," Somebody ");
}
else
{
LCD_Write_String(0,1," Nobody ");
}
}
WIFI_SEND_BUF[5]=Temperature/10+0x30;
WIFI_SEND_BUF[6]=Temperature%10+0x30;
WIFI_SEND_BUF[13]=HUM/10+0x30;
WIFI_SEND_BUF[14]=HUM%10+0x30;
WIFI_SEND_BUF[22]=CH2O_mgvalue/100+0x30;
WIFI_SEND_BUF[24]=CH2O_mgvalue%100/10+0x30;
WIFI_SEND_BUF[25]=CH2O_mgvalue%10+0x30;
WIFI_SEND_BUF[35]=PPM/10+0x30;
WIFI_SEND_BUF[36]=PPM%10+0x30;
WIFI_SEND_BUF[42]=CO/10+0x30;
WIFI_SEND_BUF[43]=CO%10+0x30;
if(RTHW==1)
{
WIFI_SEND_BUF[46]='S';
WIFI_SEND_BUF[47]='o';
WIFI_SEND_BUF[48]='m';
WIFI_SEND_BUF[49]='e';

}
else
{
WIFI_SEND_BUF[46]=' ';
WIFI_SEND_BUF[47]=' ';
WIFI_SEND_BUF[48]='N';
WIFI_SEND_BUF[49]='o';
}
WIFI_SEND_BUF[50]='b';
WIFI_SEND_BUF[51]='o';
WIFI_SEND_BUF[52]='d';
WIFI_SEND_BUF[53]='y';
if(Temperature >= Temperature_MAX || HUM >= HUM_MAX|| CH2O_mgvalue >= CH20_MAX_val || PPM >= PPM_MAX||CO >= CO_MAX||RTHW==1)//温度湿度甲醛超限
{
BEEP_ENABLE(); //蜂鸣器报警
}
else
{
BEEP_DISENABLE();
}
}

u8 KEY_SCAN(void)
{
u8 res = 0;
if(!KEY1)
{
delay_ms(10);
if(!KEY1)
{
while(!KEY1);//卡死
res = 1;
}
}
if(!KEY2)
{
delay_ms(10);
if(!KEY2)
{
while(!KEY2);//卡死
res = 2;
}
}
if(!KEY3)
{
delay_ms(10);
if(!KEY3)
{
while(!KEY3);//卡死
res = 3;
}
}
return res;
}

void Change_data_handle(void)
{
u8 key;
static u8 MODE = 0;
key = KEY_SCAN();//读取按键值
if(key == 1)//按键1按下
{
MODE++;
LCD_Clear();//清屏
delay_ms(100);
}
if(key == 3 && MODE==0)
{
display_mode=!display_mode;
LCD_Clear();
}
while(MODE)
{
key = KEY_SCAN();
switch(MODE)
{
case 1: //设置温度
//显示
LCD_Write_String(0,0,"Set the TEMP ");
LCD_Write_String(0,1,"max:");
LCD_Write_Char(8,1,0xdf);
LCD_Write_Char(9,1,'C');
if(key == 2 && Temperature_MAX < 99) Temperature_MAX++;//按键2按下,值加1
if(key == 3 && Temperature_MAX > 0) Temperature_MAX–;//按键3按下,值减1
LCD1602_write_long(6,1,Temperature_MAX,2);//显示值

delay_ms(10);
break;
case 2: //设置湿度
//显示
LCD_Write_String(0,0,"Set the HUM ");
LCD_Write_String(0,1,"max:");
LCD_Write_String(8,1,"%");
if(key == 2 && HUM_MAX < 99) HUM_MAX += 1;//按键2按下,值加1
if(key == 3 && HUM_MAX > 0) HUM_MAX -= 1;//按键3按下,值减1
LCD1602_write_long(6,1,HUM_MAX,2);
break;
case 3: //设置甲醛
//显示
LCD_Write_String(0,0,"Set the CH2O ");
LCD_Write_String(0,1,"max:");
LCD_Write_String(9,1,"mg/m3");
if(key == 2 && CH20_MAX_val < 999) CH20_MAX_val += 1;//按键2按下,值加1
if(key == 3 && CH20_MAX_val > 0) CH20_MAX_val -= 1;//按键3按下,值减1
LCD_Write_Char(5,1,CH20_MAX_val/100+'0');
LCD_Write_Char(6,1,'.');
LCD_Write_Char(7,1,CH20_MAX_val%100/10+'0');
LCD_Write_Char(8,1,CH20_MAX_val%10+'0');
break;
case 4: //设置烟雾
//显示
LCD_Write_String(0,0,"Set the YW ");
LCD_Write_String(0,1,"max:");
LCD_Write_String(8,1,"%");
if(key == 2 && PPM_MAX < 99) PPM_MAX += 1;//按键2按下,值加1
if(key == 3 && PPM_MAX > 0) PPM_MAX -= 1;//按键3按下,值减1
LCD1602_write_long(6,1,PPM_MAX,2);
break;
case 5: //设置CO
//显示
LCD_Write_String(0,0,"Set the CO ");
LCD_Write_String(0,1,"max:");
LCD_Write_String(8,1,"%");
if(key == 2 && CO_MAX < 99) CO_MAX += 1;//按键2按下,值加1
if(key == 3 && CO_MAX > 0) CO_MAX -= 1;//按键3按下,值减1
LCD1602_write_long(6,1,CO_MAX,2);
break;
default: break;
}
if(key == 1)
{
MODE++;
LCD_Clear();
if(MODE == 6)//按下次数等于6退出设置
{
MODE = 0;
}
}
}

}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » 基于STM32的图书馆环境监测系统
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址