一:功能介绍:
1、系统组成:采用stm32f103c8t6核心板+DHT11温湿度+MQ2烟雾传感器+OLED显示屏+蜂鸣器+继电器+风扇+按键+LED
2、通过2组DHT11传感器采集温湿度,显示到OLED上面;
3、通过MQ2检测当前烟雾浓度,显示到OLED上面;
4、通过按键设置温度和湿度阈值,显示到OLED上面;
5、当两组温度小于设置值,开启加热(LED模拟);
6、当两组温度大于设置温度或者两组湿度大于设置湿度,开启继电器打开风扇进行通风排气散热和去湿;
7、当两组湿度小于设置值,开启加湿(LED模拟);
8、当烟雾浓度大于100(阈值程序可调),打开风扇进行排气,并且蜂鸣器进行报警提醒;
二:实物演示视频
242-基于stm32单片机多点温湿度烟雾监测
三:程序代码展示(采用C语言编写,使用keil5编译,代码有中文注释,新手容易看懂)
void anjiansaomiao(void)
{
static char k1,k2,k3,k4;
static char K1Flag=0,K2Flag=0,K3Flag=0,K4Flag=0;
//按键扫描,获取按键状态
k3 = GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_15);
k4 = GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_14);
k1 = GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_13);
k2 = GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_12);
//温度+
if(k1 == 0)
{
K1Flag = 1;
}
else
{
//释放后进行响应
if(K1Flag )
{
K1Flag = 0;
wenduset++;
if(wenduset>99) wenduset=99;
}
}
//温度-
if(k2 == 0)
{
K2Flag = 1;
}
else
{
//释放后进行响应
if(K2Flag )
{
K2Flag = 0;
wenduset--;
if(wenduset<0) wenduset=0;
}
}
//湿度+
if(k3 == 0)
{
K3Flag = 1;
}
else
{
//释放后进行响应
if(K3Flag )
{
K3Flag = 0;
shiduset++;
if(shiduset>99) shiduset=99;
}
}
//湿度-
if(k4 == 0)
{
K4Flag = 1;
}
else
{
//释放后进行响应
if(K4Flag)
{
K4Flag = 0;
shiduset--;
if(shiduset<0) shiduset=0;
}
}
}
int main(void)
{ //时钟配置
SystemInit();
SystemCoreClockUpdate();
NVICConfig();
delay_init();
// uart_init(9600);
OLED_Init();
OLED_ColorTurn(0);
OLED_DisplayTurn(0);
OLED_ShowString(0,0,"TEMP:",16); OLED_ShowString(70,0,"C",16); OLED_ShowString(110,0,"C",16);
OLED_ShowString(0,16,"HUMI:",16); OLED_ShowString(70,16,"%",16); OLED_ShowString(110,16,"%",16);
OLED_ShowString(0,32,"WSET:",16); OLED_ShowString(65,32,"HSET:",16);
OLED_ShowString(0,48," MQ2:",16); OLED_ShowString(90,48,"PPM",16);
OLED_Refresh();
DHT11_Init();
DHT11_Init1();
//RCC时钟开启
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
Adc_Init();GPIO_Configuration();
LED_Init();
Q1=LED=1;led1=led2=0;
while(1)
{
anjiansaomiao();
mq2=Get_Adc_Average(ADC_Channel_0,10);
mq2=mq2*3.3/4096*100;
if(mq2<60) mq2=0;
DHT11_Read_Data(&wendu,&shidu);
DHT11_Read_TempAndHumidity ( & DHT11_Data );//获取传感器湿度
OLED_ShowNum(50,0,DHT11_Data .temp_int,2,16);//显示温度数据
OLED_ShowNum(50,16,DHT11_Data .humi_int,2,16);//显示湿度
OLED_ShowNum(90,0,wendu,2,16);//显示温度数据
OLED_ShowNum(90,16,shidu,2,16);//显示湿度
OLED_ShowNum(40,32,wenduset,2,16);//设置温度显示
OLED_ShowNum(105,32,shiduset,2,16);//设置湿度显示
OLED_ShowNum(50,48,mq2,4,16);//显示烟雾浓度
OLED_Refresh();
if((DHT11_Data .temp_int>wenduset&&wendu>wenduset)||(DHT11_Data .humi_int>shiduset&&shidu>shiduset)||mq2>100) Q1=0;//温度、湿度 烟雾浓度过高 开风扇通风
else Q1=1;
if(DHT11_Data .temp_int<wenduset&&wendu<wenduset) led2=1;//温度过低 开启加热 led灯模拟
else led2=0;
if(DHT11_Data .humi_int<shiduset&&shidu<shiduset) led1=1;//湿度过低 开启加湿 led模拟
else led1=0;
if(mq2>100) beep=0;
else beep=1;
}
}
四:原理图和PCB文件展示(采用AD(Altium Designer)打开)
五:实物图展示:
六: 资料清单展示: