基于单片机烟雾温湿度甲醛监测设计

目录

【功能介绍】

【原理图】

【PCB】

【实物图】

【元器件清单】

【源程序】

【原理介绍】

【参考资料】

【参考文献】


【功能介绍】

        本系统采用单片机为控制核心,以实现便携式温湿度甲醛检测仪的基本控制功能。系统主要功能内容包括:数据处理、开始测量、超标报警、键盘检测。本系统设计采用功能模块化的设计思想,系统主要分为总体方案设计、硬件和软件的设计三大部分。

        本设计主要实现甲醛检测仪设计,功能包括:烟雾、温湿度、甲醛检测、超标报警、键盘检测、数据显示等。

【原理图】

【PCB】

【实物图】

【元器件清单】

规格名称标号数量
KEY1按键K1, K2, K33
S8050三极管Q21
10K电阻R31
1K电阻R41
10K电位器RT1, RT32
LCD1602液晶U11
POW电源U21
SWITCH开关U31
DHT11温湿度传感器U41
STM32核 单片机U51
MQ-2烟雾U61
蜂 蜂鸣器U91
CON4甲醛U341

【源程序】

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "adc.h"
#include "timer.h"
#include "usart1.h"
#include "usart3.h"
#include "LCD1602.h"
#include "string.h"
#include "stdio.h"
#include "dht11.h"
#include "stmflash.h"

#define WriteFlashAddress	((u32)0x08010000)//读写起始地址

u16 CH20_MAX_val = 100;//甲醛报警值
u16 CH2O_mgvalue = 0;//甲醛

void Change_data_handle(void);
void  SHOW_AND_BAOJING_Handle(void);
u8 KEY_SCAN(void);             //按键函数

u8 SHOW_BUF[16],SEND_BUF[16];
u8 key,PPM,Temperature,HUM;
u16 PPM_MAX=60,Temperature_MAX=40,HUM_MAX=70;//烟雾温湿度上限初始值
u16 write_buf[5];

///串口相关
extern char RxCounter,Usart1RecBuf[64];//串口1接收数据缓存
extern char bUsart1RecFlag;   //串口1收到数据标志位

void save_data()//存储数据
{
	  write_buf[0]=1111;
		write_buf[1]=PPM_MAX; 
		write_buf[2]=Temperature_MAX;
		write_buf[3]=HUM_MAX;
		write_buf[4]=CH20_MAX_val;
	  STMFLASH_Write(WriteFlashAddress,write_buf,5);
}

void read_data()//读取数据
{
	  static u16 chcek = 0;
	  STMFLASH_Read(WriteFlashAddress,write_buf,5);
	  chcek = write_buf[0];
	  if(chcek != 1111)//单片机第一次使用时,chcek不等于1111,以下则是保存一下数据,再进行读取
		{
				save_data();
			  delay_ms(100);
			  STMFLASH_Read(WriteFlashAddress,write_buf,5);
		}
	
		PPM_MAX = write_buf[1];//烟雾上限值
		Temperature_MAX = write_buf[2];//温度上限值
		HUM_MAX = write_buf[3];//湿度上限值
		CH20_MAX_val = write_buf[4];//PM上限值
		
		if(PPM_MAX > 99 || PPM_MAX<0)PPM_MAX=60;
		if(Temperature_MAX > 99 || Temperature_MAX<0)Temperature_MAX=40;
		if(HUM_MAX > 99 || HUM_MAX<0)HUM_MAX=70;
		if(CH20_MAX_val > 999 || CH20_MAX_val<0)CH20_MAX_val=100;
}

void Get_CH2O(void)//获取甲醛
{
    char i = 0;

		if(Usart1RecBuf[i+5] == Usart1RecBuf[i]+Usart1RecBuf[i+1]+Usart1RecBuf[i+2]+Usart1RecBuf[i+3]+Usart1RecBuf[i+4])//校验
		{
				CH2O_mgvalue = Usart1RecBuf[1]*256 + Usart1RecBuf[2];//计算甲醛
				bUsart1RecFlag = 0;	
		}
		RxCounter = 0;
}

