✌️✌️大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是基于《基于STM32的有毒气体监测设计》。

目录

一、系统功能

2.1、硬件清单

2.2、功能介绍(下面视频有详细讲解)

2.3、控制模式

二、演示视频和实物

三、系统设计框图

四、软件设计流程图

五、原理图

六、主程序

七、总结

八、资料内容 


一、系统功能

2.1、硬件清单

STM32F103C8T6 最小核心控制板 + WiFi 模块 + 硫化氢传感器 + 一氧化碳传感器 + LED 显示屏 + 按键模块(4 个按键) + 声光报警模块 + 后备电池

2.2、功能介绍(下面视频有详细讲解)

(1)STM32F103C8T6 最小核心控制板:作为系统核心,负责统筹各模块工作,处理传感器数据、执行模式控制逻辑及响应按键操作。
(2)WiFi 模块:用于连接远程云平台(机智云),实现手机 APP 与设备的远程通信,支持远程查看数据和控制报警。
(3)硫化氢传感器:用于实时监测环境中硫化氢气体的浓度。
(4)一氧化碳传感器:用于实时监测环境中一氧化碳气体的浓度。
(5)LED 显示屏:用来实时显示硫化氢浓度、一氧化碳浓度、各气体对应的阈值及系统工作模式。
(6)按键模块(4 个按键):第一个按键用于切换工作模式(远程模式 / 自动模式);后三个按键用于在自动模式下切换并调整硫化氢和一氧化碳的报警阈值。
(7)声光报警模块:用于气体浓度超阈值时的报警提示,在远程模式下可通过手机 APP 远程触发,自动模式下当浓度超阈值时自动触发。
(8)后备电池:为设备提供备用电源,保障设备在主电源中断时的持续工作。

2.3、控制模式

 (1)远程模式:上电可切换至此模式,通过手机 APP 连接机智云,实时查看硫化氢浓度和一氧化碳浓度数据,且可通过 APP 远程控制声光报警模块启动报警。
(2)自动模式:通过第一个按键切换至此模式,系统根据传感器检测值与设定阈值的对比自动执行动作,包括:
硫化氢浓度>设定阈值时,触发声光报警;
一氧化碳浓度>设定阈值时,触发声光报警;
支持通过后三个按键调整硫化氢和一氧化碳的报警阈值(可减小阈值以触发报警测试)。


二、演示视频和实物

基于STM32的有毒气体监测-(硫化氢+CO监测)


三、系统设计框图


四、软件设计流程图


五、原理图

 


六、主程序

#include "main.h"

uint8_t KeyNum;// 存储按键值
u8 t = 0;// 传感器读取时间间隔
u8 S_Mode; // 按键状态标志
u8 qingping = 1,S_YuZhi;   //清屏标志

// 定义传感器数据和阈值结构体变量
SensorDataAndThreshold sensorData;

// 初始化相关硬件和机智云
void System_Init()
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(9600);       // 串口初始化为9600
    delay_init();      // 延时函数初始化
    LED_Init();            // 初始化与LED连接的硬件接口
    DHT11_Init();
    Buzzer_Init();             // 外设初始化
    OLED_Init();
    Key_Init();
    AD_Init();
    MyRTC_Init();
    MY_Gizwits_Init();   // 机智云初始化
    Serial2_Init();   //串口2初始化(语音识别模块)
    // 初始化传感器阈值
    sensorData.COYu = 95;
    sensorData.LHQYu = 70;
}

int main(void)
{
    System_Init();

    while (1)
    {
        userHandle();    // 数据上传
        gizwitsHandle((dataPoint_t *)&currentDataPoint);   // 后台处理,必须放在while里

        ReadSensorData();
        HandleModes();
    }
}

// 读取传感器数据
void ReadSensorData()
{
    sensorData.CO = MQ_GetData(ADC_Channel_1);    
    sensorData.LHQ = MQ_GetData(ADC_Channel_4);  
}

// 处理不同模式
void HandleModes()
{
    KeyNum = Key_GetNum();
    if (KeyNum == 1 && DebounceKey(1))
    {
        qingping = 0;
        S_Mode = (S_Mode + 1) % 2;
    }
    switch (S_Mode)
    {
    case 0: // 远程模式
        if (qingping == 0)
        {
            OLED_Clear();
            qingping = 1;
        }
        TimeRead();
        ChuangGan();
        OLED_ShowChinese(1, 7, 49);
        OLED_ShowChinese(1, 8, 50);
        break;
    case 1: // 自动模式
        OLED_ShowChinese(1, 7, 51);
        OLED_ShowChinese(1, 8, 52);
        TimeRead();
        zhidong();
        ChuangGan();
        break;  
    }
}




// 自动模式函数
void zhidong()
{
    if (qingping == 0)
    {
        OLED_Clear();
        qingping = 1;
    }
    if ((sensorData.CO > sensorData.COYu) || (sensorData.LHQ > sensorData.LHQYu))
    {
        Buzzer_Turn();
    }
    else
    {
        Buzzer_OFF();
    }
		
		    if (KeyNum == 2 && DebounceKey(2))
    {
        S_YuZhi = (S_YuZhi + 1) % 2;
    }
    switch (S_YuZhi)
    {
    case 0:
        if (KeyNum == 3) sensorData.LHQYu++;
        if (KeyNum == 4) sensorData.LHQYu--;
        break;
    case 1:
        if (KeyNum == 3) sensorData.COYu++;
        if (KeyNum == 4) sensorData.COYu--;
        break;
    }
}






// 机智云初始化函数
void MY_Gizwits_Init(void)
{
    TIM3_Int_Init(9, 7199); // 1MS系统定时
    usart3_init(9600); // WIFI初始化
    memset((uint8_t *)&currentDataPoint, 0, sizeof(dataPoint_t)); // 设备状态结构体初始化
    gizwitsInit(); // 环形缓冲区初始化
    gizwitsSetMode(2);   // 设置模式
    userInit();
}

// 按键消抖函数
uint8_t DebounceKey(uint8_t key)
{
    delay_ms(20);
    return KeyNum == key;
}



// 读取时间函数
void TimeRead()
{
    MyRTC_ReadTime();
    OLED_ShowNum(1, 5, MyRTC_Time[3], 2);    // 时
    OLED_ShowString(1, 7, ":");
    OLED_ShowNum(1, 8, MyRTC_Time[4], 2);    // 分
    OLED_ShowString(1, 10, ":");
    OLED_ShowNum(1, 11, MyRTC_Time[5], 2);   // 秒
}


// 显示传感器信息
void ChuangGan()
{

    OLED_ShowString(2, 1, "H2S:");
    OLED_ShowNum(2, 5, sensorData.LHQ, 2);
    OLED_ShowNum(2,10, sensorData.LHQYu, 2);
	
    OLED_ShowString(3, 1, "CO:");
    OLED_ShowNum(3, 5, sensorData.CO, 2);	
    OLED_ShowNum(3, 10, sensorData.COYu, 2);

}

七、总结

本项目基于STM32F103C8T6开发有毒气体监测系统,通过硫化氢和一氧化碳传感器实时检测环境气体浓度。系统具备远程模式和自动模式两种控制方式,支持手机APP远程监控(通过WiFi连接机智云平台)和本地阈值报警功能。硬件包含传感器模块、LED显示屏、声光报警及后备电源等。软件采用模块化设计,实现数据采集、阈值调整、模式切换和报警触发等功能。该系统可有效监测有毒气体浓度,保障环境安全,具有实用性和智能化特点。

八、资料内容 

Logo

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

更多推荐