当前位置: 首页 > 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…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

深度学习习题2

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

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...