int main(void)
{	
  u16 test,test_adc;
	
	delay_init();	    	 //延时函数初始化	  
	NVIC_Configuration(); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	KEY_IO_Init();       
  Usart1_Init(9600);//串口3初始化,波特率9600
	TIM2_Int_Init(1000,72-1);  //定时器初始化,定时1MS
	read_data();//开机读取一次存储值
	delay_ms(300);
  DHT11_Init();	//DHT11初始化
  BEEP_DISENABLE();   //蜂鸣器初始化
	LCD_Init();          // 1602初始化 
	Adc_Init();  //ADC初始化

  while(1)
	{
			test_adc = Get_Adc_Average(ADC_Channel_9,20);//读取通道9的AD值,20ms读取一次
			PPM = test_adc*99/4096;//12位AD,把AD值转换成百分比0~99
			PPM = PPM >= 99? 99: PPM;//最大值不能超过99
		  DHT11_Read_Data(&Temperature,&HUM);//读取温湿度值
		  Get_CH2O();//获取甲醛值
			SHOW_AND_BAOJING_Handle();
      Change_data_handle();//按键调节
			delay_ms(100);
  }
}


extern u8 FLICKER;

void  SHOW_AND_BAOJING_Handle(void)
{
    unsigned char show_buf[16];//显示缓存区
	  
	  if(Temperature >= Temperature_MAX)//温度超限
		{
			 if(FLICKER)//超标显示闪烁
			 {
					LCD_Write_String(0,0,"         ");
			 }
			 else
			 {
					sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//转换显示格式为TEMP:00C
					LCD_Write_String(0,0,show_buf);//显示
			 }
		}
		else
		{
			sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//转换显示格式为TEMP:00C
			LCD_Write_String(0,0,show_buf);//显示
		}
		if(HUM >= HUM_MAX)//湿度超限
		{
			 if(FLICKER)//超标显示闪烁
			 {
					LCD_Write_String(9,0,"       ");
			 }
			 else
			 {
					sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//转换显示格式为HUM:00%
					LCD_Write_String(9,0,show_buf);//显示
			 }
		}
		else
		{
			sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//转换显示格式为HUM:00%
			LCD_Write_String(9,0,show_buf);
		}

		if(PPM >= PPM_MAX)//烟雾超限
		{
			 if(FLICKER)//超标显示闪烁
			 {
					LCD_Write_String(0,1,"      ");
			 }
			 else
			 {
					sprintf(show_buf,"YW:%02d%%",PPM);//转换显示格式为SMOKE:00%
					LCD_Write_String(0,1,show_buf);
			 }
		}
		else
		{
			sprintf(show_buf,"YW:%02d%%",PPM);//转换显示格式为SMOKE:00%
			LCD_Write_String(0,1,show_buf);
		}
		
		if(CH2O_mgvalue >= CH20_MAX_val && FLICKER)//甲醛超限
		{
					LCD_Write_String(7,1,"         ");
		}
		else
		{
					
				  LCD_Write_Char(7,1,CH2O_mgvalue/100+'0');
				  LCD_Write_Char(8,1,'.');
				  LCD_Write_Char(9,1,CH2O_mgvalue%100/10+'0');
				  LCD_Write_Char(10,1,CH2O_mgvalue%10+'0');
				  LCD_Write_Char(11,1,'m');
				  LCD_Write_Char(12,1,'g');
				  LCD_Write_Char(13,1,'/');
				  LCD_Write_Char(14,1,'m');
				  LCD_Write_Char(15,1,'3');
		}
    if(Temperature >= Temperature_MAX || HUM >= HUM_MAX || PPM >= PPM_MAX || CH2O_mgvalue >= CH20_MAX_val)//温度湿度烟雾甲醛超限
		{
				BEEP_ENABLE(); //蜂鸣器报警		
		}			
		else 
		{
				BEEP_DISENABLE();
		}			
}

