基于STM32的电能监控系统设计:ModBus协议、RS-485存储和分析电能数据(代码示例)

news2025/3/15 14:08:04

在这里插入图片描述

一、项目概述

随着智能电网的发展,电能管理的科学性与有效性变得越来越重要。本项目旨在设计并实现一个基于STM32103C8T6单片机的电能监控系统,该系统可以实时采集、存储和分析电能数据,帮助用户实现对电能的高效管理。

项目目标

  • 实时监控:实现对电能数据的实时监控与显示。

  • 数据存储:将采集的数据进行长期存储,便于后续分析。

  • 科学分析:通过数据分析,提供电能使用的科学管理建议。

技术栈关键词

  • 硬件:STM32、MODBUS、RS-485、无线通信

  • 软件:STM32 HAL库、Python、Pandas、MATLAB

二、系统架构

1. 系统架构设计

本系统分为上下位机两部分,上位机负责数据的可视化、存储与分析,下位机负责电能数据的采集与初步处理。

  • 下位机:使用STM32103C8T6作为核心控制器,负责通过传感器采集电流和电压数据。

  • 上位机:PC端应用程序,通过串口与下位机进行数据通信,负责数据的展示与存储。

2. 硬件选择

  • 单片机:STM32103C8T6,具备多种通信接口和足够的计算能力。

    • 传感器:使用ACS712电流传感器和ZMPT101B电压传感器,实现电流和电压的精准测量。
  • 通信模块:

    • RS-485:用于远距离数据传输,适合工业环境。

    • 无线模块:如ESP8266,用于实现无线数据传输。

3. 系统架构图

系统架构图如下:

数据接收
采集电能数据
采集电能数据
485/Wi-Fi
Modbus协议
上位PC机
下位机
电流传感器
电压传感器
数据传输
数据存储与分析

三、环境搭建与注意事项

1. 开发环境搭建

  • 硬件设备:

    • STM32103C8T6开发板

    • ACS712电流传感器

    • ZMPT101B电压传感器

    • RS-485转USB模块

    • ESP8266无线模块

  • 软件工具:

    • 开发环境:Keil MDK或STM32CubeIDE

    • 通信库:Modbus RTU库

    • 数据分析工具:Python、Pandas、Matplotlib

2. 注意事项

  • 电源管理:确保单片机和传感器的电源稳定,避免过压或欠压对系统的影响。

  • 信号完整性:在RS-485通信中,确保线缆的长度和阻抗匹配,减少信号反射和干扰。

  • 数据安全:在无线通信中,考虑使用加密措施以防止数据泄露。

四、代码实现过程

1. 下位机数据采集模块

下位机代码使用C语言编写,主要功能是读取电流和电压数据,并通过Modbus协议发送给上位机。

下位机数据采集代码示例:

#include "stm32f1xx_hal.h"
#include "modbus.h"

float voltage, current, power;

void CollectData() {
    voltage = ReadVoltage();
    current = ReadCurrent();
    power = voltage * current;
    
    // 通过Modbus发送数据
    ModbusSend(power);
}

float ReadVoltage() {
    // 读取电压值的代码
    return GetAnalogValue(VOLTAGE_CHANNEL);
}

float ReadCurrent() {
    // 读取电流值的代码
    return GetAnalogValue(CURRENT_CHANNEL);
}

void ModbusSend(float power) {
    // 使用Modbus协议将功率数据发送到上位机
    uint8_t data[8];
    memcpy(data, &power, sizeof(power));
    Modbus_WriteRegisters(POWER_REGISTER_ADDRESS, data, sizeof(data));
}

void main() {
    HAL_Init();
    Modbus_Init();
    while (1) {
        CollectData();
        HAL_Delay(1000);  // 每秒采集一次数据
    }
}

2. 上位机数据接收与存储模块

上位机使用Python编写,通过串口接收数据并进行存储和分析。

上位机数据接收代码示例:

import serial
import pandas as pd
import time

# 初始化参数
COM_PORT = 'COM3'
BAUD_RATE = 9600
power_data = []

