一、项目概述
随着智能家居技术的发展,厨房环境监测系统作为家庭安全的重要组成部分,越来越受到关注。本项目以STM32F103C8T6为核心,开发了一套集气体检测、厨房环境监测、语音定时阀门、危险报警及物联网功能为一体的智能系统。
项目目标与用途
该系统的主要目标是实时监测厨房环境中气体的浓度、温度、湿度等参数,并通过语音命令控制阀门,保障家庭的安全。通过蓝牙与手机连接,用户可以获取实时信息,随时掌握厨房环境的变化。此外,系统具备自动切换电源功能,确保在断电情况下也能持续工作,为用户提供了更大的便利和安全保障。
解决的问题与价值
-
气体泄漏监测:实时检测厨房内可燃气体浓度,防止气体泄漏引发的安全事故。
-
环境监测:监测温度和湿度,确保厨房环境的舒适与健康。
-
语音控制:通过语音指令控制阀门,方便不同年龄段用户使用。
-
数据上传:将气体使用情况上传至云端,燃气公司可以实时了解用户的气体使用情况,提升服务质量。
二、系统架构
系统架构设计
本项目采用STM32F103C8T6作为主控芯片,结合多种传感器和通信模块,实现各项功能。系统架构如图1所示,主要包括以下组件:
-
传感器模块:用于检测气体浓度、温度和湿度。
-
控制模块:实现语音识别和阀门控制。
-
显示模块:通过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库等
安装步骤
-
安装开发环境:
-
下载并安装Keil uVision或STM32CubeIDE。
-
配置ST-Link驱动,以便于程序烧录。
-
-
配置库文件:
- 在IDE中导入所需的库文件,如STM32 HAL库和OLED显示库。
-
编译器设置:
- 设置编译器选项,确保支持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显示屏、语音命令和蓝牙交互,为用户提供了友好的操作界面。
项目主要功能:
-
气体检测:实时监测厨房中的可燃气体浓度,通过MQ-2传感器实现。
-
温湿度监测:使用DHT11传感器监测环境的温度与湿度。
-
语音控制:用户可通过语音命令控制阀门的开关,提高使用便利性。
-
数据展示:OLED屏幕实时显示气体浓度、温度和湿度等信息。
-
蓝牙和GPRS通信:通过蓝牙连接手机,实现数据的实时获取,同时将数据上传至云端,方便燃气公司监控用户的用气情况。
实现过程:
-
通过分模块实现的方式,使得每个功能模块相互独立,便于后续的维护和扩展。
-
详细的代码注释和解析,确保代码逻辑清晰,便于理解和修改。