一、前言

实物项目成品在这里插入图片描述
仿真项目成品:

在这里插入图片描述
哔哩哔哩开源视频链接(复制浏览器打开):
https://www.bilibili.com/video/BV17fbi66Es9/?
(资料分享见文末)

二、项目功能简介

功能:
1、STM32 为主控核心,完成系统数据处理。
2、OLED 屏幕显示烟雾浓度、环境温度、明火状态。
3、MQ‑4 检测烟雾/天然气/甲烷;DS18B20 采集环境温度;火焰传感器检测厨房明火。
4、三 个按键实现参数设置、数值加、数值减,可配置温度、气体浓度报警上限。
5、温度超限:屏幕闪烁,风扇启动降温。
6、气体浓度超限:屏幕闪烁,风扇排气,舵机关闭燃气通道。
7、检测到明火:屏幕显示火焰标识,水泵模拟灭火,舵机关闭燃气通道,蜂鸣器声光报警。
8、ESP8266‑WiFi 上传数据至手机端,手机可查看温度、烟雾浓度,出现明火显示火焰图标。
9、手机端远程修改温度、气体浓度报警阈值。

三、PCB硬件设计

在这里插入图片描述

四、原理图设计

在这里插入图片描述

五、程序设计

部分代码如下:

#include "sys.h"
#include "delay.h"
#include "adc.h"
#include "gpio.h"
#include "OLED_I2C.h"
#include "ds18b20.h"
#include "timer.h"
#include "usart1.h"
#include "esp8266.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

int main(void)
{
		delay_init();	           //延时函数初始化	 
    NVIC_Configuration();	   //中断优先级配置
	  I2C_Configuration();     //IIC初始化
	  delay_ms(200); 
	  OLED_Init();             //OLED液晶初始化
	  OLED_CLS();              //清屏
	  OLED_ShowStr(0, 2, "   loading...   ", 2,0);//显示加载中
    ESP8266_Init();       //ESP8266初始化
	  Adc_Init();           //adc初始化
		KEY_GPIO_Init();        //按键引脚初始化
	  MOTOR_GPIO_Init();     //舵机初始化
	  DS18B20_GPIO_Init();    //温度初始化
	  DS18B20_Init();         //初始化显示
	  OLED_CLS();              //清屏
	  displayInitInterface(); //显示初始界面
	  TIM3_Init(99,71);   //定时器初始化,定时100us
		//Tout = ((arr+1)*(psc+1))/Tclk ; 
		//Tclk:定时器输入频率(单位MHZ)
		//Tout:定时器溢出时间(单位us)
		while(1)
		{ 
			   keyscan();  //按键扫描
			   if(setn == 0)
				 {
					   if(shuaxin == 1)   //大概300ms刷新一次数据
						 {
								 Get_Temperature();   //获取温度
								 Get_Smoke();         //获取烟雾
							  
							   shuaxin = 0;
						 }
						 if(FLAME == 0)          //检测到火焰
						 {
								delay_ms(10);
								if(FLAME == 0)
								{
										if(flameFlag == 0)
										{
												OLED_DrawBMP(88,4,120,8,(unsigned char *)BMP);  //显示火焰图片
										}
										flameFlag = 1;
										RELAY = 1;  //检测到有火,开启水泵
								}
						 }
						 else
						 {
								if(flameFlag == 1)
								{
										OLED_ShowStr(88, 4, "    ", 2,0);
										OLED_ShowStr(88, 6, "    ", 2,0);
								}
								flameFlag = 0;
								RELAY = 0;  //关闭水泵
						 }
						 if(temperature>=setTempValue || smoke>=setSmokeValue || flameFlag)BEEP=1;else BEEP=0;  //检测到温度烟雾超标火焰蜂鸣器报警
						 if(temperature>=setTempValue || smoke>=setSmokeValue)FAN=1;else FAN=0;      //烟雾温度超标都开启风扇
						 if(smoke>=setSmokeValue || flameFlag)PWM=15;else PWM=5;                    //烟雾超标或者是检测到火焰,舵机动作,模拟关闭阀门
			   }
				 UsartSendReceiveData();
			   delay_ms(10);
		}
}

void TIM3_IRQHandler(void)//定时器3中断服务程序,用于记录时间
{ 
	  static u16 timeCount1 = 0;
	  static u16 timeCount2 = 0;
	  static u16 timeCount3 = 0;
	
		if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{ 
				TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除中断标志位  
				
				timeCount1 ++;
				if(timeCount1<=PWM)MOTOR=1; else MOTOR=0;
				if(timeCount1>=200)   //20ms一周期
				{
						timeCount1 = 0;
				}
				timeCount2++;
				if(timeCount2 >= 3000) //300ms
				{
						timeCount2 = 0;
					  shanshuo = !shanshuo;
					  shuaxin = 1;
				}
				timeCount3++;
				if(timeCount3 >= 10000) //1000ms
				{
						timeCount3 = 0;
					  sendFlag = 1;
				}
	  }
}

六、包含内容

在这里插入图片描述

七、资料分享

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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