def read_data():
    with serial.Serial(COM_PORT, BAUD_RATE) as ser:
        while True:
            if ser.in_waiting > 0:
                data = ser.read(8)  # 读取8个字节
                power = float.from_bytes(data, byteorder='little')
                process_data(power)

def process_data(power):
    power_data.append(power)
    print(f"Received Power: {power}")
    
    # 保存数据到CSV文件
    df = pd.DataFrame(power_data, columns=['Power'])
    df.to_csv('power_data.csv', index=False)

if __name__ == "__main__":
    read_data()

3. 数据分析模块

在数据存储后,可以使用Python的Pandas库进行数据分析,如计算功率的统计信息、绘图等。

数据分析示例:

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_csv('power_data.csv')

# 计算统计信息
mean_power = data['Power'].mean()
max_power = data['Power'].max()
min_power = data['Power'].min()

print(f"Mean Power: {mean_power}, Max Power: {max_power}, Min Power: {min_power}")

# 绘制功率变化图
plt.plot(data['Power'])
plt.title('Power Consumption Over Time')
plt.xlabel('Time')
plt.ylabel('Power (W)')
plt.grid()
plt.show()

4. 时序图

以下是下位机和上位机之间数据传输的时序图:

上位PC机 下位机 传感器 采集电能数据 发送数据 数据处理与存储 上位PC机 下位机 传感器

五、项目总结

本项目成功实现了基于STM32103C8T6的电能监控系统,系统能够实时采集电流和电压数据,并通过RS-485和无线通信将数据传输至上位机进行存储和分析。

主要功能

  1. 数据采集:通过电流和电压传感器实时采集电能数据。

  2. 数据传输:采用Modbus协议,保证数据传输的安全可靠。

  3. 数据存储与分析:上位机应用程序能够实时接收数据,并将数据存储为CSV文件,方便后续的分析和可视化。

实现过程

  • 硬件选择与环境搭建:根据项目需求选择合适的硬件组件,并搭建开发环境。

  • 编写下位机程序:实现数据采集、处理与传输功能。

  • 上位机程序开发:实现数据接收、存储与分析功能。

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

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

相关文章

从数据库模型设计到字段设计,用自然语言实现数据库开发,颠覆传统的数据库开发模式

前言 在数据库开发过程中,开发者经常面临以下困扰: 1. 焦头烂额的数据库设计阶段 在设计数据库阶段,开发者需要全面考虑表结构、关系模型、字段定义等,稍有不慎就会影响后续的开发与维护,常常让人感到无从下手。 2…

51c自动驾驶~合集39

我自己的原文哦~ https://blog.51cto.com/whaosoft/12707676 #DiffusionDrive 大幅超越所有SOTA!地平线DiffusionDrive:生成式方案或将重塑端到端格局? 近年来,由于感知模型的性能持续进步,端到端自动驾驶受到了来…

docker安装hadoop环境

一、使用docker搭建基础镜像 1、拉取centos系统镜像 # 我这里使用centos7为例子 docker pull centos:7 2、创建一个dockerfiler文件,用来构建自定义一个有ssh功能的centos镜像 # 基础镜像 FROM centos:7 # 作者 #MAINTAINER hadoop ADD Centos-7.repo /etc/yum.re…

多级缓存设计实践

缓存是什么? 缓存技术是一种用于加速数据访问的优化策略。它通过将频繁访问的数据存储在高速存储介质(如内存)中,减少对慢速存储设备(如硬盘或远程服务器)的访问次数,从而提升系统的响应速度和…

状态模式S

状态模式(State Pattern)是行为设计模式的一种,它允许一个对象在其内部状态发生改变时改变其行为。这个对象被视为类型的有限状态机(Finite State Machine)。 在状态模式中,我们创建表示各种状态的对象和一…

数据结构 (23)并查集与等价类划分

一、并查集 并查集(Union-Find Set或Disjoint Set)是一种数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。它通常表示为森林,并用数组来实现(类似于二叉堆)。在并…

【Linux】开启你的Linux之旅:初学者指令指南

Linux相关知识点可以通过点击以下链接进行学习一起加油! 在 Linux 开发中,GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题,Git 则提供高效的版本管理与协作支持。本指南将简明介绍两者的核心功能与使用技巧&…

