当前位置: 首页 > news >正文

基于STM32的智能电能表设计

引言

本项目设计了一个基于STM32的智能电能表系统,能够实时测量家用电器的电压、电流、功率和电能消耗。该系统集成了电压电流传感器、显示屏、通信模块等,能够实现电能测量、数据显示、数据存储和远程传输功能,适用于家庭、工业等场景的电能监控与管理。通过该系统,用户可以方便地监控电能使用情况,从而优化用电效率。

环境准备

1. 硬件设备
  • STM32F103C8T6 开发板(或其他 STM32 系列)
  • 电压传感器(如 ZMPT101B,用于测量交流电压)
  • 电流传感器(如 ACS712,用于测量电流)
  • OLED 显示屏(用于显示电压、电流、功率和电能消耗)
  • Wi-Fi 模块(如 ESP8266,用于远程监控和数据上传)
  • SD 卡模块(用于数据存储)
  • 蜂鸣器(用于超负荷报警提示)
  • USB-TTL 串口调试工具
  • 电阻、杜邦线、面包板等基础电子元件
2. 软件工具
  • STM32CubeMX:用于初始化 STM32 外设。
  • Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
  • ST-Link 驱动程序:用于下载程序到 STM32。

项目实现

1. 硬件连接
  • 电压传感器连接:将 ZMPT101B 的模拟输出引脚连接到 STM32 的 ADC 输入引脚(如 PA0),用于测量电压。
  • 电流传感器连接:将 ACS712 的模拟输出引脚连接到 STM32 的 ADC 输入引脚(如 PA1),用于测量电流。
  • OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示电能测量数据。
  • Wi-Fi 模块连接:将 Wi-Fi 模块的 TX/RX 引脚连接到 STM32 的 USART 引脚(如 PA9 和 PA10),用于上传测量数据到远程服务器。
  • SD 卡模块连接:将 SD 卡模块的 SPI 接口连接到 STM32 的 SPI 接口(如 PA4、PA5、PA6 和 PA7),用于记录历史电能数据。
  • 蜂鸣器连接:将蜂鸣器的控制引脚连接到 STM32 的 GPIO(如 PA2),用于提示电流超负荷报警。
  • 其他连接:为 STM32、传感器、显示屏、Wi-Fi 模块等提供稳定的电源,并确保信号线接线正确。
2. STM32CubeMX 配置
  • 打开 STM32CubeMX,选择你的开发板型号。
  • 配置系统时钟为 HSI,确保系统稳定运行。
  • 配置 ADC,用于读取电压和电流传感器的模拟信号。
  • 配置 GPIO 引脚用于蜂鸣器控制和其他外设。
  • 配置 I2C,用于与 OLED 显示屏通信。
  • 配置 USART,用于与 Wi-Fi 模块通信。
  • 配置 SPI,用于与 SD 卡模块通信。
  • 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序

在生成的项目基础上,编写电压电流测量、功率和电能计算、OLED 显示、Wi-Fi 数据上传、超负荷报警的代码。以下是智能电能表的基本代码示例:

