Bootstrap

智能厨房环境监测系统:基于STM32F103C8T6的气体检测、语音控制与物联网技术栈(MQ-2、DHT11、HC-05、SIM800L、OLED)

一、项目概述

随着智能家居技术的发展,厨房环境监测系统作为家庭安全的重要组成部分,越来越受到关注。本项目以STM32F103C8T6为核心,开发了一套集气体检测、厨房环境监测、语音定时阀门、危险报警及物联网功能为一体的智能系统。

项目目标与用途

该系统的主要目标是实时监测厨房环境中气体的浓度、温度、湿度等参数,并通过语音命令控制阀门,保障家庭的安全。通过蓝牙与手机连接,用户可以获取实时信息,随时掌握厨房环境的变化。此外,系统具备自动切换电源功能,确保在断电情况下也能持续工作,为用户提供了更大的便利和安全保障。

解决的问题与价值

  • 气体泄漏监测:实时检测厨房内可燃气体浓度,防止气体泄漏引发的安全事故。

  • 环境监测:监测温度和湿度,确保厨房环境的舒适与健康。

  • 语音控制:通过语音指令控制阀门,方便不同年龄段用户使用。

  • 数据上传:将气体使用情况上传至云端,燃气公司可以实时了解用户的气体使用情况,提升服务质量。

二、系统架构

系统架构设计

本项目采用STM32F103C8T6作为主控芯片,结合多种传感器和通信模块,实现各项功能。系统架构如图1所示,主要包括以下组件:

  • 传感器模块:用于检测气体浓度、温度和湿度。

  • 控制模块:实现语音识别和阀门控制。

  • 显示模块:通过OLED屏幕显示实时数据。

  • 通信模块:实现蓝牙和GPRS网络的数据传输。

STM32F103C8T6
气体传感器
温湿度传感器
语音识别模块
OLED显示屏
蓝牙模块
GPRS模块
电源管理模块
报警指示灯

组件选择

  • 单片机:STM32F103C8T6,具备较高的性能和丰富的接口。

  • 传感器:MQ-2气体传感器(检测可燃气体),DHT11温湿度传感器。

  • 通信模块:HC-05蓝牙模块和SIM800L GPRS模块。

  • 显示模块:0.96寸OLED显示屏。

三、环境搭建

硬件环境

  • 开发板:STM32F103C8T6开发板

  • 传感器:MQ-2、DHT11

  • 显示屏:0.96寸OLED

  • 模块:HC-05、SIM800L

  • 电源:锂电池与市电供电切换模块

软件环境

  • IDE:Keil uVision或STM32CubeIDE

  • 编程语言:C/C++

  • 库:STM32 HAL库、Adafruit GFX库、Adafruit SSD1306库等

安装步骤

  1. 安装开发环境:

    • 下载并安装Keil uVision或STM32CubeIDE。

    • 配置ST-Link驱动,以便于程序烧录。

  2. 配置库文件:

    • 在IDE中导入所需的库文件,如STM32 HAL库和OLED显示库。
  3. 编译器设置:

    • 设置编译器选项,确保支持C99标准。

注意事项

  • 确保所有硬件连接正确,避免短路。

  • 在调试过程中,保持良好的散热,避免芯片过热。

四、代码实现

在本项目中,我们将基于系统架构逐步实现各功能模块。以下是关键代码示例,详细介绍每个模块的实现过程,包括气体检测、温湿度监测、语音控制、显示模块、蓝牙通信及GPRS通信等。

1. 气体检测模块

1.1 代码实现

我们使用MQ-2气体传感器来检测厨房环境中的可燃气体浓度。以下是气体传感器的初始化和读取代码:

#include "MQ2.h"

// MQ-2传感器引脚
#define GAS_SENSOR_PIN GPIO_PIN_0 // 假设传感器连接到GPIO0

float gasValue;

