基于STM32单片机的火灾烟雾报警器蓝牙通信仿真

仿真图:

在这里插入图片描述

功能简介:

单片机采用STM32F103(由于STM32仿真电路非常卡,因此没有绘制复位和晶振电路)
显示器采用LCD1602用于显示该项目的参数信息
具有多个功能按键,分别是设置、加、减和确认等功能
具有LED和蜂鸣器组成的声光报警电路
通过滑动变阻器模拟MQ-2传感器
继电器驱动小风扇模拟排气过程
通过串口模块来模拟演示蓝牙上报的过程

芯片/模块的特点:

MQ-2简介:
MQ-2是一种气体传感器模块,用于检测和监测空气中的各种有害气体和可燃气体。它可以检测到多种气体,包括烟雾、甲烷、丙烷、液化石油气(LPG)、氢气、酒精和一氧化碳等。

MQ-2传感器模块基于半导体气敏电阻原理工作。当目标气体进入传感器并与其敏感材料发生化学反应时,电阻值会发生变化。通过测量电阻值的变化,就可以判断目标气体的浓度。

MQ-2传感器模块通常由传感器本体和一个集成的电路板组成。电路板上包含放大器、比较器和AD转换器等电子元件,可以将传感器所产生的模拟信号转换为数字信号,并输出给微控制器或其他设备进行处理。

使用MQ-2传感器模块可以实现以下应用:

燃气泄露检测:可以将MQ-2模块安装在家庭或工业环境中,用于检测可燃气体(如甲烷、丙烷等)的泄漏,以及预防燃气事故的发生。

烟雾检测:可以将MQ-2模块应用于火灾报警系统中,用于检测空气中的烟雾,及时发出警报并采取适当的应对措施。

安全检测:MQ-2模块还可以用于监测一氧化碳等有害气体的浓度,从而保护人们免受有害气体的危害。

主程序:

#include "led.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"
#include <stdio.h>
#include "bsp_lcd1602.h"
#include "adc.h"
#include "bsp_clkconfig.h"

#define BASICS_VAL 15      // 用于数据转换的基础值
#define DEFAULT_SET_VAL 20 // 第一次下载默认设置值

char dis0[17]; // 暂存数组
char dis1[17]; // 暂存数组

unsigned int sensorVal = 0; // 当前采集值
unsigned int adcx;

unsigned int setNum = 20;  // 设置值
unsigned char setMode = 0; // 默认手动模式
unsigned char disFlag = 0; // 显示标志
unsigned char timeDelay = 0; // 延时

void CheckKey(void);

int main(void)
{

    // 使用HSI,SYSCLK = 4M * RCC_PLLMul_x, x:[2,3,...16],最高是64MH
    HSI_SetSysClock(RCC_PLLMul_2); // 使用内部8MHz晶振,并设置PLL输出为8MHz 

    TIM3_Int_Init(50000-1, 8-1); // 定时器初始化

    BUZZER_Init(); // 初始化接口
    KEY_Init();

    DelayMs(200);

    Adc_Init(); // 初始化ad转换
    UART_Init(9600); // 串口初始化为9600
    
    BUZZER = 1; // 蜂鸣器报警一下
    RELAY = 1;
    DelayMs(200);
    BUZZER = 0; // 蜂鸣器 停止报警
    RELAY = 0;

    LCD_GPIO_Init(); // 液晶接口初始化
    LCD_Init();      // 液晶配置初始化
    DelayMs(20);

    while (1)
    {
        CheckKey();

        if (disFlag == 1) // 定时读取标志
        {
            disFlag = 0; // 清空标志

            adcx = Get_Adc_Average(ADC_Channel_8, 5);                // 读取ad转换值 5次求平均
            sensorVal = ((float)adcx * 3.3 / 4096) * 2 * 99.0 / 5.0; // 采集值  *2表示电阻分压	输出最大5v 但是要转化为最大3.3v
            if (sensorVal < BASICS_VAL)
                sensorVal = 0; // 过滤传感器本身自带电压
            else
            {
                sensorVal = (sensorVal - BASICS_VAL) * 99 / (99 - BASICS_VAL); // 将30-99值转化为0-99的值
            }

            sprintf(dis0, "nowValue:%3d%% ", sensorVal); // 打印
            LCD_DispStr(0, 0, dis0);                 // 显示
            printf(dis0);
            printf("\r\n");

            if (setMode)
            {
                sprintf(dis1, "setValue:%3d%%<", setNum); // 打印
            }
            else
            {
                sprintf(dis1, "setValue:%3d%% ", setNum);
            }
            LCD_DispStr(0, 1, dis1); // 显示
            printf(dis1);
            printf("\r\n");

            if (sensorVal > setNum) // 采集值 和 设置值 对比
            {
                if (timeDelay < 50) //50*100ms
                {
                    timeDelay++; //持续5s检测到超标
                }
                else
                {
                    BUZZER = !BUZZER;
                    RELAY = 1;
                }
            } // 蜂鸣器报警
            else
            {
                timeDelay = 0;
                BUZZER = 0;
                RELAY = 0;
            } // 不报警
        }
    }
}

void CheckKey(void)
{
    if (!KEY_SET) //设置键
    {
        DelayMs(20); //延时去抖
        if(!KEY_SET) //再次确认按键按下
        {
            setMode = 1; // 设置状态
        }
        while(!KEY_SET);
    }

    if (!KEY_ADD) //加键
    {
        DelayMs(180); //延时去抖
        if(!KEY_ADD) //再次确认按键按下
        {
            if (setMode)
            { // 设置条件下
                if (setNum < 99)
                {
                    setNum = setNum + 1;
                } //+1
            }
        }
        // while(!KEY_ADD);
    }

    if (!KEY_SUB) //减键
    {
        DelayMs(180); //延时去抖
        if(!KEY_SUB) //再次确认按键按下
        {
            if (setMode)
            { // 设置条件下
                if (setNum > 0)
                {
                    setNum = setNum - 1;
                }
            }
        }
        // while(!KEY_SUB);
    }

    if (!KEY_ENTER) //确认键
    {
        DelayMs(20); //延时去抖
        if(!KEY_ENTER) //再次确认按键按下
        {
            setMode = 0; // 取消设置
        }
        while(!KEY_ENTER);
    }
}

设计文件:

链接:https://pan.baidu.com/s/1KsZhezNQJQehSr6pBG93CA?pwd=eqpm

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的MQ2烟雾传感器的STM32F103代码: ```c #include "stm32f10x.h" #define MQ2_ADC_CHANNEL 1 #define MQ2_ADC_CLK RCC_APB2Periph_ADC1 #define MQ2_ADC_PORT GPIOA #define MQ2_ADC_PIN GPIO_Pin_1 ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; void ADC_Config(void) { RCC_APB2PeriphClockCmd(MQ2_ADC_CLK, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); GPIO_InitStructure.GPIO_Pin = MQ2_ADC_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(MQ2_ADC_PORT, &GPIO_InitStructure); ADC_RegularChannelConfig(ADC1, MQ2_ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5); } int main(void) { uint16_t adc_value; ADC_Config(); while(1) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); adc_value = ADC_GetConversionValue(ADC1); // Do something with the adc_value } } ``` 这个代码中,我们使用了STM32的ADC模块来读取MQ2烟雾传感器的模拟输出值。具体来说,我们设置了ADC通道1对应的GPIO口为模拟输入,然后使用了ADC的轮询模式来读取模拟值,并将其存储在一个`uint16_t`类型的变量中。最后,我们可以根据读到的值来判断烟雾的浓度等级,或者将其发送到其他设备进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值