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

news2025/1/15 18:34:09

一、项目概述

随着校园生活的日益便利,宿舍用电管理成为了一个重要的课题。本项目旨在开发一个宿舍用电管理系统,通过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;

// 初始化ADC
void ADC_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
}

// 读取电流值
float readCurrent() {
    HAL_ADC_Start(&hadc1); // 启动ADC
    HAL_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; // 返回电流值
}

// 计算功率
float calculatePower(float current) {
    // 假设电压为220V
    float 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"

// 初始化ESP8266
void ESP8266_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);
}

// 发送数据到后台
void sendData(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"

// 初始化GPIO
void GPIO_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
}

// 控制电源开关
void controlPower(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"

// 定义烟雾阈值
#define SMOKE_THRESHOLD 300 // 根据实际情况调整阈值

// 读取烟雾传感器值
int readSmokeSensor() {
    // 假设使用ADC读取烟雾传感器值
    HAL_ADC_Start(&hadc1); // 启动ADC
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // 等待转换完成
    uint32_t adcValue = HAL_ADC_GetValue(&hadc1); // 获取ADC值
    HAL_ADC_Stop(&hadc1); // 停止ADC
    return adcValue; // 返回烟雾传感器值
}

// 检测烟雾
void checkSmoke() {
    int smokeValue = readSmokeSensor(); // 读取烟雾传感器值
    if (smokeValue > SMOKE_THRESHOLD) {
        controlPower(0); // 关闭电源
        activateAlarm(); // 启动报警
    }
}

// 启动报警
void activateAlarm() {
    // 这里可以添加蜂鸣器或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"

// 主函数
int main(void) {
    HAL_Init(); // 初始化HAL库
    ADC_Init();
    GPIO_Init(); // 初始化GPIO
    ESP8266_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. 时序图

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

User STM32 Sensor ESP8266 Database 请求电流数据 读取电流 返回电流值 计算功率 发送数据 数据存储 检测烟雾 返回烟雾值 检查烟雾阈值 控制电源状态 返回状态信息 User STM32 Sensor ESP8266 Database

8. 项目总结

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

  1. 实时电流监测:通过ADC读取电流传感器的值,实时监测宿舍用电情况。

  2. 功率计算:根据电流值计算功率,方便用户了解用电情况。

  3. 数据传输:通过ESP8266模块将数据发送到后台管理系统,实现远程监控。

  4. 电源控制:根据用户需求和安全监测结果,控制宿舍电源的开关。

  5. 安全监测:集成烟雾传感器,实时监测宿舍内的安全情况,确保用户安全。

9. 未来工作

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

  1. 用户界面:开发一个用户友好的界面,方便用户查看用电情况和控制电源。

  2. 数据分析:在后台管理系统中增加数据分析功能,帮助用户了解用电趋势。

  3. 报警系统:增加更复杂的报警系统,例如通过短信或APP推送通知用户。

  4. 多宿舍管理:扩展系统,支持多个宿舍的集中管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AT3340-6T杭州中科微BDS定位授时板卡性能指标

AT3340-6T是一款高性能多系统卫星定位安全授时板卡,可通过配置支持各个单系统的定位授时。 外观尺寸: 电气参数 应用领域: 通信基站授时 电力授时 广播电视授时 轨道系统授时 金融系统授时 其他授时应用 注意事项: 为了充分发挥…

nvidia-smi命令视图含义

第一部分:NVIDIA-SMI 标题 ---------------------------------------------------------------------------------------- | NVIDIA-SMI 555.42.06 Driver Version: 555.42.06 CUDA Version: 12.5 | ------------------------------------------------------------…

ML 系列:机器学习和深度学习的深层次总结(01)

​ 文章目录 一、说明二、人工智能和机器学习三、机器学习的类型四、结论 一、说明 欢迎学习机器学习系列。这门综合课程目前包括40个部分,指导您了解机器学习、统计和数据分析的基本概念和技术。以下是到目前为止涵盖的关键主题的简要概述: 1 机器学习…

C与汇编之间的相互调用(29)

1 先来看一下 基本的调用规则。 注意: 程序通过 r1 -r4 来保存 传递的参数,如果 超过了 4个参数怎么办, 那就 放到栈里面。 注意: 堆栈是满递减, FD。 子程序的返回结果 会放到R0 里面。 2 然后是 c 语言调用 汇编语言…

如何最好地制定自动化测试策略

尽管不能否认手动测试的价值,自动化测试的需求却在不断增长。自动化测试可以为公司和团队带来许多好处:时间效率高、覆盖面广。 如何最好地制定自动化测试策略呢? 在本文中,我将展示测试自动化策略的所有7个阶段中的一些最佳实践…

gpt4最新保姆级教程

如何使用 WildCard 服务注册 Claude3 随着 Claude3 的震撼发布,最强 AI 模型的桂冠已不再由 GPT-4 独揽。Claude3 推出了三个备受瞩目的模型:Claude 3 Haiku、Claude 3 Sonnet 以及 Claude 3 Opus,每个模型都展现了卓越的性能与特色。其中&a…

LLM - 理解 多模态大语言模型 (MLLM) 的发展与相关技术 (一)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142063880 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 多模态…

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 …

【Python报错已解决】SyntaxError: positional argument follows keyword argument

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:调整参数顺序2.2 步骤二…

excel分列

Excel中有这么几列,希望将每一列内容再分出3列: 可以通过以下步骤在 Excel 表格中将 B 到 F 列的内容拆分为每列的 3 列,分别为 pred_label、pred_score 和 pred_class: 确定数据结构:假设 B 列到 F 列中的内容都是按类…

洛谷 P10798 「CZOI-R1」消除威胁

题目来源于&#xff1a;洛谷 题目本质&#xff1a;贪心&#xff0c;st表&#xff0c;单调栈 解题思路&#xff1a;由于昨天联练习了平衡树&#xff0c;我就用平衡树STL打了个暴力&#xff0c;超时得了30分 这是暴力代码&#xff1a; #include<bits/stdc.h> using name…

小琳AI课堂:多模态模型的训练与应用

引言 大家好&#xff0c;这里是小琳AI课堂。今天我们将探讨一个热门且前沿的话题——多模态模型的训练与应用。让我们一起走进这个复杂而精致的艺术创作过程&#xff01; 训练关键步骤 1. 数据收集与预处理 准备工作&#xff1a;从多种来源和模态收集数据&#xff0c;如文…

苍穹外卖()

day1 软件开发整体介绍 软件开发流程&#xff1a;需求分析&#xff08;需求规格说明书、产品原型&#xff09;->设计&#xff08;UI设计、数据库设计、接口设计&#xff09;->编码&#xff08;项目代码&#xff0c;单元测试&#xff09;->测试&#xff08;测试用例、…

C++:入门篇(补充C语言中的不足)

前言 这篇文章是C的第一篇文章&#xff0c;主要是补充C语言中存在的不足而扩展的一些新的语法&#xff0c;有了这篇文章作为杂序&#xff0c;后面再介绍其他内容就要清晰地多 C&#xff1a;入门篇 一、namespace 命名空间&#xff08;一&#xff09;域的概念&#xff08;二&…

【深度学习讲解笔记】第1章-机器学习基础(2)

模型与函数构造 之前讲到&#xff0c;模型是由机器学习决定参数值的函数&#xff0c;通过训练&#xff0c;机器可以找出最好的一组参数使得函数的输出最优。常见的模型有线性模型&#xff0c;指数模型&#xff0c;对数模型等。在线性模型中&#xff0c;w和b是可学习的参数&…

【Hadoop|HDFS篇】DataNode概述

1. DataNode的工作机制 1&#xff09;一个数据块在DataNode上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度&#xff0c;块数据的校验和&#xff0c;以及时间戳。 2&#xff09;DataNode启动后向NameNod…

象过河在线进销存软件——简单、高效、智能,让生意更简单!

仓库管理&#xff0c;曾是我心中的一大“乱麻”——库存不清、数据混乱、出入库效率低... 但自从邂逅了【象过河在线进销存软件】&#xff0c;一切都变得那么简单、高效、智能&#xff01; 象过河在线进销存软件优势&#xff1a; 1、界面简洁&#xff0c;流程简单 作为亲身体…

【时时三省】(C语言基础)指针进阶 例题4

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 strlen是求字符串长度 这个需要算上&#xff3c;0 第一个arr 是打印6 因为它加上&#xff3c;0是有六个元素 第二个arr0 数组名相当于首元素的地址 a的地址加0还是a的地址 所以这个地方还是…

Linux日志-kdump日志

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具&#xff0c;它们可以帮助管理员监视系统状态、调查问题以及了解系统运行…

IDEA Maven 源修改为国内阿里云镜像的正确方式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…