// 初始化气体传感器
void GasSensor_Init() {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    // 配置GPIO引脚
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GAS_SENSOR_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// 读取气体浓度
void GasSensor_Read() {
    // 假设使用ADC读取传感器值
    uint32_t adcValue = HAL_ADC_GetValue(&hadc1);
    gasValue = (adcValue / 4095.0) * 5.0; // 将ADC值转换为电压(0-5V)
    
    // 判断气体浓度
    if (gasValue > THRESHOLD) {
        // 触发报警
        AlertUser();
    }
}

// 用户报警
void AlertUser() {
    // 发送报警信号或通知用户
}
1.2 代码解析
  • GPIO配置:我们首先配置GPIO引脚,确保传感器能够正常工作。

  • ADC读取:通过ADC读取传感器输出的电压,并将其转换为实际的气体浓度值。

  • 报警机制:当气体浓度超过设定阈值时,调用AlertUser函数进行报警。

2. 温湿度监测模块

2.1 代码实现

我们使用DHT11温湿度传感器来获取环境的温度和湿度。以下是相应的代码实现:

#include "DHT11.h"

float temperature;
float humidity;

// 初始化DHT11传感器
void DHT11_Init() {
    // 初始化DHT11所需的GPIO引脚
    // 具体实现根据DHT11库的要求
}

// 读取温湿度数据
void DHT11_Read() {
    DHT11_ReadData(&temperature, &humidity);
    
    // 处理读取的数据
    if(humidity > 80) {
        // 如果湿度过高,触发报警
        AlertHumidity();
    }
}

// 湿度报警
void AlertHumidity() {
    // 发送湿度报警信号
}
2.2 代码解析
  • 温湿度读取:使用DHT11_ReadData函数读取温湿度数据。

  • 数据处理:根据读取的湿度值判断是否需要触发湿度报警。

3. 语音控制模块

3.1 代码实现

我们使用语音识别模块实现对阀门的控制。以下是简化的代码示例:

#include "VoiceRecognition.h"

// 语音控制初始化
void VoiceControl_Init() {
    // 初始化语音识别模块
}

// 处理语音命令
void ProcessVoiceCommand() {
    char command\[10\];
    if (GetVoiceCommand(command)) {
        if (strcmp(command, "OPEN") == 0) {
            OpenValve();
        } else if (strcmp(command, "CLOSE") == 0) {
            CloseValve();
        }
    }
}

// 打开阀门
void OpenValve() {
    HAL\_GPIO\_WritePin(GPIOB, VALVE\_PIN, GPIO\_PIN_SET); // 打开阀门
}

// 关闭阀门
void CloseValve() {
    HAL\_GPIO\_WritePin(GPIOB, VALVE\_PIN, GPIO\_PIN_RESET); // 关闭阀门
}

4. 显示模块

4.1 代码实现

我们使用0.96寸OLED显示屏来实时显示环境参数(如气体浓度、温湿度等)。以下是实现代码:

#include "OLED.h"

void OLED_Init() {
    // 初始化OLED显示屏
    SSD1306_Init();
    SSD1306_Clear();
}

void OLED_Display(float gasValue, float temperature, float humidity) {
    // 清空显示屏
    SSD1306_Clear();
    
    // 设置光标位置并显示数据
    SSD1306_SetCursor(0, 0);
    SSD1306_Printf("Gas: %.2f ppm", gasValue);
    
    SSD1306_SetCursor(0, 10);
    SSD1306_Printf("Temp: %.1f C", temperature);
    
    SSD1306_SetCursor(0, 20);
    SSD1306_Printf("Humidity: %.1f %%", humidity);
    
    // 刷新显示
    SSD1306_UpdateScreen();
}
4.2 代码解析
  • 初始化:使用SSD1306_Init函数初始化OLED显示屏,并清空显示内容。

  • 显示数据:OLED_Display函数设置光标位置并将气体浓度、温度和湿度等信息格式化后打印到屏幕上。最后,通过SSD1306_UpdateScreen()刷新显示内容。

5. 蓝牙通信模块

5.1 代码实现

我们使用HC-05蓝牙模块与手机进行连接,实时发送和接收数据。以下是代码示例:

#include "Bluetooth.h"

void Bluetooth_Init() {
    // 初始化蓝牙模块
    HAL_UART_Init(&huart1); // 假设使用USART1
}

void Bluetooth_SendData(float gasValue, float temperature, float humidity) {
    char buffer[100];
    sprintf(buffer, "Gas: %.2f ppm, Temp: %.1f C, Humidity: %.1f %%\n", gasValue, temperature, humidity);
    HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
}

void Bluetooth_ReceiveData() {
    char command[20];
    HAL_UART_Receive(&huart1, (uint8_t *)command, sizeof(command), HAL_MAX_DELAY);
    
    // 处理接收到的命令
    ProcessBluetoothCommand(command);
}

void ProcessBluetoothCommand(char *command) {
    if (strcmp(command, "GET_STATUS") == 0) {
        Bluetooth_SendData(gasValue, temperature, humidity);
    }
}
5.2 代码解析
  • 初始化:Bluetooth_Init函数初始化蓝牙模块,配置UART接口。

  • 发送数据:Bluetooth_SendData函数将气体浓度、温度和湿度信息发送到连接的手机。

  • 接收数据:Bluetooth_ReceiveData函数接收来自手机的命令,并通过ProcessBluetoothCommand函数处理这些命令。例如,如果收到“GET_STATUS”命令,则发送当前状态数据。

6. GPRS通信模块

6.1 代码实现

使用SIM800L模块通过GPRS网络发送数据到云端。以下是相应的代码示例:

#include "GPRS.h"

void GPRS_Init() {
    // 初始化GPRS模块
    HAL_UART_Init(&huart2); // 假设使用USART2
}

void GPRS_SendData(float gasValue, float temperature, float humidity) {
    char httpRequest[200];
    sprintf(httpRequest, "GET /update?gas=%.2f&temp=%.1f&humidity=%.1f HTTP/1.1\r\nHost: yourserver.com\r\n\r\n", gasValue, temperature, humidity);
    
    HAL_UART_Transmit(&huart2, (uint8_t *)httpRequest, strlen(httpRequest), HAL_MAX_DELAY);
    
    // 等待响应
    char response[100];
    HAL_UART_Receive(&huart2, (uint8_t *)response, sizeof(response), HAL_MAX_DELAY);
    
    // 处理响应
}
6.2 代码解析
  • 初始化:GPRS_Init函数初始化GPRS模块,配置UART接口以进行数据通信。

  • 发送数据:GPRS_SendData函数构建HTTP GET请求,将气体浓度、温度和湿度数据发送到指定的服务器。然后,等待服务器的响应进行处理。

7. 主循环

在主循环中,我们将定期读取传感器数据,更新OLED显示屏,通过蓝牙和GPRS模块发送数据,并处理用户的语音命令和蓝牙命令。以下是主循环的代码实现:

#include "main.h"

int main(void) {
    // 系统初始化
    HAL_Init();
    SystemClock_Config();
    
    // 初始化各模块
    GasSensor_Init();
    DHT11_Init();
    OLED_Init();
    Bluetooth_Init();
    GPRS_Init();
    
    // 变量定义
    float gasValue = 0.0;
    float temperature = 0.0;
    float humidity = 0.0;

    while (1) {
        // 读取气体传感器数据
        GasSensor_Read();
        // 读取温湿度数据
        DHT11_Read();
        
        // 更新显示屏
        OLED_Display(gasValue, temperature, humidity);
        
        // 发送数据到蓝牙
        Bluetooth_SendData(gasValue, temperature, humidity);
        
        // 发送数据到GPRS
        GPRS_SendData(gasValue, temperature, humidity);
        
        // 处理蓝牙命令
        Bluetooth_ReceiveData();
        
        // 处理语音命令
        ProcessVoiceCommand();
        
        // 添加适当的延迟以避免过于频繁的读取
        HAL_Delay(2000); // 每2秒更新一次数据
    }
}

7.1 代码解析

  • 系统初始化:首先调用HAL_Init()SystemClock_Config()函数进行系统初始化。然后初始化各个模块,包括气体传感器、DHT11传感器、OLED显示屏、蓝牙和GPRS模块。

  • 变量定义:定义用于存储气体浓度、温度和湿度的变量。

  • 主循环:在while(1)循环中:

  • 调用GasSensor_Read()DHT11_Read()函数获取最新的气体和环境数据。

  • 使用OLED_Display()函数更新OLED显示屏,以便用户能够实时查看当前状态。

  • 调用Bluetooth_SendData()GPRS_SendData()函数,将最新数据发送到蓝牙设备和云服务器。

  • 通过Bluetooth_ReceiveData()函数处理来自蓝牙的命令。

  • 调用ProcessVoiceCommand()函数处理用户的语音命令,控制阀门的开关等。

  • 使用HAL_Delay(2000)函数添加延迟,以避免过于频繁的数据读取。

8. 项目总结

在本项目中,我们基于STM32F103C8T6开发了一款智能厨房环境监测系统,集成了气体检测、温湿度监测、语音控制、蓝牙和GPRS通信等多种功能。系统通过OLED显示屏、语音命令和蓝牙交互,为用户提供了友好的操作界面。

项目主要功能:
  1. 气体检测:实时监测厨房中的可燃气体浓度,通过MQ-2传感器实现。

  2. 温湿度监测:使用DHT11传感器监测环境的温度与湿度。

  3. 语音控制:用户可通过语音命令控制阀门的开关,提高使用便利性。

  4. 数据展示:OLED屏幕实时显示气体浓度、温度和湿度等信息。

  5. 蓝牙和GPRS通信:通过蓝牙连接手机,实现数据的实时获取,同时将数据上传至云端,方便燃气公司监控用户的用气情况。

实现过程:
  • 通过分模块实现的方式,使得每个功能模块相互独立,便于后续的维护和扩展。

  • 详细的代码注释和解析,确保代码逻辑清晰,便于理解和修改。

;