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 代码示例
  1. #include"stm32f4xx_hal.h"// ADC句柄
  2. ADC_HandleTypeDef hadc1;// 初始化ADCvoidADC_Init(){__HAL_RCC_ADC1_CLK_ENABLE();// 使能ADC时钟
  3. hadc1.Instance = ADC1;
  4. hadc1.Init.Resolution = ADC_RESOLUTION_12B;// 12位分辨率
  5. hadc1.Init.ScanConvMode = DISABLE;// 单通道模式
  6. hadc1.Init.ContinuousConvMode = ENABLE;// 连续转换模式
  7. hadc1.Init.DiscontinuousConvMode = DISABLE;// 不使用不连续模式
  8. 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 代码示例
  1. #include"esp8266.h"// 初始化ESP8266voidESP8266_Init(){// 配置UART// 假设使用USART2__HAL_RCC_USART2_CLK_ENABLE();// 配置USART2参数// 9600波特率,8位数据位,无校验位,1位停止位
  2. UART_HandleTypeDef huart2;
  3. huart2.Instance = USART2;
  4. huart2.Init.BaudRate =9600;
  5. huart2.Init.WordLength = UART_WORDLENGTH_8B;
  6. huart2.Init.StopBits = UART_STOPBITS_1;
  7. huart2.Init.Parity = UART_PARITY_NONE;
  8. 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 代码示例
  1. #include"gpio.h"// 初始化GPIOvoidGPIO_Init(){__HAL_RCC_GPIOB_CLK_ENABLE();// 使能GPIOB时钟
  2. GPIO_InitTypeDef GPIO_InitStruct ={0};// 配置PB0为输出模式
  3. GPIO_InitStruct.Pin = GPIO_PIN_0;
  4. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;// 推挽输出
  5. GPIO_InitStruct.Pull = GPIO_NOPULL;// 不使用上拉或下拉
  6. 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 代码示例
  1. #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 代码示例
  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

  1. STM32
  2. Sensor
  3. ESP8266
  4. Database
  5. 请求电流数据
  6. 读取电流
  7. 返回电流值
  8. 计算功率
  9. 发送数据
  10. 数据存储
  11. 检测烟雾
  12. 返回烟雾值
  13. 检查烟雾阈值
  14. 控制电源状态
  15. 返回状态信息
  16. User
  17. STM32
  18. Sensor
  19. ESP8266
  20. 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的智能宿舍安全管理系统:集成电流监测、烟雾探测与无线通信技术,实现高效用电管理与安全监控(详细流程)”的评论:

还没有评论