Python语法1

Python语法1 作者:王珂 邮箱:49186456qq.com 文章目录 Python语法1[TOC] 前言一、环境搭建1.1 安装Python解释器1.2 安装第三方包1.3 安装Pycharm1.4 虚拟环境 二、Python语法2.1 基础语法2.1.1 注释2.1.2 变量2.1.3 数据类型2.1.4 关键字和标识符 2.2…

普及组集训--图论最短路径

定义:表示顶点u到顶点v的一条边的权值(边权) 最短路径算法有常见的四种:floyd,dijkstra,Bellman-Ford,SPFA 不过Bellman-Ford并不常用,所以本文不提; 重点在于dijkstr…

蓝桥杯第 23 场 小白入门赛

一、前言 好久没打蓝桥杯官网上的比赛了,回来感受一下,这难度区分度还是挺大的 二、题目总览 三、具体题目 3.1 1. 三体时间【算法赛】 思路 额...签到题 我的代码 // Problem: 1. 三体时间【算法赛】 // Contest: Lanqiao - 第 23 场 小白入门赛 …

前缀和篇——繁星斗斗数字交织中,觅得效率明月辉光(1)

前言 在这片无边无际的数字海洋中,如何从中提取出有价值的讯息,成为了计算机科学中的一项重要课题。前缀和算法,作为一种巧妙的技术,恰如其名——通过计算序列中各个元素的前缀和,能够为我们提供一种高效的查询方式&a…

STM32 HAL库 + LM2904运算放大器 + ADC + VDO温度传感器:电路设计及代码实现

本文将详细介绍如何使用STM32F407的HAL库,实现通过单通道ADC采集VDO温度传感器的信号,并通过串口将采集到的温度值打印输出。具体流程包括:通过分压电阻将获得VDO温度传感器的分压电压,再利用运算放大器LM2904对信号进行放大&…

Python酷库之旅-第三方库Pandas(252)

目录 一、用法精讲 1191、pandas.tseries.offsets.BusinessMonthBegin.n属性 1191-1、语法 1191-2、参数 1191-3、功能 1191-4、返回值 1191-5、说明 1191-6、用法 1191-6-1、数据准备 1191-6-2、代码示例 1191-6-3、结果输出 1192、pandas.tseries.offsets.Busine…

【Linux服务器】CPU问题排查

概述 总体排查思路 总体观察,htop命令观察系统负载程度 检查CPU占用高的进程检查CPU硬件信息是否为问题根源从宏观到细节分析系统IO情况最后检查系统日志 排查思路 系统负载 通过htop命令查看系统负载,通过系统负载可以判断系统是否繁忙,主…

详解MyBatis之篇一

目录 MyBatis 定义 使用MyBatis操作数据库 创建项目 配置 演示 UserInfo.java UserInfoMapper UserInfoMapperTest 数据准备 自动生成测试类 运行结果 MyBatis 定义 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避…

编译器优化技术

方法内联 逃逸分析 公共子表达式消除 数据边界检查消除

汽车IVI中控开发入门及进阶(三十五):架构QML App Architecture Best Practices

在Qt/QML工程的架构中,架构很重要,虽然本身它有分层,比如QML调用资源文件(图片等)显示GUI界面,后面的CPP文件实现界面逻辑,但是这个分类还有点粗。在实际开发中,界面逻辑也就是基于类cpp的实现,也开始使用各种面向对象的设计模式,实现更加优秀的开发架构,这点尤其在…

本地Docker部署个人在线音乐平台Melody结合内网穿透远程访问听音乐

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

异常--C++

文章目录 一、异常的概念及使用1、异常的概念2、异常的抛出和捕获3、栈展开4、查找匹配的处理代码5、异常重新抛出6、异常安全问题7、异常规范 二、标准库的异常 一、异常的概念及使用 1、异常的概念 异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并…

字符串p型编码

字符串p型编码 C 语言实现C 实现Java 实现Python 实现 💐The Begin💐点点关注,收藏不迷路💐 给定一个完全由数字字符(‘0’,‘1’,‘2’,…,‘9’)构成的字符串str,请写出str的p型编码串。例如&…