基于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中特定区域内的单元格才可点击 代码实现 首先,需要给el-table绑定单元格点击事件 <el-table :data"currTableData"borderstyle"width: 100%;"height"calc(100vh - 400px)"cell-clic…...

特种作业操作登高架设作业历年真题附答案
1.直接引起坠落的客观危险因素之平均温度低于( )℃。 A.10 B.3 C.5 答案:C 2.从事脚手架支搭作业的人员必须年满( )周岁。 A.18 B.20 C.22 答案:A 3.跨越架横杆有效部分的小头直径不…...

schedule-执行周期性任务
模块介绍 该模块主要用于python的任务调度,使用简便友好的python语法定期运行python函数或者一些其他的调用对象,这个模块就类似于windows的任务计划和linux的crontab,都是用于在服务器上周期性执行某段python脚本。 相较于linux的crontab对…...

python图片文件路径排序
解决用sord 排序文件路径乱序问题: image_files 是 图片文件路径列表[pythonProject/video2img/1.jpg,pythonProject/video2img/2.jpg,.......] image_files.sort(keylambda x: int(x.split(/)[-1].split(.)[0]))...

ARTTrack6/M、ARTTrack5、ART AT7-80横向对比
在光学跟踪系统领域,ART公司凭借其先进的技术和卓越的产品性能,一直受到市场的广泛关注。ARTTrack6/M、ARTTrack5和ART AT7-80作为ART公司的三款代表性产品,各自在不同的应用场景中发挥着重要作用。本文将对这三款产品进行纵向对比࿰…...

【Vue】Vue3.0(十三)中标签属性ref(加在普通标签上、加在组件标签上)、局部样式
上篇文章: 【Vue】Vue3.0 (十二)、watchEffect 和watch的区别及使用 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年10月18日20点56分 文章目录 基本…...

Linux系统基础-文件系统
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux系统基础-文件系统 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 回顾C语言…...

机器学习和深度学习常用的工具库
一、机器学习常用库 1. Scikit-learn 简介:一个基于Python的机器学习库,专注于经典的机器学习算法。特点: 提供了多种分类、回归、聚类和降维算法。具有统一的API,便于使用。集成了数据预处理、模型选择和评估等功能。 应用&…...

【unity小技巧】Unity6 LTS版本安装和一些修改和新功能使用介绍
文章目录 前言安装新功能变化1、官方推荐使用inputsystem进行输入控制2、修复了InputSystem命名错误导致listen被遮挡的bug3、自带去除unity启动画面logo功能4、unity官方的behavior行为树插件5、linearVelocity代替过时的velocity方法待续 完结 前言 2024/10/17其实unity就已…...

5种边界填充
目录 边界填充需要知道的两个东西什么算边界边界的范围是多少举例 复制填充反射法反射101法外包装法数值填充法原图代码最终效果 边界填充需要知道的两个东西 什么算边界 顾名思义:就是图片的最外边 边界的范围是多少 根据你自己的需要而设置 举例 这里我选择…...

鸿蒙网络编程系列7-TLS安全数据传输单向认证示例
1.TLS简介 TLS(Transport Layer Security)协议的前身是SSL(Secure Socket Layer)安全套接层协议,由Netscape公司于1994年提出,是一套网络通信安全协议。IETF(The Internet Engineering Task Fo…...