基于STM单片机和MQ2烟雾传感器人体感应温湿度有毒气体串口蜂鸣器报警光耦继电器降温控制1602液晶显示proteus仿真设计

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();
	}	
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱单片机.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值