STM32项目开源:实验室消防预警控制系统(代码 + 原理图 + 仿真)

文章目录


一、前言

实物项目成品:

仿真项目成品:

哔哩哔哩开源视频链接(复制浏览器打开):

https://www.bilibili.com/video/BV124eS6qEWn/?vd_source=10da4d04d580bd6b34f7298120737c50

(资料分享见文末)

二、项目功能简介

【开源】STM32单片机实验室消防预警控制系统(代码 + 原理图 + 仿真)-编号:CY26045

功能介绍:

(1)OLED 屏幕实时显示温度、烟雾浓度、可燃气体浓度、火焰检测状态;

(2)独立按键可手动控制继电器通断,并设置各传感器报警阈值;

(3)当采集温度大于设定阈值,蜂鸣器声光报警,继电器驱动风扇开启;

(4)当烟雾浓度大于设定阈值,蜂鸣器声光报警,继电器驱动风扇开启;

(5)当可燃气体浓度大于设定阈值,蜂鸣器声光报警,继电器驱动风扇开启通风;

(6)火焰传感器检测到火焰,蜂鸣器声光报警,继电器启动水泵灭火;火焰报警优先级最高,即便温度、烟雾或可燃气体已经触发风扇,检测到火焰时水泵仍会开启;

(7)搭载 WiFi 模块,手机 APP 可查看全部监测数据、修改传感器阈值、远程控制继电器。

三、PCB设计

四、原理图设计

五、程序设计

代码如下():

c 复制代码
#include "sys.h"
#include "adc.h"
#include "delay.h"
#include "OLED.h"
#include "ds18b20.h"
#include "timer.h"
#include "gpio.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "usart1.h"
#include "stdint.h"

unsigned int  MQ=0;
short temperature=0;
unsigned int  yanwu; 
unsigned char setTempValue=35;       
unsigned int  set_yanwu=65;	
unsigned char set_MQ=60;       

bool mode = 0;               
bool shuaxin  = 0;
bool shanshuo = 0;

u8 buff[30];//参数显示缓存数组
u8 count;
u8 sendflag=0;
unsigned char setn=0;
//采集
void displayMQ(void)
{
	  MQ=(float)Get_Adc_Average(1,3)*3.3/0.4095; 
	  if(MQ>set_MQ && shanshuo)
		{
			OLED_ShowString(3,11,"     ");	
		}
		else
		{
			sprintf((char*)buff,"%4dppm ",MQ);
			OLED_ShowString(3,11,(char*)buff);	//显示可燃气体
		}
}
//采集烟雾
void displayyanwu(void)
{

	   yanwu=30*(Get_Adc_Average(0,3)*3.3/4095.0);
		if(yanwu>set_yanwu && shanshuo)
		{
				OLED_ShowString(2,11,"      ");
		}
		else
		{
			sprintf((char*)buff,"%2dppm ",yanwu);
			OLED_ShowString(2,11,(char*)buff);	//显示烟雾
			
		}
}

//采集温度
void displayTemperature(void)
{
		temperature=DS18B20_Get_Temp();
	  if(temperature>setTempValue*10 && shanshuo)
		{
			 OLED_ShowString(1,11,"     ");	
		}
		else
		{
			 if(temperature!=0)
			 {
				 sprintf((char*)buff,"%d.%dC",temperature/10,temperature%10);
				OLED_ShowString(1,11,(char*)buff);	
					
			 }
		}
}

