Power Flow
Power Flow
h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include "REG_PM5300.h"
#include <ModbusMaster.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <AsyncElegantOTA.h>
#include <WebSerial.h>
#include <ESPDash.h>
#define baud 9600
#define timeout 100
#define polling 100
#define retry_count 10
ModbusMaster node;
#define flow_sensor 14
#define flow_sensor1 27
#define MAX485_DE 26
#define MAX485_RE_NEG 25
WiFiClient espClient;
PubSubClient client(espClient);
const char* topicName = "/machine/powermeter2";
char data[138];
long lastMsg = 0;
char msg[256];
int value = 0;
int DELAY = 3000;
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
uint32_t FloatTohex(float x)
{
return (*(uint32_t*)&x);
}
//------------------------------------------------
uint16_t data[17];
uint32_t value = 0;
node.begin(ID_meter,Serial2);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
// Serial.print(data[1],HEX);
// Serial.println(data[0],HEX);
// value = data[1];
// value = value << 16;
// value = value + data[0];
value = data[0];
value = value << 16;
value = value + data[1];
i = HexTofloat(value);
return i;
}
else
{
Serial.print("Connect modbus fail. REG >>> "); Serial.println(REG); // Debug
delay(1000);
return 0;
}
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
}
AsyncWebServer server(80);
ESPDash dashboard(&server);
Card card1(&dashboard, GENERIC_CARD, "Volt A");
Card card2(&dashboard, GENERIC_CARD, "Volt B");
Card card3(&dashboard, GENERIC_CARD, "Volt C");
Card card4(&dashboard, GENERIC_CARD, "Ampere A");
Card card5(&dashboard, GENERIC_CARD, "Ampere B");
Card card6(&dashboard, GENERIC_CARD, "Ampere C");
Card card7(&dashboard, GENERIC_CARD, "KW");
Card card8(&dashboard, GENERIC_CARD, "KWH");
Card card9(&dashboard, GENERIC_CARD, "Power Factor");
Card card10(&dashboard, PROGRESS_CARD, "Reset Progress", "", 0, 201680);
Chart chart1(&dashboard, BAR_CHART, "Voltage");
Chart chart2(&dashboard, BAR_CHART, "Current");
Card card11(&dashboard, HUMIDITY_CARD, "Solar Heater Flow", "L/min");
Card card12(&dashboard, HUMIDITY_CARD, "Rainwater Flow", "L/min");
//
***********************************************************************************
***************************
void setup()
{
Serial.begin(baud);
Serial2.begin(baud,SERIAL_8E1, 16, 17);
// Serial.println(F("Test"));
pinMode(flow_sensor, INPUT);
pinMode(flow_sensor1, INPUT);
attachInterrupt(digitalPinToInterrupt(flow_sensor1), detectInterruptSignal,
FALLING); // RISING(LOW->HIGH), FALLING(HIGH->LOW),CHANGE
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
WiFi.disconnect(true);
delay(1000);
WiFi.onEvent(WiFiStationConnected, SYSTEM_EVENT_STA_CONNECTED);
WiFi.onEvent(WiFiGotIP, SYSTEM_EVENT_STA_GOT_IP);
WiFi.onEvent(WiFiStationDisconnected, SYSTEM_EVENT_STA_DISCONNECTED);
WiFi.begin(ssid, password);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
Serial.println();
Serial.println();
Serial.println("Wait for WiFi... ");
void reconnect() {
while (!client.connected()) {
WebSerial.print("Attempting MQTT connection...");
if (client.connect("")) {
WebSerial.println("connected");
client.subscribe("/machine/powermeter2");
} else {
WebSerial.print("failed, rc=");
WebSerial.print(client.state());
WebSerial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void loop()
{
AsyncElegantOTA.loop();
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > DELAY) {
lastMsg = now;
StaticJsonDocument<256> doc;
uint32_t pulse = pulseIn(flow_sensor,HIGH);
//uint32_t pulse1 = pulseIn(flow_sensor1,HIGH);
undisplayCount = unpulseCount;
// data["Active_Energy"] = Read_Meter_float(ID_meter, Reg_ActEnergyLoadIN);
// data["A"] = Read_Meter_float(ID_meter, Reg_CurrentA);
// data["B"] = Read_Meter_float(ID_meter, Reg_CurrentB);
// data["C"] = Read_Meter_float(ID_meter, Reg_CurrentC);
// data["N"] = Read_Meter_float(ID_meter, Reg_CurrentN);
// data["Voltage_AB"] = Read_Meter_float(ID_meter, Reg_VoltAB);
// data["Voltage_BC"] = Read_Meter_float(ID_meter, Reg_VoltBC);
// data["Voltage_CA"] = Read_Meter_float(ID_meter, Reg_VoltCA);
// data["Voltage_LL"] = Read_Meter_float(ID_meter, Reg_VoltLLAvg);
// data["Voltage_LL_Worst"] = Read_Meter_float(ID_meter, Reg_VoltULLWorst);
// data["Voltage_LN_Worst"] = Read_Meter_float(ID_meter, Reg_VoltULNWorst);
// data["Active_A"] = Read_Meter_float(ID_meter, Reg_AcPwrA);
// data["Active_B"] = Read_Meter_float(ID_meter, Reg_AcPwrB);
// data["Active_C"] = Read_Meter_float(ID_meter, Reg_AcPwrC);
// data["Total_Active"] = Read_Meter_float(ID_meter, Reg_AcPwrTot);
// data["Power_Factor"] = Read_Meter_float(ID_meter, Reg_PwrFTot);
// doc["date"] = timeClient.getFormattedTime();
float voltA = Read_Meter_float(ID_meter, Reg_VoltAB);
float voltB = Read_Meter_float(ID_meter, Reg_VoltBC);
float voltC = Read_Meter_float(ID_meter, Reg_VoltCA);
float ampA = Read_Meter_float(ID_meter, Reg_CurrentA);
float ampB = Read_Meter_float(ID_meter, Reg_CurrentB);
float ampC = Read_Meter_float(ID_meter, Reg_CurrentC);
float kw = Read_Meter_float(ID_meter, Reg_AcPwrTot);
float kwh = Read_Meter_float(ID_meter, Reg_ActEnergyLoadIN);
float p_factor = Read_Meter_float(ID_meter, Reg_PwrFTot);
float percentage = (kwh/201680)*100;
float Hz = 0.00046*pulse;
float flow = Hz;
//float Hz1 = 0.00046*pulse1;
//float flow1 = Hz1;
float flow1 = undisplayCount * 4.6E-4;
if (isinf(flow)) {
flow = 0;
}
//if (isinf(flow1)) {
// flow1 = 0;
//}
doc["volt_a"] = voltA;
doc["volt_b"] = voltB;
doc["volt_c"] = voltC;
doc["amp_a"] = ampA;
doc["amp_b"] = ampB;
doc["amp_c"] = ampC;
doc["kw"] = kw;
doc["kwh"] = kwh;
doc["p_factor"] = p_factor;
doc["temp_hot_tank"] = p_factor;
doc["temp_tank"] = p_factor;
doc["temp_solar_heater"] = p_factor;
doc["flow_solar_heater"] = flow;
doc["flow_rain_water"] = flow1;
doc["flow_main"] = p_factor;
char buffer[256];
serializeJson(doc, buffer);
client.publish(topicName, buffer);
WebSerial.println(buffer);
String XAxis[] = {"A", "B", "C"};
int YAxis1[3];
int YAxis2[3];
YAxis1[0] = voltA;
YAxis1[1] = voltB;
YAxis1[2] = voltC;
YAxis2[0] = ampA;
YAxis2[1] = ampB;
YAxis2[2] = ampC;
card1.update(voltA);
card2.update(voltB);
card3.update(voltC);
card4.update(ampA);
card5.update(ampB);
card6.update(ampC);
card7.update(kw);
card8.update(kwh);
card9.update(p_factor);
card10.update(percentage, "%");
card11.update(flow);
card12.update(flow1);
chart1.updateX(XAxis, 3);
chart2.updateX(XAxis, 3);
chart1.updateY(YAxis1, 3);
chart2.updateY(YAxis2, 3);
dashboard.sendUpdates();
}
void detectInterruptSignal()
{
unpulseCount++;
bdetectOn = true;
}