欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32一氧化碳报警

程序员文章站 2024-02-24 23:28:40
...

冬天家里需要生火,难免会有一氧化碳产生,为了安全做一个简单的装置

某宝买了几个探头

STM32一氧化碳报警

也不知道准确不准确

开始制作

没有电路图自己飞线接的。。。

使用ADC1的通道0、1;采集QM2或QM9的模拟信号 PA0,PA1
模拟I2C显示0.96寸液晶显示PA9,PA10
蜂鸣器使用低电平有效PB8
按键全部是低有效
大按键PB15
小按键PB4、PB5、PB6

STM32一氧化碳报警
探头供电5V,蜂鸣器供电3.3V

编写程序

main.c

#include "delay.h"
#include "sys.h"
#include "adc.h"
#include "key.h"
#include "oled.h"
#include "beep.h"
#include "rtc.h" 	
#include "bmp.h"
u8 co;
u8 yw;
 u8 moni[2];
u8 k1=0;
u8 k2=0;
u8 k3=0;
u8 k4=0;
u8 y=0;
u8 t=0;
u8 nian,yue,ri,shi,fen,miao;
u16 temp;
u8 timnum=0;
u8 timdat_flang=0;
u16 uu=0;
u8 len=0;
u8 lend=0;
u8 boond=0;
 int main(void)
{ 
	u16 ti=200;
	 delay_init();
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	 key_init();
	 BEEP_Init();
	 ADC1_Init();
	 OLED_Init(); 
	 OLED_Clear();
	while(RTC_Init())		//RTC初始化	,一定要初始化成功
	{ 
		OLED_ShowString(5,7,"RTC ERROR!",8);	
		delay_ms(800);
		OLED_ShowString(6,7,"RTC Trying...",8);	
	}	
	OLED_ShowString(0,1,"Welcome to air !",8);
	delay_ms(1000);
	OLED_Clear();
	OLED_ShowString(0,1,"Loading.  ",8);
	delay_ms(1000);
	OLED_ShowString(0,1,"Loading.. ",8);
	delay_ms(1000);
	OLED_ShowString(0,1,"Loading...",8);
	delay_ms(1000);
	
	OLED_Clear();
	OLED_ShowString(0,0,"MQ-2 Loading...",8);
	delay_ms(1000);
	OLED_ShowString(0,1,"MQ-9 Loading...",8);
	delay_ms(1000);
	OLED_ShowString(0,2,"Key Loading...",8);
	delay_ms(1000);
	OLED_ShowString(0,3,"Loading.  ",8);
	delay_ms(1000);
	OLED_ShowString(0,3,"Loading.. ",8);
	delay_ms(1000);
	OLED_ShowString(0,3,"Loading...",8);
	delay_ms(1000);
	OLED_ShowString(0,4,"Welcome  *_* ",8);
	delay_ms(1000);
	GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	delay_ms(50);
	GPIO_SetBits(GPIOB,GPIO_Pin_9);
	OLED_Clear();
	//shezhishijian();	
		OLED_ShowCHinese(0+11,0,0);//
		OLED_ShowCHinese(18+11,0,1);//
		OLED_ShowCHinese(36+11,0,2);//
		OLED_ShowCHinese(54+11,0,3);//
		OLED_ShowCHinese(72+11,0,4);//
		OLED_ShowCHinese(90+11,0,5);//
	
		OLED_ShowCHinese(0,3,10);//
		OLED_ShowCHinese(18,3,11);//
		OLED_ShowCHinese(36,3,12);//
		OLED_ShowCHinese(54,3,13);//
		OLED_ShowCHinese(72,3,14);//
	
		OLED_ShowCHinese(0,5,6);//
		OLED_ShowCHinese(18,5,7);//
		OLED_ShowCHinese(36,5,8);//
		OLED_ShowCHinese(54,5,9);//
		OLED_ShowCHinese(72,5,14);//
		OLED_ShowString(0,7,"MQ-2:",8);
		OLED_ShowString(68,7,"MQ-9:",8);

			OLED_ShowString(102,3,"PPb",16);
			OLED_ShowString(102,5,"PPb",16);
			
		PWR_BackupAccessCmd(ENABLE);
		temp=BKP_ReadBackupRegister(BKP_DR2);
		if(BKP_ReadBackupRegister(BKP_DR3)!=0x5555)
		{
			BKP_WriteBackupRegister(BKP_DR3,0x5555);
			co=80;
			yw=90;
		}
		else
		{
			co=(temp>>8)&0xff;
			yw=temp&0xff;
		}

	//OLED_DrawBMP(30,2,38,3,BMP2);
		
	 while(1)
	 {
		 Get_ADC_dat();
		 KEY_Scan();
		 shijian();
		 if(t>100)
		 {
		 OLED_ShowNum(77,3,moni[0],3,16);
		 OLED_ShowNum(77,5,moni[1],3,16);
			 t=0;
		 }

		 t++;
		 uu++;
		 
		 if(uu>65534)
		 {
			 y=0;
			 
			 uu=0;
		 }

		 if((moni[0]>co)|(moni[1]>yw))
		 {
			
				 if(y==0)
				 {
					 while(1)
					 {
						 GPIO_ResetBits(GPIOB,GPIO_Pin_9);
						 delay_ms(ti);
						 GPIO_SetBits(GPIOB,GPIO_Pin_9);
						 delay_ms(ti);
						 KEY_Scan();
						 Get_ADC_dat();
						 OLED_ShowNum(37,7,co,3,14);OLED_ShowNum(105,7,yw,3,14);
						 if((moni[0]>(co+20))|(moni[1]>(yw+20)))
							 {
								 ti=100;
							 }
							 else
							 {
								 ti=200;
							 }
						OLED_ShowNum(77,3,moni[0],3,16);
						OLED_ShowNum(77,5,moni[1],3,16);
					  if((moni[0]<co)&(moni[1]<yw))
						 {
							 break;
							 y=0;
						 }
						if(k1==1)
						 {
							 y=1;
							 k1=0;
							 break;
						 }
						}	 
				 }
			 } 
			 
		key_mode();			 
//******************************************
					 if((moni[0]<co)&(moni[1]<yw))
									 {
										 y=0;
									   k1=0;
										  
									 }
	k1=0;
	temp=co;
				temp<<=8;
				temp|=yw;

				PWR_BackupAccessCmd(ENABLE);
											 
				BKP_WriteBackupRegister(BKP_DR2,temp); //BKP_DR1~BKP_DR42

	}
}

一顿瞎写,想提意见的下载附件源码

运行效果:
STM32一氧化碳报警

源码下载地址:STM32的一氧化碳检测报警装置

相关标签: STM32 ADC-DMA