#include "stm32f1xx_hal.h"
#include "adc.h"
#include "oled.h"
#include "wifi.h"
#include "sdcard.h"
#include "gpio.h"// 定义电能计算常量
#define VOLTAGE_SCALE 220.0  // 电压传感器的比例系数
#define CURRENT_SCALE 30.0   // 电流传感器的比例系数
#define POWER_THRESHOLD 2000.0  // 超负荷功率阈值(瓦特)// 函数声明
void System_Init(void);
void Measure_Voltage_Current(void);
void Calculate_Power_Energy(void);
void Display_Data(void);
void Store_Data(void);
void Remote_Monitoring(void);
void Overload_Alarm(void);// 全局变量
float voltage = 0;            // 当前电压(伏特)
float current = 0;            // 当前电流(安培)
float power = 0;              // 当前功率(瓦特)
float energy = 0;             // 累计电能消耗(千瓦时)
uint8_t overload_flag = 0;    // 超负荷标志void System_Init(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();MX_I2C1_Init();MX_USART1_UART_Init();MX_SPI1_Init();OLED_Init();WiFi_Init();SD_Card_Init();OLED_ShowString(0, 0, "Smart Energy Meter Ready");
}// 测量电压和电流
void Measure_Voltage_Current(void)
{// 读取电压传感器的数据,并转换为实际电压值uint16_t raw_voltage = HAL_ADC_GetValue(&hadc1);voltage = (raw_voltage / 4096.0) * VOLTAGE_SCALE;// 读取电流传感器的数据,并转换为实际电流值uint16_t raw_current = HAL_ADC_GetValue(&hadc2);current = (raw_current / 4096.0) * CURRENT_SCALE;
}// 计算功率和电能消耗
void Calculate_Power_Energy(void)
{// 计算瞬时功率 P = U * Ipower = voltage * current;// 计算电能消耗:能量 = 功率 * 时间(时间单位为小时)// 这里假设程序每秒运行一次,时间增量为 1/3600 小时energy += power * (1.0 / 3600.0);// 检查是否超负荷if (power > POWER_THRESHOLD){overload_flag = 1;Overload_Alarm();  // 触发报警}else{overload_flag = 0;}
}// 显示电能测量数据
void Display_Data(void)
{OLED_Clear();OLED_ShowString(0, 0, "Voltage: ");OLED_ShowFloat(64, 0, voltage, 2);OLED_ShowString(0, 1, "Current: ");OLED_ShowFloat(64, 1, current, 2);OLED_ShowString(0, 2, "Power: ");OLED_ShowFloat(64, 2, power, 2);OLED_ShowString(0, 3, "Energy: ");OLED_ShowFloat(64, 3, energy, 2);
}// 存储数据到SD卡
void Store_Data(void)
{// 将电压、电流、功率、电能数据存储到SD卡SD_Card_Write(voltage, current, power, energy);
}// 远程监控上传数据
void Remote_Monitoring(void)
{// 将数据通过Wi-Fi模块上传到远程服务器WiFi_SendData(voltage, current, power, energy);
}// 超负荷报警
void Overload_Alarm(void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);  // 蜂鸣器发出报警声音HAL_Delay(500);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);  // 关闭蜂鸣器
}int main(void)
{System_Init();while (1){Measure_Voltage_Current();  // 测量电压和电流Calculate_Power_Energy();   // 计算功率和电能消耗Display_Data();             // 显示数据Store_Data();               // 存储数据到SD卡Remote_Monitoring();        // 远程监控上传数据HAL_Delay(1000);            // 每秒更新一次数据}
}
4. 各模块代码
电压和电流测量

通过 ADC 读取电压传感器和电流传感器的模拟信号,将其转换为实际的电压和电流值:

#include "adc.h"// 初始化 ADC,用于读取电压和电流数据
void ADC_Init(void)
{// 配置 ADC 通道
}// 读取电压和电流数据
void Measure_Voltage_Current(void)
{uint16_t raw_voltage = HAL_ADC_GetValue(&hadc1);voltage = (raw_voltage / 4096.0) * VOLTAGE_SCALE;uint16_t raw_current = HAL_ADC_GetValue(&hadc2);current = (raw_current / 4096.0) * CURRENT_SCALE;
}
功率和电能计算

根据测量到的电压和电流,计算瞬时功率和累计电能消耗:

#include "power.h"// 计算功率和电能
void Calculate_Power_Energy(void)
{power = voltage * current;  // 计算功率energy += power * (1.0 / 3600.0);  // 计算电能消耗(千瓦时)if (power > POWER_THRESHOLD){overload_flag = 1;Overload_Alarm();  // 触发报警}
}
SD 卡数据存储

将测量到的电能数据存储到 SD 卡,便于后续分析:

#include "sdcard.h"// 初始化 SD 卡模块
void SD_Card_Init(void)
{// 配置 SPI 接口,初始化 SD 卡模块
}// 存储电能数据
void SD_Card_Write(float voltage, float current, float power, float energy)
{// 将数据写入 SD 卡
}
Wi-Fi 数据上传

通过 Wi-Fi 模块将电能数据上传到远程服务器,实现远程监控:

#include "wifi.h"// 初始化 Wi-Fi 模块
void WiFi_Init(void)
{// 配置 USART 接口,初始化 Wi-Fi 模块
}// 上传电能数据
void WiFi_SendData(float voltage, float current, float power, float energy)
{// 通过 Wi-Fi 上传数据
}
OLED 显示

OLED 显示屏用于显示电压、电流、功率和电能等实时数据:

#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的资料领取可以私信!

 

系统工作原理

  • 电压和电流测量:系统通过电压和电流传感器实时监测负载的电压和电流信号,并通过 STM32 的 ADC 将模拟信号转换为数字信号,经过计算后得到实际电压和电流值。

  • 功率和电能计算:根据测得的电压和电流,系统计算瞬时功率,并根据时间累积计算电能消耗。功率与电能数据实时更新,并显示在 OLED 屏幕上。

  • 数据存储和上传:系统通过 SD 卡模块存储历史电能数据,便于用户查询分析;同时,系统通过 Wi-Fi 模块将实时数据上传到远程服务器,实现远程监控。

  • 超负荷报警:当系统检测到电器的功率超过设定的超负荷阈值时,蜂鸣器发出声音报警,提醒用户注意过载问题。

常见问题与解决方法

1. 电压和电流测量不准确
  • 问题原因:传感器校准不当或ADC精度不足。
  • 解决方法:对传感器进行精确校准,并确保STM32的ADC分辨率和采样速率足够高。
2. Wi-Fi连接不稳定
  • 问题原因:Wi-Fi模块信号弱或网络配置错误。
  • 解决方法:确保Wi-Fi信号强度足够,并正确配置网络连接参数。
3. SD卡数据存储失败
  • 问题原因:SD卡模块通信故障或文件系统错误。
  • 解决方法:检查SPI通信,确保SD卡模块和STM32连接正确,并使用FAT文件系统格式化SD卡。

扩展功能

  • 手机APP监控:开发手机APP,与Wi-Fi模块结合,实现电能数据的实时查看和控制。

  • 智能控制功能:加入继电器模块,自动控制电器开关,防止过载或远程管理电器。

  • 图形化数据展示:通过增加图形化界面,用户可以直观查看电能使用趋势和历史数据分析。

结论

通过本项目,我们设计了一个基于STM32的智能电能表,能够实时监测电压、电流、功率和电能消耗,并通过Wi-Fi远程上传数据,实现智能化的电能监控和管理。系统集成了数据存储、报警提示等功能,适用于家庭、工厂等多种用电场景。未来可以通过增加智能控制、手机APP监控等功能,进一步提升系统的智能化水平和用户体验。

相关文章:

基于STM32的智能电能表设计

引言 本项目设计了一个基于STM32的智能电能表系统,能够实时测量家用电器的电压、电流、功率和电能消耗。该系统集成了电压电流传感器、显示屏、通信模块等,能够实现电能测量、数据显示、数据存储和远程传输功能,适用于家庭、工业等场景的电能…...

开启学习与探索之旅,自闭症学校全托为孩子打造温馨成长环境

原文指路:http://www.zibizhengwang.com/page33.html 在广州这座繁华都市的一隅,有一所特别的学校——星贝育园自闭症儿童寄宿制学校,它如同一座灯塔,照亮了自闭症儿童的学习与成长之路。在这里,每一个孩子都被视为独…...

多线程编程简单例题(3个线程) Linux环境 C语言实现

问题:编写程序完成如下功能:程序创建2个线程,然后: 1> 主线程先打印“I am main thread”,然后睡眠2秒后,打印"main thread wake up",主线程退出 2> 第一个新线程先打印“…...

UG NX12.0建模入门笔记:1.2 鼠标的基本操作

文章目录 前言:鼠标的操作1.鼠标左键:单击—>单选;长按并滑动—>框选。2.鼠标右键:在不同的地方单击弹出不同的菜单。3.鼠标中键:滚动中键—>放大缩小【镜头拉近拉远】。4.鼠标中键:摁住鼠标中键&…...

NVME盘未格式化导致Ubuntu20.04启动慢

背景 最近公司一款产品转产,工厂组装好后,用我提供的系统镜像烧录,系统起来后发现Ubuntu20.04转圈了90秒才进入图形界面,这是不可接受的,公司老总要求当天必须解决。 定位 分析syslog 看不到系统启动时的日志&…...

VSCode创建插件HelloWorld找不到指令解决办法

按照网上的教程执行yo code并且生成成功 但是F5打开调试新窗口后,ctrl shift P,输入helloworld并没有指令提示 原因:当前电脑安装的VSCode版本过低,不支持当前插件的使用(因为自动生成的插件总是默认使用最新版VSC…...

第20场 小白入门赛本场比赛为「蓝桥·算法双周赛」第二十场分级赛——小白入门赛

1. 四个亲戚【算法赛】 问题描述 风流倜傥的贾宝玉,拥有四个如花似玉的亲戚:林黛玉、薛宝钗、元春和迎春。这日,他们组团出国旅游了。为了方便称呼,宝玉给她们取了英文昵称,分别为:Daiyu、Baochai、Yuanchun 和Yingchun。但是&a…...

论文研读 | End-to-End Object Detection with Transformers

DETR:端到端目标检测的创新 —— 作者 Nicolas Carion 等人 一、背景与挑战 目标检测是计算机视觉领域的一个核心任务,要求模型精确识别图像中的物体类别和位置。传统方法如 Faster R-CNN,因其区域建议网络等复杂结构,使得模型调…...

构建高效在线教育平台:Spring Boot的力量

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理信息化在线教学平台的相关信息成为必然。开…...

C#Process进程的使用,以及对ProcessInfo中所有的参数详细记录

目录 一、Process 二、ProcessInfo 2.1 FileName 2.2 Arguments 2.3 WorkingDirectory 2.4 CreateNoWindow 2.5 UseShellExecute 2.6 RedirectStandardInput 2.7 RedirectStandardOutput 2.8 RedirectStandardError 2.9 WindowStyle 2.10 Verb 2.11 LoadUserProfil…...

STM32中的RAM和ROM分别是什么

RAM(Random Access Memory,随机存取存储器)和ROM(Read-Only Memory,只读存储器)是计算机系统中的两种常见存储器类型,它们各自有不同的功能和用途。 1. RAM(内存) 定义…...

Spring--1

spring是一个轻量级的,采用IOC与AOP编程思想的java后端开发框架,简化了企业级的应用开发。 Spring体系 数据访问层,Web层,配置中心,测试区 IOC 控制反转,将创建对象的控制权交由Spring框架,需…...

【Flutter】页面布局:流式布局(Wrap、Flow)

在移动应用开发中,布局是非常重要的一部分,尤其是当我们需要处理动态或自适应的内容时。Flutter 提供了几种布局方式来帮助开发者处理复杂的 UI 场景,其中 Wrap 和 Flow 是常用的流式布局组件。它们在处理多个子组件时表现优越,尤…...

Delphi数据字典TDictionary

在 Delphi 中,创建一个数据字典通常意味着使用一种结构来存储键值对。Delphi 没有内建的字典类型,但你可以使用 TStringList 从 Classes 单元作为一个简单的键值对存储,或者你可以使用更复杂的第三方容器,如 TDictionary 从 Gener…...

VsCode 如何自定义代码片段(Code Snippet)

前言 在现代前端开发中,提高工作效率是每个开发者的追求。Visual Studio Code(Vscode)作为一款强大的代码编辑器,提供了许多让开发者高效编程的功能,其中自定义代码片段(Code Snippet)便是一个…...

Linux服务器前后端项目部署vue+springboot—搭建服务器上的运行环境(JDK、Redis、MySQL、Nginx)

Linux服务器前后端项目部署—①搭建服务器上的运行环境 一、系统参数信息和使用工具 1、服务器信息 华为云 CenteOS7.8 64 配置信息:2核4G 2、使用工具 Xshell6 二、环境安装和配置 (一)JDK的下载和安装 1、创建一个新目录或者进入目…...

随记:有关idea中jdk版本

第一个地方:这个可能就是你整个项目的jdk版本的使用,你改了这里大概率可以改了 第二个地方: 就是 有关maven项目的 pom文件 一开始我的第一地方用的是 17 但是这里用的是8 但是运行的时候还是 17 这里可能是 maven的 项目这个地方只是对…...

【算法篇】贪心类(1)(笔记)

目录 一、理论基础 1. 大纲 2. 求解步骤 二、Leetcode 题目 1. 分发饼干 2. 摆动序列 3. 最大子序和 4. 买卖股票的最佳时机 II 5. 跳跃游戏 6. 跳跃游戏 II 7. K 次取反后最大化的数组和 8. 加油站 9. 分发糖果 一、理论基础 1. 大纲 2. 求解步骤 将问题分解为…...

el-select 可搜索、多选状态遮挡住搜索框

el-select 可搜索多选状态遮挡住搜索框 最近在使用 element-ui 中 el-select组件遇到一个问题, 我们需求可以多选,也可以输入搜索, 当鼠标在边框时才是输入搜索状态,通过下面gif动图可发现鼠标经过边框时,才显示清空图…...

el-table中实现可选表格区域的鼠标事件检测

背景描述 vue3element plus想要实现el-table中特定区域内的单元格才可点击 代码实现 首先&#xff0c;需要给el-table绑定单元格点击事件 <el-table :data"currTableData"borderstyle"width: 100%;"height"calc(100vh - 400px)"cell-clic…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...