引言
本项目设计了一个基于STM32的多路火灾报警系统,能够同时监控多个房间或区域的温度、烟雾浓度等指标。当检测到某一区域的温度或烟雾浓度超过预设阈值时,系统将自动触发报警,并通过蜂鸣器、LED指示灯和显示屏进行报警提示。该系统广泛应用于智能建筑、家庭防火、工厂安全监控等场景。
环境准备
1. 硬件设备
- STM32F103C8T6 开发板(或其他 STM32 系列)
- 温度传感器(如 DS18B20,用于温度检测)
- 烟雾传感器(如 MQ-2,用于检测烟雾浓度)
- 蜂鸣器(用于报警提示)
- RGB LED(用于指示报警状态)
- OLED 显示屏(用于显示区域状态)
- USB-TTL 串口调试工具
- 电阻、杜邦线、面包板等基础电子元件
2. 软件工具
- STM32CubeMX:用于初始化 STM32 外设。
- Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
- ST-Link 驱动程序:用于下载程序到 STM32。
项目实现
1. 硬件连接
- 温度传感器连接:将 DS18B20 的数据引脚连接到 STM32 的 GPIO(如 PA0),并使用 4.7kΩ 上拉电阻用于稳定数据通信。
- 烟雾传感器连接:将 MQ-2 模块的模拟输出引脚连接到 STM32 的 ADC 输入引脚(如 PA1),用于检测烟雾浓度。
- 蜂鸣器连接:将蜂鸣器的控制引脚连接到 STM32 的 GPIO(如 PA2),用于触发报警。
- RGB LED 连接:将 RGB LED 的 R、G、B 引脚分别连接到 STM32 的 GPIO(如 PA3、PA4、PA5),用于指示不同的报警状态。
- OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示各个区域的状态。
- 其他传感器(如多个房间的温度传感器和烟雾传感器),可以通过扩展 GPIO 和 ADC 引脚进行连接。
2. STM32CubeMX 配置
- 打开 STM32CubeMX,选择你的开发板型号。
- 配置系统时钟为 HSI,确保系统稳定运行。
- 配置 GPIO 引脚用于蜂鸣器、RGB LED 和传感器。
- 配置 I2C 用于与 OLED 显示屏通信。
- 配置 ADC 用于读取烟雾传感器的模拟输出信号。
- 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序
在生成的项目基础上,编写火灾报警逻辑、传感器数据采集、报警提示和显示状态的代码。以下是多路火灾报警系统的基本代码示例:
#include "stm32f1xx_hal.h"
#include "ds18b20.h"
#include "oled.h"
#include "adc.h"// 定义报警阈值
#define TEMP_THRESHOLD 50.0 // 温度报警阈值,50°C
#define SMOKE_THRESHOLD 300 // 烟雾浓度报警阈值
#define BUZZER_PIN GPIO_PIN_2 // 蜂鸣器引脚
#define RGB_LED_RED_PIN GPIO_PIN_3
#define RGB_LED_GREEN_PIN GPIO_PIN_4
#define RGB_LED_BLUE_PIN GPIO_PIN_5// 函数声明
void System_Init(void);
void Check_Alarm(void);
float Read_Temperature(void);
uint16_t Read_Smoke(void);
void Trigger_Alarm(uint8_t alarm_type);
void Clear_Alarm(void);
void Display_Status(float temp, uint16_t smoke);// 全局变量
float temperature = 0;
uint16_t smoke = 0;void System_Init(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();MX_ADC1_Init();OLED_Init();DS18B20_Init();OLED_ShowString(0, 0, "Fire Alarm System Ready");
}// 读取温度数据
float Read_Temperature(void)
{return DS18B20_ReadTemperature(); // 读取温度
}// 读取烟雾浓度
uint16_t Read_Smoke(void)
{HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);uint16_t smoke_value = HAL_ADC_GetValue(&hadc1);HAL_ADC_Stop(&hadc1);return smoke_value;
}// 检查报警状态
void Check_Alarm(void)
{temperature = Read_Temperature();smoke = Read_Smoke();// 检查是否超过报警阈值if (temperature > TEMP_THRESHOLD){Trigger_Alarm(1); // 温度报警}else if (smoke > SMOKE_THRESHOLD){Trigger_Alarm(2); // 烟雾报警}else{Clear_Alarm(); // 清除报警}Display_Status(temperature, smoke); // 显示当前状态
}// 触发报警
void Trigger_Alarm(uint8_t alarm_type)
{HAL_GPIO_WritePin(GPIOA, BUZZER_PIN, GPIO_PIN_SET); // 触发蜂鸣器switch (alarm_type){case 1: // 温度报警HAL_GPIO_WritePin(GPIOA, RGB_LED_RED_PIN, GPIO_PIN_SET); // 红色 LED 闪烁OLED_ShowString(0, 1, "Temp Alarm: Overheat!");break;case 2: // 烟雾报警HAL_GPIO_WritePin(GPIOA, RGB_LED_BLUE_PIN, GPIO_PIN_SET); // 蓝色 LED 闪烁OLED_ShowString(0, 1, "Smoke Alarm: High!");break;}
}// 清除报警
void Clear_Alarm(void)
{HAL_GPIO_WritePin(GPIOA, BUZZER_PIN, GPIO_PIN_RESET); // 关闭蜂鸣器HAL_GPIO_WritePin(GPIOA, RGB_LED_RED_PIN, GPIO_PIN_RESET); // 关闭红色 LEDHAL_GPIO_WritePin(GPIOA, RGB_LED_BLUE_PIN, GPIO_PIN_RESET); // 关闭蓝色 LEDOLED_ShowString(0, 1, "System Normal");
}// 显示状态
void Display_Status(float temp, uint16_t smoke)
{OLED_Clear();OLED_ShowString(0, 0, "Temp: ");OLED_ShowFloat(64, 0, temp, 2);OLED_ShowString(0, 1, "Smoke: ");OLED_ShowNumber(64, 1, smoke, 4);
}int main(void)
{System_Init();while (1){Check_Alarm(); // 检查火灾报警HAL_Delay(1000); // 每秒更新一次状态}
}
4. 各模块代码
温度传感器(DS18B20)读取
通过 DS18B20 温度传感器获取当前环境的温度数据:
#include "ds18b20.h"// 初始化 DS18B20
void DS18B20_Init(void)
{// 配置 DS18B20 数据引脚
}// 读取温度数据
float DS18B20_ReadTemperature(void)
{// 从 DS18B20 读取温度值return 25.5; // 假设读取到 25.5°C
}
烟雾传感器(MQ-2)读取
通过 MQ-2 烟雾传感器检测当前空气中的烟雾浓度:
#include "adc.h"// 读取烟雾浓度
uint16_t Read_Smoke(void)
{HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);uint16_t smoke_value = HAL_ADC_GetValue(&hadc1);HAL_ADC_Stop(&hadc1);return smoke_value;
}
蜂鸣器与LED控制
通过蜂鸣器发出报警声,RGB LED 通过不同颜色指示报警类型:
#include "oled.h"// 初始化 OLED 显示屏
void OLED_Init(void)
{// OLED 初始化代码
}// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, const char *str)
{// 在 OLED 显示屏上显示字符串
}// 显示浮点数
void OLED_ShowFloat(uint8_t x, uint8_t y, float num, uint8_t decimal_places)
{// 显示带小数的数值
}// 清屏
void OLED_Clear(void)
{// 清除 OLED 显示内容
}
⬇帮大家整理了单片机的资料
包括stm32的项目合集【源码+开发文档】
点击下方蓝字即可领取,感谢支持!⬇
点击领取更多嵌入式详细资料
问题讨论,stm32的资料领取可以私信!
系统工作原理
-
多路监控:系统通过多个温度传感器和烟雾传感器同时监控多个房间或区域。当某一区域的温度或烟雾浓度超出设定阈值时,系统会立即触发报警。
-
报警提示:当检测到火灾危险时,系统会通过蜂鸣器发出报警声,并通过 RGB LED 指示报警的类型(如红色代表温度过高,蓝色代表烟雾浓度超标)。同时,OLED 显示屏会显示具体的报警信息,便于用户快速识别。
-
实时状态显示:系统会定时更新各个区域的温度和烟雾浓度,并在 OLED 显示屏上实时展示。即使没有报警,也可以查看各区域的环境状态。
常见问题与解决方法
1. 误报警
- 问题原因:传感器误差或环境波动导致误报警。
- 解决方法:可以通过增加滤波机制或设定报警的延迟触发条件,避免短暂的波动触发误报警。
2. 传感器读取不稳定
- 问题原因:传感器与 STM32 的连接不稳定或时序不匹配。
- 解决方法:检查传感器的接线和配置,确保读取数据的时序和通信协议正确。
3. OLED 显示不正常
- 问题原因:I2C 通信故障或 OLED 初始化失败。
- 解决方法:检查 I2C 连接和通信,确保 OLED 的 SDA 和 SCL 引脚接线正确。
扩展功能
-
远程报警与数据上传:可以通过 Wi-Fi 模块或 GSM 模块,将火灾报警信息上传至云端,或通过短信、邮件等方式通知相关人员。
-
智能家居集成:系统可以与智能家居平台(如 Home Assistant)集成,实现远程控制和监控。当检测到火灾危险时,系统可以联动启动自动灭火设备或切断电源。
-
视频监控扩展:可以增加摄像头模块,系统检测到火灾报警时,自动抓取现场图像并上传到云端或发送至手机,以便远程查看火灾现场的状况。
结论
通过本项目,我们成功设计了一个基于 STM32 的多路火灾报警系统,能够实时监控多个区域的温度和烟雾浓度,并在检测到火灾危险时触发报警。该系统具备报警及时、监控范围广、扩展性强等特点,适用于家庭、工厂、办公楼等场景的防火安全监控。未来可以通过扩展远程控制、视频监控等功能,进一步提高系统的智能化和自动化水平。