Problem in Computing the Energy in Energy Meter using ESP32



所以我和我的团队成员一直在进行关于电表的论文项目。在我们的项目中,esp32是我们正在使用的主板。我们的主板上还连接了电压传感器(ZMPT101B(和电流传感器(SCT013 100V:50mA(。

这是ZMPT101B的链接。。。https://www.autobotic.com.my/ac-voltage-sensor-module-zmpt101b-single-phase

这是SCT013的链接。。。https://innovatorsguru.com/sct-013-000/

我还在使用Emon库https://www.arduino.cc/reference/en/libraries/emonlib/以读取电流和电压传感器抛出的值。

为了得到功率,我将电流和电压值相乘。

然后为了得到能量的值,我需要时间,因为能量=功率x时间。我在网上看到了公式,它使用millis((函数来获取时间。。。但说实话,我不知道millis是怎么工作的。

last_time = current_time;
current_time = millis();
Wh = Wh + power *(( current_time -last_time) /3600000.0) ; 

能量的值将被发送到数据库,在我们的情况下,我们的数据库是firebase实时数据库。正在使用此代码。。。

Firebase.setDouble(firebaseData, path , KWh);

如果断电,ESP32也将停止工作。所以我们决定添加这行代码。。。

Firebase.getInt(firebaseData, path);
totalEnergyDB = (firebaseData.intData());
preKWh = totalEnergyDB;

一旦esp32再次打开,此代码用于从firebase获取数据。。。其中,从所述火球获得的数据将被用作预kwh。

我用这几行代码添加了前千瓦时的电流读数。

KWh = (Wh/1000) + preKWh;

我将电压和电流传感器的校准设置为高,这样变化就很容易被看到。

我的问题是,我能够从数据库中获得值,但似乎能量公式工作不正常。

这是串行监视器的结果。。。(171千瓦时是数据库中的初始值(在此处输入图像描述

我没能给你看功率的结果,但液晶显示器上显示它大约是3000W!但即使开启一个多小时,能源读数仍然没有改变:(

这是我们项目的完整代码。。。

#include "EmonLib.h"  
#define VOLT_CAL 52.5000
#define CURRENT_CAL 10.07
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
EnergyMonitor emon1;
int i;
// Wifi
#include <WiFi.h>
#include "FirebaseESP32.h"

#define FIREBASE_HOST "#!@#!@$!@a.firebaseio.com" 
#define FIREBASE_AUTH "RRw3u$!@%!@#%@#%$@%^#$^oI8LpQyVo0AWBC"
#define WIFI_SSID "WIFI"
#define WIFI_PASSWORD "PASSWORD"
// Define Firebase Data object
FirebaseData firebaseData;
// Root Path
String path = "/USER INFO/jdc/totalEnergy";
unsigned long last_time =0;
unsigned long current_time =0;
int Wh = 0;  
int preKWh;
int KWh;
int totalEnergyDB;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
initWifi();
lcd.init();
lcd.backlight();
lcd.begin(4, 20);

lcd.clear();
lcd.setCursor(1,4);
lcd.print("LOADING...");
Serial.print("LOADING...");
emon1.voltage(32, VOLT_CAL, 1.7);  // Voltage: input pin, calibration, phase_shift
emon1.current(33, CURRENT_CAL); 
for ( i = 0; i < 5; i++ ) {
emon1.calcVI(20,2000); 
float currentDraw            = emon1.Irms;  
float supplyVoltage          = emon1.Vrms; 

}
delay(1); 
Firebase.getInt(firebaseData, path);
totalEnergyDB = (firebaseData.intData()); 
preKWh = totalEnergyDB;

}
void loop() {
emon1.calcVI(20,2000);
float currentDraw     = emon1.Irms;             //extract Irms into Variable
float supplyVoltage   = emon1.Vrms;
float power = currentDraw * supplyVoltage;
last_time = current_time;
current_time = millis();
Wh = Wh + power *(( current_time -last_time) /3600000.0) ; 
KWh = (Wh/1000) + preKWh;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("VOLTAGE: ");
lcd.print(supplyVoltage);
lcd.print(" V");
lcd.setCursor(0,1);
lcd.print("CURRENT: ");
lcd.print(currentDraw);
lcd.print(" A");
lcd.setCursor(0,2);
lcd.print("POWER: ");
lcd.print(power);
lcd.print(" W");
lcd.setCursor(0,3);
lcd.print("ENERGY: ");
lcd.print(KWh);
lcd.print(" KWh");

delay(100);  
if (isnan(Wh)) {                       // if Wh is Not A Number
Serial.println(F("Error reading Energy!"));
}
else {
Serial.print(F("preKWh: "));
Serial.print(preKWh);
Serial.println(F("KWH"));
Serial.print(F("Energy: "));
Serial.print(KWh);
Serial.println(F("KWH"));
Firebase.setDouble(firebaseData, path , KWh);

delay(100);
}

}

void initWifi(){
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);

//Set database read timeout to 1 minute (max 15 minutes)
Firebase.setReadTimeout(firebaseData, 1000 * 60);
//tiny, small, medium, large and unlimited.
//Size and its write timeout e.g. tiny (1s), small (10s), medium (30s) and large (60s).
Firebase.setwriteSizeLimit(firebaseData, "tiny");
}

有人能帮我查一下密码吗。应该做哪些更改?

查看您的数据类型,您将WhKWh存储为一个整数,并向它们添加可能非常小的浮点值(假设(current_time - last_time)1000(1秒(,然后Wh将变为Wh + power * 2.78e-5,这将导致舍入错误,除非您的功耗非常大。要解决此问题,不应四舍五入为整数,并将WhKWh保持为浮点值。

相关内容

  • 没有找到相关文章

最新更新