u8 KEY_SCAN(void)
{
	  u8 res = 0;
    if(!KEY1)
		{
		   delay_ms(10);
			 if(!KEY1)
		   {
					while(!KEY1);//卡死
					res = 1;		 
		   }
		 }
    if(!KEY2)
		{
		   delay_ms(10);
			 if(!KEY2)
		   {
					while(!KEY2);//卡死
					res = 2;		 
		   }
		 }
    if(!KEY3)
		{
		   delay_ms(10);
			 if(!KEY3)
		   {
					while(!KEY3);//卡死
					res = 3;		 
		   }
		 }		 
		 return res;
}

本文介绍了在设计的过程的关键点,供大家参考学习,如果有错误或者不明白的可以直接私信作者,或者添加微信biyezhan007。

【原理介绍】

烟雾传感器工作原理:

        烟雾传感器用于检测当前场所内的烟雾浓度来实现火灾的预防,烟雾报警器内部采用离子式烟雾传感,广泛应用于各种消防报警系统中,离子烟雾传感器是一种稳定可靠,技术先进的传感器,性能优于气敏电阻类的火灾报警器。

        烟雾传感器目前分为2大类,分别是离子式烟雾传感器、光电式烟雾传感器和气敏式烟雾传感器。光电式烟雾传感器又分为减光式和散射光式光电烟雾探测器。本次设计采用的是常见的气敏式烟雾传感器,其工作原理是采用清洁空气中电导率较低的二氧化锡,当传感器所处环境中存在可燃气体时,传感器的电导率和气体浓度成线性化比,通过单片机本身的AD数模转换模块,即可将信号量变换成数字量,输出给单片机,最终显示在LCD1602液晶显示屏上

        烟雾传感器也就是MQ-2是一种气体传感器。可以用在家庭或者是工厂等气体检测。通过阅读其相关的芯片资料我们知道可以检测到很多种气体。比如:液化气、酒精、氢气、烟雾等气体。本身具有的优势有响应速度快、使用寿命久、稳定性好、电路设计简单等特性。烟雾传感器是属于二氧化锡的半导体材料。当温度在200到300度时,二氧化锡会吸附空气中的氧气,增加电阻值。当检测到烟雾的时候会导致表面的导电率变化,这样就可以检测到烟雾的值。如果输出的电阻值越低,就代表输出的模拟信号值也就越大。

【参考资料】

【参考文献】

[1] 李维提,郭强.《液晶显示应用技术》 北京:电子工业出版社,2000年.

[2] 北京精电蓬远显示技术有限公司.内藏KS0108B/HD61202控制器图形液晶显示模块使用手册.

[3] 赵茂泰.《智能仪器原理及应用》  北京:电子工业出版社,2001。

[4] 赵新民.《智能仪器原理及设计》  哈尔滨工业大学出版社,1995。

[5] 徐爱钧,彭爱华.《单片机高级语言CSTM32应用程序设计》〔M〕.北京工业出版社,1999。

[6] 严蔚敏 吴伟民。《数据结构》 清华大学出版社,1996

[7] 马忠梅等.《单片机的C语言应用程序设计》 北京:北京航空航天大学出版社,1997

[8]  李刚 林凌 王焱 编著 新概念单片机教程. 天津大学出版社,2004年

[9]  华成英. 童诗白. 《模拟电子技术基础第三版》 北京: 高等教育出版社, 2004.4.

[10]  丁元杰. 《单片微机原理及应用》.北京:机械工业出版社,1993

        本文介绍了在设计的过程的关键点,供大家参考学习,如需获取实物、或者下载链接失效、对其他单片机硬件设计感兴趣、有不明白的或者错误的,可以添加徽信biyezhan007 

郑重声明,此文章提供给大家做参考模板,杜绝一切不良学术不良行为。

 

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咸鱼弟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值