一. 系统概述
本系统由STM32单片机主控,能够实时检测环境的温湿度、烟雾浓度、PM2.5粉尘浓度及有害气体浓度。监测到的数据会显示在系统的显示屏上,同时通过蓝牙模块将数据传输到上位机进行进一步展示和处理。
二. 仿真功能简述
- 在手动模式下,用户可以通过按键1和按键2调整温湿度。按下按键1会降低温度,再按一次则会加热;按键2按下一次进行加湿,再按一次则为除湿。在自动模式下,系统会根据设定的阈值自动调节:当温度低于阈值时会加热,高于阈值则降温;湿度高于阈值时除湿,湿度低于阈值时加湿。如果烟雾、PM2.5或有害气体浓度超出阈值,系统将发出报警。
- 当环境中烟雾、PM2.5和有害气体浓度正常时,系统会向上位机发送“正常”信息。上位机通过虚拟串口模拟显示,用户可以通过网页版串口助手查看数据。
- 如果检测到烟雾、PM2.5或有害气体浓度超标,系统会向上位机发送“超标”警报,并附带详细的检测数据。
三.程序设计
#include <main.h>
//
u8 Key;//按键检测
u8 t,h,AIN1,AIN2,AIN0,AIN3;//
u8 tl=25,th=30,hl=33,hh=35,sh=3,ph=4,qh=5;
u8 m=0;//模式
u8 sdt=0,sdh=0;
//
//
void Init_Test(void);
void Test(void);
void Display(void);
//
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//2:2
Init_Test();
while(1)
{
Key_Scan(&Key);
DHT11_Read_Data(&t,&h);
AIN0=PCF8591_ADC_Input(0x90,0);
AIN1=PCF8591_ADC_Input(0x90,1);
AIN2=PCF8591_ADC_Input(0x90,2);
OLED_ShowString(1,1,"t:");OLED_ShowNum(1,3,t,2);
OLED_ShowString(1,6,"h:");OLED_ShowNum(1,8,h,2);
OLED_ShowString(2,1,"s:");OLED_ShowNum(2,3,AIN1,2);//AIN0
OLED_ShowString(3,1,"p:");OLED_ShowNum(3,3,AIN2,2);//AIN1
OLED_ShowString(4,1,"q:");OLED_ShowNum(4,3,AIN0,2);//AIN2
OLED_ShowNum(1,11,tl,2);
OLED_ShowNum(1,14,hl,2);//
OLED_ShowNum(2,11,th,2);
OLED_ShowNum(2,14,hh,2);//
OLED_ShowNum(2,6,sh,2);//
OLED_ShowNum(3,6,ph,2);//
OLED_ShowNum(4,6,qh,2);//
if(Key==4)
{
m=~m;
Key=0;
LedA2_0;LedA1_0;LedA3_0;LedA4_0;sdt=0;sdh=0;
}
if(m)
{
LedC1_0;//自动
if(t>th) { LedA1_1;}
else if(t<tl) { LedA2_1;}
else if(tl<t<th) { LedA1_0;LedA2_0; }
if(h>hh) { LedA4_1;}
else if(h<hl) { LedA3_1;}
else if(hl<h<hh) { LedA3_0;LedA4_0; }
if(AIN1>sh|AIN2>ph|AIN0>qh)
{
printf("烟雾:%d\r\n",AIN1);
printf("PM2.5:%d\r\n",AIN2);
printf("有害气体:%d\r\n",AIN0);
delay_ms(1000);
}
}else
{
LedC1_1;//手动
if(Key==1&&m==0){ Key=0; sdt++; if(sdt>2) sdt=0;}
if(Key==2&&m==0){ Key=0; sdh++; if(sdh>2) sdh=0;}
if(sdt==0) { LedA2_0; LedA1_0;}
else if(sdt==1) { LedA2_0; LedA1_1;}
else if(sdt==2) { LedA1_0; LedA2_1;}
if(sdh==0) { LedA3_0; LedA4_0;}
else if(sdh==1) { LedA4_0; LedA3_1;}
else if(sdh==2) { LedA3_0; LedA4_1;}
}
}
}
24-32f-41