1 开发环境
仿真图:proteus8.15
程序代码:KEIL5
原理图:proteus
2 功能说明介绍
结合实际情况,基于STM单片机和MQ2烟雾传感器人体感应温湿度有毒气体串口蜂鸣器报警光耦继电器降温控制proteus仿真设计。该系统应满足的功能要求为:
烟雾传感器值检测,人体红外感应,串口数据远程上传,DHT11温湿度检测,一氧化碳检测,STM32ADC模数转换、声光报警模块、1602液晶显示。
具体功能:
1、1602液晶实时监测及显示温度值、湿度值和烟雾浓度、人体感应值;
2、温度值超设定值启动风扇降温;
3、串口实时输出显示当前检测值;
4、温度、湿度、人体感应超过设定阈值时,蜂鸣器响灯亮起;
5、支持仿真定制。
工程文件使用keil5打开
代码
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "wifi.h"
#include "dht11.h"
#include "lcd1602.h"
#include "adc.h"
#include "timer.h"
u8 humi_value = 10,temp_value = 11;
u16 smog_value = 111,beam_value=123;
u16 smog_value_set = 1200;
u16 co_value = 120;
u8 humi_value_set = 65,temp_value_set = 22;
int num = 0;
//用于数据传输
//0-3:温度值
//4-7:烟雾值
//8-11:光照值
char value_buf[14];
char co_value_buf[14];
//数据处理,显示、判断
void Data_Deal(void)
{
DHT11_Read_Data(&temp_value,&humi_value); //读取温湿度值
smog_value = Get_Adc_Average(ADC_Channel_0,20); //读取人体感应值
beam_value = Get_Adc_Average(ADC_Channel_2,20); //读取其他ADC值
co_value = Get_Adc_Average(ADC_Channel_5,20);
//湿度显示
value_buf[12] = 0x30 + humi_value / 10;
value_buf[13] = 0x30 + humi_value % 10;
co_value_buf[0] = 0x30 + beam_value / 1000;
co_value_buf[1] = 0x30 + beam_value % 1000 / 100;
co_value_buf[2] = 0x30 + beam_value % 100 / 10;
co_value_buf[3] = 0x30 + beam_value % 10;
co_value_buf[4] = 0x30 + co_value / 1000;
co_value_buf[5] = 0x30 + co_value % 1000 / 100;
co_value_buf[6] = 0x30 + co_value % 100 / 10;
co_value_buf[7] = 0x30 + co_value % 10;
/*人体感应值显示*/
value_buf[4] = 0x30 + smog_value / 1000;
value_buf[5] = 0x30 + smog_value % 1000 / 100;
value_buf[6] = 0x30 + smog_value % 100 / 10;
value_buf[7] = 0x30 + smog_value % 10;
//输出读取的值
printf("temp: %d\r\nhumi: %d\r\nsmog: %d\r\nbeam: %d\r\nco_value:%d\r\nnum:%d\r\n\r\n", temp_value, humi_value, smog_value, beam_value,co_value,num);
if(num > 5)
{
if(num > 7)
{
num =0;
}
LED_RED = ~LED_RED;
LCD1602_Write_Cmd(0x80);
LCD1602_Write_Dat('H');
LCD1602_Write_Dat('a');
LCD1602_Write_Dat('r');
LCD1602_Write_Dat('m');
LCD1602_Write_Dat('f');
LCD1602_Write_Dat('u');
LCD1602_Write_Dat('l');
LCD1602_Write_Dat(':');
LCD1602_Write_Dat(co_value_buf[4]);
LCD1602_Write_Dat(co_value_buf[5]);
LCD1602_Write_Dat(co_value_buf[6]);
LCD1602_Write_Dat(co_value_buf[7]);
LCD1602_Write_Dat(' ');
LCD1602_Write_Dat(' ');
LCD1602_Write_Dat(' ');
LCD1602_Write_Dat(' ');
}
else
{
//温度值显示
value_buf[0] = 0x30 + temp_value % 100 / 10;
value_buf[1] = 0x30 + temp_value % 10;
LCD1602_Write_Cmd(0x80);
// LCD1602_Write_Dat('T');
// LCD1602_Write_Dat(':');
LCD1602_Write_Dat(value_buf[0]);
LCD1602_Write_Dat(value_buf[1]);
LCD1602_Write_Dat(0XDF);
LCD1602_Write_Dat('C');
LCD1602_Write_Dat(' ');
LCD1602_Write_Dat(value_buf[12]);
LCD1602_Write_Dat(value_buf[13]);
LCD1602_Write_Dat('%');
LCD1602_Write_Dat(' ');
LCD1602_Write_Dat('C');
LCD1602_Write_Dat(':');
LCD1602_Write_Dat(co_value_buf[0]);
LCD1602_Write_Dat(co_value_buf[1]);
LCD1602_Write_Dat(co_value_buf[2]);
LCD1602_Write_Dat(co_value_buf[3]);
}
//LCD显示数据
//显示人体感应值
LCD1602_Write_Cmd(0x80 + 0x40);
LCD1602_Write_Dat('V');
LCD1602_Write_Dat(':');
LCD1602_Write_Dat(value_buf[4]);
LCD1602_Write_Dat(value_buf[5]);
LCD1602_Write_Dat(value_buf[6]);
LCD1602_Write_Dat(value_buf[7]);
LCD1602_Write_Dat(' ');
LCD1602_Write_Dat('t');
LCD1602_Write_Dat(':');
LCD1602_Write_Dat(0x30 + temp_value_set % 100 / 10);
LCD1602_Write_Dat(0x30 + temp_value_set % 10);
LCD1602_Write_Dat(' ');
LCD1602_Write_Dat('h');
LCD1602_Write_Dat(':');
LCD1602_Write_Dat(0x30 + humi_value_set % 100 / 10);
LCD1602_Write_Dat(0x30 + humi_value_set % 10);
if(temp_value >= temp_value_set)
{
Moto = 0;
}
else
{
Moto = 1;
}
/* 声光报警判断 */
if(humi_value >= humi_value_set || temp_value >= temp_value_set || smog_value >= smog_value_set )
{
Beep = 0;
LED_RED = 0;
}
else /* 未达到声光报警条件,蜂鸣器和LED都不会工作 */
{
Beep = 1;
LED_RED = 1;
}
}
//系统硬件初始化
void Sys_Init(void)
{
u8 i;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
uart_init(115200); //串口初始化为9600,用于调试
LED_Init(); /* 蜂鸣器及LED初始化 */
DHT11_Init(); //温湿度传感器初始化
LCD1602_Init(); //LCD1602初始化
Adc_Init(); //AD值初始化,用于测量人体感应强调和ADC值
printf("test\r\n");
/*清屏幕*/
LCD1602_Write_Cmd(0x80);
for(i=0;i<16;i++)
{
LCD1602_Write_Dat(' ');
}
}
unsigned char key_flag = 0x00;
void Key_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
}
void KeyScan(void)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == 0)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == 0)
{
LED_RED = ~LED_RED;
}
// while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == 0);
}
}
//主函数
int main(void)
{
Sys_Init();
Key_init();
Beep = 1;
LED_RED = 1;
Moto = 1;
while(1)
{
num++;
Data_Deal(); //数据处理
KeyScan();
}
}