当前位置: 首页 > 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监控等功能,进一步提升系统的智能化水平和用户体验。

http://www.lryc.cn/news/465249.html

相关文章:

  • 开启学习与探索之旅,自闭症学校全托为孩子打造温馨成长环境
  • 多线程编程简单例题(3个线程) Linux环境 C语言实现
  • UG NX12.0建模入门笔记:1.2 鼠标的基本操作
  • NVME盘未格式化导致Ubuntu20.04启动慢
  • VSCode创建插件HelloWorld找不到指令解决办法
  • 第20场 小白入门赛本场比赛为「蓝桥·算法双周赛」第二十场分级赛——小白入门赛
  • 论文研读 | End-to-End Object Detection with Transformers
  • 构建高效在线教育平台:Spring Boot的力量
  • C#Process进程的使用,以及对ProcessInfo中所有的参数详细记录
  • STM32中的RAM和ROM分别是什么
  • Spring--1
  • 【Flutter】页面布局:流式布局(Wrap、Flow)
  • Delphi数据字典TDictionary
  • VsCode 如何自定义代码片段(Code Snippet)
  • Linux服务器前后端项目部署vue+springboot—搭建服务器上的运行环境(JDK、Redis、MySQL、Nginx)
  • 随记:有关idea中jdk版本
  • 【算法篇】贪心类(1)(笔记)
  • el-select 可搜索、多选状态遮挡住搜索框
  • el-table中实现可选表格区域的鼠标事件检测
  • 特种作业操作登高架设作业历年真题附答案
  • schedule-执行周期性任务
  • python图片文件路径排序
  • ARTTrack6/M、ARTTrack5、ART AT7-80横向对比
  • 【Vue】Vue3.0(十三)中标签属性ref(加在普通标签上、加在组件标签上)、局部样式
  • Linux系统基础-文件系统
  • 机器学习和深度学习常用的工具库
  • 【unity小技巧】Unity6 LTS版本安装和一些修改和新功能使用介绍
  • 5种边界填充
  • 鸿蒙网络编程系列7-TLS安全数据传输单向认证示例
  • LangGraph 源码分析 | BaseTool 模板类