ESP32与SUI-101A实现用电器识别
在2021年的全国大学生电子设计竞赛H题中,设计题目为用电器分析识别装置,至今很多院校的毕业设计或是课程设计也在采用此课题,主流芯片还是STM、STC、MSP等,但是考虑到用电器识别结果的云端上传,ESP也是一个不错的选择;
设计任务
设计并制作一个根据电源线电流的电参量信息分析在用电器类别的装置。该装置具有学习和分析识别两种工作模式。在学习模式下,测试并存储用于识别各单件电器的特征参量;在分析识别模式下,实时指示在用电器的类别。
设计要求
- 基本要求
(1)电器电流范围 5mA ~10.0A,可包括但不限于以下电器:LED 灯泡和 220V灯带、节能灯管、USB 充电器(带负载)、无线路由器、机顶盒、电风扇、热水壶、电磁炉。
(2)自定可识别的电器种类,总数不低于 7,用序号表示。电流不大于 50mA的电器数不低于 5,包括一件自制电器,编号为 1~5;编号为 7 的电器电流大于 8A。
(3)随机增减在用电器,实时显示可识别电器是否在用和电源线上电流的特征参量,响应时间不大于 2s。特征参量的种类、性质自定。
(4)用电阻,电容和二极管自制 1 号电器,其电流与 2 号电器相同但相位不同,且含有谐波,两者电流差小于 1mA。 - 发挥部分
(1)具有学习功能。清除作品存储的所有特征参量,重新测试并存储指定电器的特征参量。一种电器的学习时间不大于 1 分钟。
(2)随机增减在用电器,实时显示可识别电器是否在用和电源线上电流的特征参量,响应时间不大于 2s。
(3)提高识别电流相同,其他特性不同的电器的能力和大、小电流电器共用时识别小电流电器的能力。
(4)装置在分析识别模式下的工作电流不大于 15mA,可以选用无线传输到手机上显示的方式。
(5)其他
本次教程只是针对于ESP32与SUI-101A交互,故而只考虑实现基本要求(1)(2)(3)与发挥部分(1)(2)(3)。
SUI-101A(交流电能计量模块)介绍
220V串口电流电压功率采集,支持高精度ModBus
产品品牌 | JMI | 型号 | SUI-101A |
---|---|---|---|
产品名称 | 超高精度全隔离电量变送器 | 产品等级 | 工业级 |
工作温度 | -40~85℃ | 供电电压 | DC5V±0.2V |
电流量程 | 0-5A | 电流精度 | 0.2级 |
电压量程 | 0-400V | 电压精度 | 0.2级 |
功率量程 | 0-2000w | 功率精度 | 0.5级 |
采样频率 | 1Hz | 功率因数 | -1<cosθ<1 |
最小精度 | 0.1uA | 最大功耗 | ≤0.1W |
接口支持 | 3.3VTTL串行接口(兼容5V) | 拓展接口 | 2.2寸彩屏 |
产品重量 | 30g±2g | 质保时间 | 2年 |
通信协议 | Modbus-RTU或自定义简易协议智能识别 | ||
隔离方式 | 电流电压互感器全隔离 | ||
尺寸大小 | 长x宽x高:74.2×29.5×15 mm | ||
传输速率 | 波特率:4800 9600 19200 38400 57600 115200(用户自行设置) |
接线方式
ESP32 | SUI-101A |
---|---|
D16 | RX |
D17 | TX |
GND | GND |
VIN | 5V |
【供电模块可根据实际情况自行选择】
完整代码
#include <Arduino.h> //开发环境头文件
#include <ModbusMaster.h> //Modbus协议库【用作与SUI-101A通信】
#include <U8g2lib.h> //OLED屏幕驱动库(带中文字符库)
#include <EEPROM.h> //内部存储调用(保证掉电保存)
#include <WiFi.h> //WIFI驱动库实现数据局域网传输
#include <WebServer.h> //网页驱动库,IP访问生成网页// U8G2 OLED配置
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);// SUI-101A配置
#define SUI_RX_PIN 16 //RX->D16
#define SUI_TX_PIN 17 //TX->D17
#define SUI_BAUDRATE 9600 //Modbus通信波特率
ModbusMaster node;// WiFi配置
const char* ssid = "SUI-101A"; //WIFI名
const char* password = "12345678"; //密码
WebServer server(80); //端口// 用电器结构体
struct Appliance {char name[11];float power_th;float range_low;float range_high;
};
#define MAX_APPLIANCES 5
Appliance appliances[MAX_APPLIANCES];
int savedCount = 0;
String currentDetection = "无";// 显示控制
#define PAGE_SWITCH_INTERVAL 5000
unsigned long lastPageSwitch = 0;
bool showPrimaryPage = true;// 数据采集
#define MODBUS_READ_INTERVAL 500
unsigned long lastModbusRead = 0;
float voltage = 0, current = 0, power = 0, energy = 0;void showBootAnimation() {u8g2.clearBuffer();u8g2.setFont(u8g2_font_10x20_tf);u8g2.drawStr(30, 30, "LOADING");u8g2.sendBuffer();delay(1000);
}void updateOLED()