void displaySetValue(void)
{
		if(setn == 1)
		 {
			 if(shanshuo)
			 {
					OLED_ShowString(2,11,"   ");
			 }
			 else
			 {
					sprintf((char*)buff,"%2dC",setTempValue);
					OLED_ShowString(2,11,(char*)buff);	
					sprintf((char*)buff,"%2dppm ",set_yanwu);
					OLED_ShowString(3,11,(char*)buff);	
					sprintf((char*)buff,"%2dppm ",set_MQ);
					OLED_ShowString(4,11,(char*)buff);	 	
			 }
			
		 }
		 if(setn == 2)
		 {
				if(shanshuo)
			 {
				OLED_ShowString(3,11,"  ");
			 }
			 else
			 {
				 sprintf((char*)buff,"%2dC",setTempValue);
				 
				OLED_ShowString(2,11,(char*)buff);	
				  sprintf((char*)buff,"%2dppm ",set_yanwu);
				OLED_ShowString(3,11,(char*)buff);	
				 sprintf((char*)buff,"%2dppm ",set_MQ);
				OLED_ShowString(4,11,(char*)buff);	
				 
				  
			 }
		 }
		 if(setn == 3)
		 {
				if(shanshuo)
			 {
				OLED_ShowString(4,11,"  ");
			 }
			 else
			 {
				sprintf((char*)buff,"%2dC",setTempValue);
				 
				OLED_ShowString(2,11,(char*)buff);	
				  sprintf((char*)buff,"%2dppm ",set_yanwu);
				OLED_ShowString(3,11,(char*)buff);	
				 sprintf((char*)buff,"%2dppm ",set_MQ);
				OLED_ShowString(4,11,(char*)buff);	
				 
				 
			 }
		 }
}

void keyscan(void)
{
	if(KEY1 == 0)
	{
	 	delay_ms(20);
		if(RELAY2==1)delay_ms(50);
		if(KEY1 == 0)
		{
		 	while(KEY1 == 0);
			if(setn == 0)
			 {
				  mode = !mode;
					 if(mode==0)
					  {
						  OLED_ShowChinese(4,4,19);
						  OLED_ShowChinese(4,5,20);
					  }
					  else 
					  {
						  RELAY1=0;  
						  RELAY2=0;  
						  OLED_ShowChinese(4,4,21);
						  OLED_ShowChinese(4,5,22);
					  }
			 }
		}
	}
	if(KEY2 == 0)
	{
	 	delay_ms(20);
		
		if(KEY2 == 0)
		{
			while(KEY2 == 0);
			 BEEP=0;
			if(mode==0)
			{
				setn ++;
				RELAY1=0;  
				RELAY2=0;  
				
			}
			if(setn == 1)
			{
				OLED_Clear();
			}
			if(mode==1)
			{
				RELAY1=~RELAY1;;
			}

				 OLED_ShowChinese(1,3,16);
				 OLED_ShowChinese(1,6,17);
				//显示"环境温度:"
				OLED_ShowChinese(2, 1, 0);
				OLED_ShowChinese(2, 2, 1);
				OLED_ShowChinese(2, 3, 2);
				OLED_ShowChinese(2, 4, 3);	
				OLED_ShowChar(2, 9, ':');
				
				//显示"烟雾浓度:"
				OLED_ShowChinese(3, 1, 23);
				OLED_ShowChinese(3, 2, 24);
				OLED_ShowChinese(3, 3, 25);
				OLED_ShowChinese(3, 4, 26);	
				OLED_ShowChar(3, 9, ':');


				OLED_ShowChinese(4, 1, 8);
				OLED_ShowChinese(4, 2, 9);	
				OLED_ShowChinese(4, 3, 10);
				OLED_ShowChinese(4, 4, 11);	
				OLED_ShowChar(4, 9, ':');
			 displaySetValue();
			 
		}
	}
	if(KEY3 == 0)//加
	{
		delay_ms(20);//
		
		if(KEY3 == 0 )
		{
			while(KEY3 == 0);
			if(setn == 0 && mode==1)
			 {
					RELAY2=~RELAY2;
			 }
			if(setn == 2)
			 {
					if(set_yanwu<99)set_yanwu++;
			 }
			 if(setn == 1)
			 {
					if(setTempValue<99)setTempValue++;
			 }
			 if(setn == 3)
			 {
				 if(set_MQ<99)set_MQ++;
			 }
			 displaySetValue();
		}
	}
	
	if(KEY4 == 0)//减
	{
		delay_ms(20);//
		if(RELAY2==1)delay_ms(50);
		if(KEY4 == 0 )
		{
			while(KEY4 == 0);
			if(setn == 0 && mode==1)
			 {
					//RELAY2=~RELAY2;
			 }
      if(setn == 2)
			 {
					if(set_yanwu>0)set_yanwu--;
			 }
			 if(setn == 1)
			 {
					if(setTempValue>0)setTempValue--;
			 }
			 if(setn == 3)
			 {
				 if(set_MQ>0)set_MQ--;
			 }
			 displaySetValue();
		}
	}
}

