一:功能介绍:
1、系统组成:采用stm32f103c8t6核心板+DHT11温湿度+MQ2烟雾模块+MQ4可燃气体模块+LCD1602显示屏+蜂鸣器
2、通过DHT11传感器采集温湿度,显示到LCD1602上面;
3、通过MQ2传感器检测烟雾浓度,显示到LCD1602上面;
4、通过MQ4传感器检测可燃气体浓度,显示到LCD1602上面;
5、当烟雾浓度或者可燃气体浓度大于50(阈值程序可调),蜂鸣器报警提醒;
二:实物演示视频
244-基于stm32单片机厨房安全烟雾煤气温湿度检测报警系统
三:程序代码展示(采用C语言编写,使用keil5编译,代码有中文注释,新手容易看懂)
void LCD1602_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); //使能PA,PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //LCD1602的三根控制线rs,rw,en
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);//根据设定参数初始化GPIOC
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; //LCD1602的三根控制线rs,rw,en
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
// GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数初始化GPIOC
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//LCD1602的8跟数据线 //LED1-->PE.5 端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);//根据设定参数初始化GPIOA
LCD_Write_Command(0x38);//设置LCD两行显示,一个数据由5*7点阵表示,数据由8跟线传输
delay_ms(2);
LCD_Write_Command(0x01);//清除屏幕显示
delay_ms(2);
LCD_Write_Command(0x06);//设定输入方式,增量不移位
delay_ms(2);
LCD_Write_Command(0x0c);//开整体显示,关光标,不闪烁
delay_ms(2);
}
/*******************写指令函数************************/
void LCD_Write_Command(u8 com)
{
rs=0; //写指令函数和写数据函数其实可以并一起价格 BOOL变量判断是写指令就rs=0写数据就rs=1。
rw=0;
en=1; //写指令 输入:RS=L,RW=L,E=下降沿脉冲
GPIO_Write(GPIOA, 0X00FF&com);//该函数一般用来往一次性一个GPIO的多个端口设置
delay_ms(2);
en=0;
}
/*******************写数据函数************************/
void LCD_Write_Date(u8 date)
{
rs=1;
rw=0;
en=1; //写数据 输入:RS=H,RW=L,E=下降沿脉冲
GPIO_Write(GPIOA, 0X00FF&date);//GPIOA的第八位用来作为8位数据口
delay_ms(2);
en=0;
}
int main(void)
{
int mq2,mq4;
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
Adc_Init(); //ADC初始化
DHT11_Init();
delay_ms(100);
LCD1602_Init();
while(1)
{
mq2=Get_Adc_Average(ADC_Channel_8,10)/10-100;
mq4=Get_Adc_Average(ADC_Channel_9,10)/10-100;
if(mq2<0) mq2=0;
if(mq4<0) mq4=0;
DHT11_Read_TempAndHumidity ( & DHT11_Data );//获取传感器温湿度
LCD_Write_Command(0x80);//第一行的首地址
LCD_Write_Date(' ');
LCD_Write_Date(' ');
LCD_Write_Date('M');
LCD_Write_Date('Q');
LCD_Write_Date('=');
LCD_Write_Date(mq4%1000/100+0x30); //煤气
LCD_Write_Date(mq4%100/10+0x30);
LCD_Write_Date(mq4%10+0x30);
LCD_Write_Date(' ');
LCD_Write_Date(' ');
LCD_Write_Date('W');
LCD_Write_Date('D');
LCD_Write_Date('=');
LCD_Write_Date(DHT11_Data .temp_deci%1000/100+0x30);
LCD_Write_Date(DHT11_Data .temp_int%100/10+0x30);//显示温度
LCD_Write_Date(DHT11_Data .temp_int%10+0x30);
LCD_Write_Command(0x80+0x40);
LCD_Write_Date(' ');
LCD_Write_Date(' ');
LCD_Write_Date('Y');
LCD_Write_Date('W');
LCD_Write_Date('=');
LCD_Write_Date(mq2%1000/100+0x30);//显示烟雾
LCD_Write_Date(mq2%100/10+0x30);
LCD_Write_Date(mq2%10+0x30);
LCD_Write_Date(' ');
LCD_Write_Date(' ');
LCD_Write_Date('S');
LCD_Write_Date('D');
LCD_Write_Date('=');
LCD_Write_Date(DHT11_Data .humi_int%1000/100+0x30);
LCD_Write_Date(DHT11_Data .humi_int%100/10+0x30);//显示湿度
LCD_Write_Date(DHT11_Data .humi_int%10+0x30);
if(mq2>50||mq4>50) //大于50 声光报警
{
BEEP=0;
}
else
{
BEEP=1;
}
}
}
四:原理图文件展示(采用AD(Altium Designer)打开)
五:实物图展示:
六: 资料清单展示: