0


基于STM32的智能宿舍安全管理系统:集成电流监测、烟雾探测与无线通信技术,实现高效用电管理与安全监控(详细流程)

一、项目概述

随着校园生活的日益便利,宿舍用电管理成为了一个重要的课题。本项目旨在开发一个宿舍用电管理系统,通过STM32单片机实现对宿舍用电功率的监管,实时监测用电量,并计算费用。系统还具备远程控制功能,可以对每个宿舍的用电进行管理,包括开关控制、统一断电等。此外,系统集成了烟雾和火灾传感器,当监测到火灾时会自动断电并启动备用电源,确保宿舍的安全。

技术栈关键词

  • STM32单片机
  • 电流传感器
  • 无线通信模块
  • 烟雾传感器
  • 数据处理与计算
  • 后台管理系统

二、系统架构

本项目的系统架构设计如下:

  • 单片机:选择STM32系列单片机作为核心控制器,负责数据采集和控制逻辑。
  • 电流传感器:用于实时监测宿舍的电流和功率。
  • 无线通信模块:用于将数据传输到后台管理系统。
  • 烟雾传感器:用于检测宿舍内的烟雾和火灾。
  • 后台管理系统:用于数据处理、费用计算和远程控制。

系统架构图

三、环境搭建和注意事项

环境搭建

  1. 硬件环境:- STM32开发板- 电流传感器(如ACS712)- 烟雾传感器(如MQ-2)- 无线通信模块(如ESP8266)
  2. 软件环境:- STM32CubeIDE:用于开发和调试STM32代码。- 数据库(如MySQL):用于存储用户数据和用电记录。- 后台管理系统(可使用Flask/Django等框架)。

注意事项

  • 确保电流传感器和烟雾传感器的连接正确。
  • 在进行无线通信时,注意信号强度和干扰问题。
  • 定期检查传感器的工作状态,确保系统的可靠性。

四、代码实现过程

1. 功能模块设计

本项目的功能模块主要包括以下几个部分:

  1. 电流监测模块:实时获取电流数据并计算功率。
  2. 数据传输模块:将数据通过无线模块发送到后台。
  3. 控制模块:实现对宿舍电源的控制。
  4. 安全监测模块:监测烟雾和火灾,自动断电。

2. 电流监测模块

2.1 硬件连接
  • 电流传感器:使用ACS712电流传感器,连接到STM32的ADC引脚。
  • ADC引脚:假设连接到PA0引脚。
2.2 代码示例
#include"stm32f4xx_hal.h"// ADC句柄
ADC_HandleTypeDef hadc1;// 初始化ADCvoidADC_Init(){__HAL_RCC_ADC1_CLK_ENABLE();// 使能ADC时钟
    hadc1.Instance = ADC1;
    hadc1.Init.Resolution = ADC_RESOLUTION_12B;// 12位分辨率
    hadc1.Init.ScanConvMode = DISABLE;// 单通道模式
    hadc1.Init.ContinuousConvMode = ENABLE;// 连续转换模式
    hadc1.Init.DiscontinuousConvMode = DISABLE;// 不使用不连续模式
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;// 软件触发HAL_ADC_Init(&hadc1);// 初始化ADC}// 读取电流值floatreadCurrent(){HAL_ADC_Start(&hadc1);// 启动ADCHAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);// 等待转换完成uint32_t adcValue =HAL_ADC_GetValue(&hadc1);// 获取ADC值HAL_ADC_Stop(&hadc1);// 停止ADC// 转换为电流值(假设传感器的灵敏度为185 mV/A)float current =(adcValue *3.3/4096)/0.185;// 计算电流return current;// 返回电流值}// 计算功率floatcalculatePower(float current){// 假设电压为220Vfloat voltage =220.0;return voltage * current;// 功率 = 电压 * 电流}
2.3 代码说明
  • ADC_Init:初始化ADC模块,配置分辨率、转换模式等参数。
  • readCurrent:启动ADC,读取电流传感器的值,并将其转换为电流(单位:A)。
  • calculatePower:根据电流值计算功率(单位:W),假设电压为220V。

3. 数据传输模块

3.1 硬件连接
  • ESP8266模块:用于无线数据传输,连接到STM32的UART引脚。
3.2 代码示例
#include"esp8266.h"// 初始化ESP8266voidESP8266_Init(){// 配置UART// 假设使用USART2__HAL_RCC_USART2_CLK_ENABLE();// 配置USART2参数// 9600波特率,8位数据位,无校验位,1位停止位
    UART_HandleTypeDef huart2;
    huart2.Instance = USART2;
    huart2.Init.BaudRate =9600;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;HAL_UART_Init(&huart2);}// 发送数据到后台voidsendData(float current,float power){char data[100];sprintf(data,"{\"current\": %.2f, \"power\": %.2f}", current, power);// 通过ESP8266发送数据HAL_UART_Transmit(&huart2,(uint8_t*)data,strlen(data), HAL_MAX_DELAY);}
3.3 代码说明
  • ESP8266_Init:初始化ESP8266模块,配置UART参数以进行通信。
  • sendData:将电流和功率数据格式化为JSON字符串,并通过ESP8266模块发送到后台管理系统。使用HAL_UART_Transmit函数将数据通过UART发送。

4. 控制模块

4.1 硬件连接
  • 继电器模块:用于控制宿舍电源的开关,连接到STM32的GPIO引脚(假设连接到PB0引脚)。
4.2 代码示例
#include"gpio.h"// 初始化GPIOvoidGPIO_Init(){__HAL_RCC_GPIOB_CLK_ENABLE();// 使能GPIOB时钟
    GPIO_InitTypeDef GPIO_InitStruct ={0};// 配置PB0为输出模式
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;// 推挽输出
    GPIO_InitStruct.Pull = GPIO_NOPULL;// 不使用上拉或下拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;// 低速HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);// 初始化GPIO}// 控制电源开关voidcontrolPower(int state){if(state ==1){HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);// 开启电源}else{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);// 关闭电源}}
4.3 代码说明
  • GPIO_Init:初始化GPIO引脚,配置PB0为推挽输出模式,用于控制继电器。
  • controlPower:根据传入的状态参数(1为开启,0为关闭)控制电源的开关。通过HAL_GPIO_WritePin函数设置引脚状态。

5. 安全监测模块

5.1 硬件连接
  • 烟雾传感器:使用MQ-2烟雾传感器,连接到STM32的模拟输入引脚(假设连接到PA1引脚)。
5.2 代码示例
#include"stm32f4xx_hal.h"// 定义烟雾阈值#defineSMOKE_THRESHOLD300// 根据实际情况调整阈值// 读取烟雾传感器值intreadSmokeSensor(){// 假设使用ADC读取烟雾传感器值HAL_ADC_Start(&hadc1);// 启动ADCHAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);// 等待转换完成uint32_t adcValue =HAL_ADC_GetValue(&hadc1);// 获取ADC值HAL_ADC_Stop(&hadc1);// 停止ADCreturn adcValue;// 返回烟雾传感器值}// 检测烟雾voidcheckSmoke(){int smokeValue =readSmokeSensor();// 读取烟雾传感器值if(smokeValue > SMOKE_THRESHOLD){controlPower(0);// 关闭电源activateAlarm();// 启动报警}}// 启动报警voidactivateAlarm(){// 这里可以添加蜂鸣器或LED报警的代码HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);// 假设PA1连接蜂鸣器HAL_Delay(1000);// 蜂鸣器响1秒HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);// 关闭蜂鸣器}
5.3 代码说明
  • readSmokeSensor:读取烟雾传感器的值,使用ADC获取模拟信号并返回。
  • checkSmoke:检测烟雾传感器的值,如果超过设定阈值,则关闭电源并启动报警。
  • activateAlarm:启动报警,假设连接了蜂鸣器,通过控制GPIO引脚实现报警功能。

6. 主程序

在主程序中,我们将调用上述模块的初始化和功能函数,形成完整的控制逻辑。

6.1 代码示例
#include"stm32f4xx_hal.h"// 主函数intmain(void){HAL_Init();// 初始化HAL库ADC_Init();GPIO_Init();// 初始化GPIOESP8266_Init();// 初始化ESP8266// 主循环while(1){// 读取电流值float current =readCurrent();// 计算功率float power =calculatePower(current);// 发送数据到后台sendData(current, power);// 检测烟雾checkSmoke();// 延时1秒HAL_Delay(1000);}}
6.2 代码说明
  • HAL_Init():初始化HAL库,配置系统时钟和其他基础设置。
  • ADC_Init():初始化ADC模块,用于电流监测。
  • GPIO_Init():初始化GPIO引脚,用于控制电源和报警。
  • ESP8266_Init():初始化ESP8266模块,用于无线数据传输。

在主循环中:

  • 读取电流值:调用readCurrent()函数获取当前电流值。
  • 计算功率:调用calculatePower(current)函数计算功率。
  • 发送数据到后台:调用sendData(current, power)函数将数据发送到后台管理系统。
  • 检测烟雾:调用checkSmoke()函数监测烟雾传感器的状态。
  • 延时1秒:使用HAL_Delay(1000)函数进行延时,控制循环频率。

7. 时序图

以下是系统各模块之间的交互时序图,展示了电流监测、数据发送和控制的流程。

#mermaid-svg-asgmWM1IAZp12uGx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-asgmWM1IAZp12uGx .error-icon{fill:#552222;}#mermaid-svg-asgmWM1IAZp12uGx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-asgmWM1IAZp12uGx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-asgmWM1IAZp12uGx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-asgmWM1IAZp12uGx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-asgmWM1IAZp12uGx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-asgmWM1IAZp12uGx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-asgmWM1IAZp12uGx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-asgmWM1IAZp12uGx .marker.cross{stroke:#333333;}#mermaid-svg-asgmWM1IAZp12uGx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-asgmWM1IAZp12uGx .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-asgmWM1IAZp12uGx text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-asgmWM1IAZp12uGx .actor-line{stroke:grey;}#mermaid-svg-asgmWM1IAZp12uGx .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-asgmWM1IAZp12uGx .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-asgmWM1IAZp12uGx #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-asgmWM1IAZp12uGx .sequenceNumber{fill:white;}#mermaid-svg-asgmWM1IAZp12uGx #sequencenumber{fill:#333;}#mermaid-svg-asgmWM1IAZp12uGx #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-asgmWM1IAZp12uGx .messageText{fill:#333;stroke:#333;}#mermaid-svg-asgmWM1IAZp12uGx .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-asgmWM1IAZp12uGx .labelText,#mermaid-svg-asgmWM1IAZp12uGx .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-asgmWM1IAZp12uGx .loopText,#mermaid-svg-asgmWM1IAZp12uGx .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-asgmWM1IAZp12uGx .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-asgmWM1IAZp12uGx .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-asgmWM1IAZp12uGx .noteText,#mermaid-svg-asgmWM1IAZp12uGx .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-asgmWM1IAZp12uGx .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-asgmWM1IAZp12uGx .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-asgmWM1IAZp12uGx .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-asgmWM1IAZp12uGx .actorPopupMenu{position:absolute;}#mermaid-svg-asgmWM1IAZp12uGx .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-asgmWM1IAZp12uGx .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-asgmWM1IAZp12uGx .actor-man circle,#mermaid-svg-asgmWM1IAZp12uGx line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-asgmWM1IAZp12uGx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
User

   STM32 
 
   Sensor 
 
   ESP8266 
 
   Database 
 
请求电流数据 

读取电流 

返回电流值 

计算功率 

发送数据 

数据存储 

检测烟雾 

返回烟雾值 

检查烟雾阈值 

控制电源状态 

返回状态信息 

  User 

  STM32 

  Sensor 

  ESP8266 

  Database 

8. 项目总结

本项目成功实现了宿舍用电管理系统,具备了以下主要功能:

  1. 实时电流监测:通过ADC读取电流传感器的值,实时监测宿舍用电情况。
  2. 功率计算:根据电流值计算功率,方便用户了解用电情况。
  3. 数据传输:通过ESP8266模块将数据发送到后台管理系统,实现远程监控。
  4. 电源控制:根据用户需求和安全监测结果,控制宿舍电源的开关。
  5. 安全监测:集成烟雾传感器,实时监测宿舍内的安全情况,确保用户安全。

9. 未来工作

未来可以考虑以下改进方向:

  1. 用户界面:开发一个用户友好的界面,方便用户查看用电情况和控制电源。
  2. 数据分析:在后台管理系统中增加数据分析功能,帮助用户了解用电趋势。
  3. 报警系统:增加更复杂的报警系统,例如通过短信或APP推送通知用户。
  4. 多宿舍管理:扩展系统,支持多个宿舍的集中管理。

本文转载自: https://blog.csdn.net/qq_40431685/article/details/142066851
版权归原作者 极客小张 所有, 如有侵权,请联系我们删除。

“基于STM32的智能宿舍安全管理系统:集成电流监测、烟雾探测与无线通信技术,实现高效用电管理与安全监控(详细流程)”的评论:

还没有评论