//EPEVER MPPT Tracer A, B, AN, BN, Xtra Blynk IoT Communication & Monitoring - Tested 100% Working on Generic ESP32 Module.
//Re-Write & Modified by RBMK-5000, Thanks to @jaminNZx, @tekk & @Wimbozone for Earlier Reference Scripts, Great Job!
//Use the common Serial TTL to RS-485 Module (Rx & Tx), Do not use Max485 TTL Module (RO,RE,DE,DI).
//Std Modbus RTU Prtocol Applied, in conjunction with EPSolar Modbud Registers.
//____________________________________________________________________________________________________________________________
#define BLYNK_TEMPLATE_ID "Blynk Template ID" // Fill with your Blynk Template ID
#define BLYNK_TEMPLATE_NAME "Blynk Template Name" // Fill with your Blynk Template Name
#define BLYNK_AUTH_TOKEN "Blynk Auth Token" // Fill with your Blynk Auth Token
#define BLYNK_PRINT Serial
#define RXD0 3
#define TXD0 1
#include <ModbusMaster.h>
#include <BlynkSimpleEsp32.h>
#include <WiFi.h>
ModbusMaster epever;
BlynkTimer timer;
void preTransmission() {
digitalWrite(RXD0, 1);
digitalWrite(TXD0, 1);
}
void postTransmission() {
digitalWrite(RXD0, 0);
digitalWrite(TXD0, 0);
}
void setup() {
pinMode(RXD0, OUTPUT);
pinMode(TXD0, OUTPUT);
digitalWrite(RXD0, 0);
digitalWrite(TXD0, 0);
Serial.begin(115200);
epever.begin(1, Serial);
epever.preTransmission(preTransmission);
epever.postTransmission(postTransmission);
Blynk.begin("BLYNK_AUTH_TOKEN", "WiFi_SSID", "WiFi_Password", "blynk.cloud", 8080); // Fill with your Blynk Auth Token, WiFi SSID & Password
timer.setInterval(10000, GetData);
}
void GetData() {
uint8_t energyMeterResult, tempResult, generateEnergyResult, statusLoadResult;
if (Blynk.connected()) {
epever.clearResponseBuffer();
energyMeterResult = epever.readInputRegisters(0x3100, 7);
if (energyMeterResult == epever.ku8MBSuccess) {
Blynk.virtualWrite(V0, epever.getResponseBuffer(0x00) / 100.0f); // PV Input Voltage (V)
Blynk.virtualWrite(V1, epever.getResponseBuffer(0x01) / 100.0f); // PV Current (A)
Blynk.virtualWrite(V2, epever.getResponseBuffer(0x04) / 100.0f); // Battery Voltage (V)
Blynk.virtualWrite(V3, epever.getResponseBuffer(0x05) / 100.0f); // Battery Charge Current (A)
Blynk.virtualWrite(V4, epever.getResponseBuffer(0x02) / 100.0f); // PV Power (W)
Blynk.virtualWrite(V5, epever.getResponseBuffer(0x06) / 100.0f); // Battery Charge Power (W)
}
else {
Serial.print("Error Reading energyMeterResult");
Serial.println(energyMeterResult);
}
delay(600);
epever.clearResponseBuffer();
statusLoadResult = epever.readInputRegisters(0x310E, 1);
if (statusLoadResult == epever.ku8MBSuccess) {
Blynk.virtualWrite(V6, epever.getResponseBuffer(0x00) / 100.0f); // Load Power (W)
}
else {
Serial.print("Error Reading statusLoadResult");
Serial.println(statusLoadResult);
}
delay(600);
epever.clearResponseBuffer();
statusLoadResult = epever.readInputRegisters(0x310C, 1);
if (statusLoadResult == epever.ku8MBSuccess) {
Blynk.virtualWrite(V7, epever.getResponseBuffer(0x00) / 100.0f); // Load Voltage (V)
}
else {
Serial.print("Error Reading statusLoadResult");
Serial.println(statusLoadResult);
}
delay(600);
epever.clearResponseBuffer();
statusLoadResult = epever.readInputRegisters(0x310D, 1);
if (statusLoadResult == epever.ku8MBSuccess) {
Blynk.virtualWrite(V8, epever.getResponseBuffer(0x00) / 100.0f); // Load Current (A)
}
else {
Serial.print("Error Reading statusLoadResult");
Serial.println(statusLoadResult);
}
delay(600);
epever.clearResponseBuffer();
generateEnergyResult = epever.readInputRegisters(0x3312, 1);
if (generateEnergyResult == epever.ku8MBSuccess) {
Blynk.virtualWrite(V9, epever.getResponseBuffer(0x00) / 100.0f); // Total Generated Energy (kWh)
}
else {
Serial.print("Error Reading generateEnergyResult");
Serial.println(generateEnergyResult);
}
delay(600);
epever.clearResponseBuffer();
energyMeterResult = epever.readInputRegisters(0x311A, 1);
if (energyMeterResult == epever.ku8MBSuccess) {
Blynk.virtualWrite(V10, epever.getResponseBuffer(0x00) / 1.0f); // Battery SOC Percentage (%)
}
else {
Serial.print("Error Reading energyMeterResult");
Serial.println(energyMeterResult);
}
delay(600);
epever.clearResponseBuffer();
energyMeterResult = epever.readInputRegisters(0x3110, 3);
if (tempResult == epever.ku8MBSuccess) {
Blynk.virtualWrite(V11, epever.getResponseBuffer(0x00) / 100.0f); // Battery Temp (C deg)
Blynk.virtualWrite(V12, epever.getResponseBuffer(0x01) / 100.0f); // MPPT inside case Temp (C deg)
Blynk.virtualWrite(V13, epever.getResponseBuffer(0x02) / 100.0f); // MPPT Component Temp (C deg)
}
else {
Serial.print("Error Reading tempResult");
Serial.println(tempResult);
}
epever.clearResponseBuffer();
}
}
void loop() {
Blynk.run();
timer.run();
}