int main(void)
{	
	delay_init();
	NVIC_Configuration();
	delay_ms(500);
	Adc_Init();          
	KEY_GPIO_Init();
	DS18B20_Init();
	OLED_Init();				//OLED初始化
	OLED_Clear();		
	OLED_ShowString(2,1,"   Loading...   ");
	delay_ms(1000);
	OLED_Clear();
	//显示"环境温度:"
	OLED_ShowChinese(1, 1, 0);
	OLED_ShowChinese(1, 2, 1);
	OLED_ShowChinese(1, 3, 2);
	OLED_ShowChinese(1, 4, 3);	
	OLED_ShowChar(1, 9, ':');
	//显示"烟雾浓度"
	OLED_ShowChinese(2, 1, 23);
	OLED_ShowChinese(2, 2, 24);
	OLED_ShowChinese(2, 3, 25);
	OLED_ShowChinese(2, 4, 26);	
	OLED_ShowChar(2, 9, ':');
	//显示"光照强度:"
	OLED_ShowChinese(3, 1, 8);
	OLED_ShowChinese(3, 2, 9);	
	OLED_ShowChinese(3, 3, 10);
	OLED_ShowChinese(3, 4, 11);	
	OLED_ShowChar(3, 9, ':');		 		
	//显示"工作模式:"
	OLED_ShowChinese(4,1,14);
	OLED_ShowChinese(4,2,15);
	OLED_ShowChar(4, 5, ':');
		
	while(1)
	{  
		keyscan();
		if(setn == 0)
		{
			if(shuaxin == 1)
			{
				shuaxin = 0;
				displayMQ();   
				displayyanwu(); 
				displayTemperature(); 
				if(mode==0)   
				{
					if(flameFlag==0)
					{
						RELAY2=1;
					}
					else
					{
						RELAY2=0;
					}
					if(MQ>set_MQ||temperature>setTempValue*10||yanwu>set_yanwu)
					{
						RELAY1=1;
					}
					else RELAY1=0; 
					
					if(MQ>set_MQ||temperature>setTempValue*10||yanwu>set_yanwu|| flameFlag==0)
					{
						BEEP=~BEEP;
					}
					else BEEP=0;  
					OLED_ShowChinese(4,4,19);
					OLED_ShowChinese(4,5,20);
				}
				else
				{
					BEEP=0;
					OLED_ShowChinese(4,4,21);
					OLED_ShowChinese(4,5,22);
				}
			}
		}
		if(setn!=0)
		{
			displaySetValue();
		}
		delay_ms(10);
	}	
}

六、包含内容

七、资料分享

资料获取:请查看主页介绍搜索或观看开源视频获取

相关推荐
szxinmai主板定制专家1 小时前
NXP LS1046A 硬件方案: LS1046A+FPGA 异构加速架构实践
大数据·图像处理·人工智能·嵌入式硬件·fpga开发
从零开始的嵌入式之旅2 小时前
day46
linux·arm开发·笔记·嵌入式硬件
老当益壮梁奶奶2 小时前
ARM汇编学习笔记(四):i.MX6ULL裸机开发:从汇编点灯到C语言BSP工程管理
c语言·arm开发·单片机·嵌入式硬件·51单片机
m4Rk_2 小时前
【论文阅读】Agent 记忆机制(76):SEEM——从碎片检索到完整事件重建
论文阅读·人工智能·学习·开源·github
魔众2 小时前
3 步让 LinkAndroid 投屏用电脑键盘打中文
开源
祖力552 小时前
ARM中断(IMX6ULL中断、GIC通用中断控制器)
嵌入式硬件·arm·imx6ull·中断·gic·通用中断控制器
企业数字化笔记2 小时前
低代码、开源系统、定制开发怎么选?用资产管理案例做技术取舍
低代码·开源
亥时科技3 小时前
无人机和监控视频,真能一次性打通吗?
开源·无人机·ai巡检
Casbin开源社区3 小时前
OpenAgent 详解:单二进制自托管 AI Agent 平台,30+ 模型接入、RAG 知识库、MCP 工具调用与 Casbin 工具权限
人工智能·golang·开源