智能厨房环境监测系统:基于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通信:通过蓝牙连接手机,实现数据的实时获取,同时将数据上传至云端,方便燃气公司监控用户的用气情况。

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

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

前言: 为什么我首先想到要做厨房安全系统呢?厨房不仅是一个经常活动的场所,而且是家中危险系数最高的地方,您是否也有这样的担心,担心家人忘记关掉煤气、煲汤时忘记时间……一些小细节的疏忽大意,就可能危害到家庭的健康。 厨房智能监控系统介绍: 该系统可以监测厨房这样需要特别关注安全的地方。设备具备多种传感器接入,并且根据用途自由配置传感器的种类。设备接入云平台,可以通过智能手机实时了解当前状态,通过智能算法评估出安全系数,来做出针对性的防护措施。并且还可以手动作出修正处理。 智能厨房安全监控三部分: 家庭卫士通过多传感器对厨房温湿度、燃气、明火、烟雾进行监控; 通过算法对厨房各项环境数据进行综合评估分析,判断险情; 手机APP远程控制消防设备,处理危险 软件开发过程分析: 软件开发由三部分组成:下位机单片机程序、云端建立、以及手机端APP开发。用机智云做平台开发起来特别快,原因是有Gokit这样的开发板,并且有丰富底层代码范例的Dome程序。另外机智云建立云端数据的界面也特别友好,很适合入门者快速上手。还有最关键的是机智云有多个开源的手机APP的Dome源码提供参考,大大降低了开发门槛。 下位机程序 下位机程序中单片机和WiFi模块的通讯,以及WiFi模块接入以太网的规则,官方代码已经给的很完善了,初学者完全可以绕开这一段直接进行单片机开发,就和大家通常在普通STM32平台做功能一样的。 这里需要提出比较关键的一点是代码中的一个参数:product key。这是我们的设备连接到机智云平台哪一个云数据库的唯一判断依据。我们的开发板就是靠这个识别,来连接到你自己在机智云平台简历的数据接口的。这个product key是你建立属于自己的云端空间时机智云系统分配给你的,这个接下来要说的。我们做下位机单片机程序时,要把这个串码写进去。 官方代码把这个串码做在一个宏里,位于Procotol.h文件里: 为了大家直接在开发板上调试方便,我从官方Dome程序简单修改了一个程序,大家可以下载下来测试。 下位机单片程序参考代码详见附件内容。 注意:由于Gokit2开发板改版了,但是官方历程还未更新,RGB灯那里的代码需要做一些修改,具体位置是在hal_rgb_led.c文件里初始化RGB时需要把GPIOA0拉高: 云端建立 这需要在机智云官网上注册一个账号,然后就可以建立一个属于自己的云端数据空间了,简单四五个步骤就搞定,并且每一步都有指导说明,特别人性化,新手无痛入门! 1、首先要取一个云端设备名称,这个名称就是以后你手机APP上搜到的设备名称,比如我们这里叫做:智能厨房3。当搜到多个设备时,我们可以以设备的MAC地址区分不同设备。 2、然后我们要选择你所使用的开发板,并且选择一个云端范例模板。这里机智云简直就做的是傻瓜模式,我们完全可以利用模板轻松改一个自己的云端数据空间。当然也可以从新建议一个,不过新手建议从模板来改。 3、接下来我们要在模板中修改适合自己的数据,数据名称需要和前边下位机中给出的数据列表对应起来,名称需要完全一致,否则会导致对应不上。 我们开发板用到的设备数据包括如下,云端建立数据时,名称和类型要和下面结构体里定义的一样: 4,最后设置完成之后提交,机智云就会分配给你一个属于你自己的product key。我们需要把它更新到你的下位机单片机程序里。 手机app开发 这个因为有官方开源的Dome源码,所以我们只要有一些安卓或者ios开发基础,就可以轻松的从官方Dome中改一个出来。如果仅仅是学习测试使用,甚至可以直接用官方给的IOE Dome测试,因为这个Dome里没有都设备的product key进行筛选,所以凡是接入到机智云的Gokit开发板在局域网里都能被这个Dome APP找到并连接。 这里给一个智能厨房的APP,大家可以连接到Gokit开发板测试一下。因为是具体应用的APP,所以对product key做了筛选,只识别连入智能厨房云端的在线设备。所以测试时Gokit开发板需要使用前面代码里给的这个这个product key才可以。 APP测试中按如下对应关系参考: 1温湿度对应Gokit开发板上的温湿度传感器,显示温湿度; 2火焰传感器对应开发板上的红外对管传感器,用手遮挡时红外对管时,明火报警; 3换气扇操作对应开发板上的马达,打开换气扇按钮,马达开始正转; 4插座开关对应开发板的RGB LED中的红灯,打开插座开关按钮,红灯亮。 安卓手机客户端详见附件内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值