STM32一氧化碳报警
程序员文章站
2024-02-24 23:28:40
...
冬天家里需要生火,难免会有一氧化碳产生,为了安全做一个简单的装置
某宝买了几个探头
也不知道准确不准确
开始制作
没有电路图自己飞线接的。。。
使用ADC1的通道0、1;采集QM2或QM9的模拟信号 PA0,PA1
模拟I2C显示0.96寸液晶显示PA9,PA10
蜂鸣器使用低电平有效PB8
按键全部是低有效
大按键PB15
小按键PB4、PB5、PB6
探头供电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的一氧化碳检测报警装置