Hi i need help whenever i try to get the reading showed on my single phase analyzer (SDM120ct-Eastron).I upload my code in ESP32 Dev Kit V1.I also used RS485 TTL convertor but it seems the serial monitor gives output such as FV�Q�\Q��x�x�x�x�xx������xx��xx�x��x�x��x��x��x��x
This is my final year project and really need help
my project code is
#include "REG_SDM120.h"
#include <ModbusMaster.h>
HardwareSerial Mod(2); //use uart 2
ModbusMaster node;
//01 04 00 00 00 02 71 3F // Test 30001
//------------------------------------------------
// Convent 32bit to float
//------------------------------------------------
float HexTofloat(uint32_t x) {
return ((float)&x);
}
uint32_t FloatTohex(float x) {
return ((uint32_t)&x);
}
//------------------------------------------------
float Read_Meter_float(char addr , uint16_t REG) {
float i = 0;
uint8_t j, result;
uint16_t data[2];
uint32_t value = 0;
node.begin(addr, Mod);
result = node.readInputRegisters (REG, 2); ///< Modbus function 0x04 Read Input Registers
delay(500);
if (result == node.ku8MBSuccess) {
for (j = 0; j < 2; j++)
{
data[j] = node.getResponseBuffer(j);
}
value = data[0];
value = value << 16;
value = value + data[1];
i = HexTofloat(value);
//Serial.println("Connec modbus Ok.");
return i;
} else {
Serial.print("Connec modbus fail. REG >>> "); Serial.println(REG, HEX); // Debug
delay(1000);
return 0;
}
}
void GET_METER() { // Update read all data
delay(1000); //
for (char i = 0; i < Total_of_Reg ; i++){
DATA_METER [i] = Read_Meter_float(ID_meter, Reg_addr[i]);// ID_METER_ALL=X
}
}
//**************************************************************************************************************
void setup() {
Serial.begin(2400);
Serial.println("program started");
Serial.println();
Serial.println();
Serial.println(F("RS485 RTU SDM120***"));
}
void loop() {
//float x = Read_Meter_float(ID_meter,Reg_Volt);
GET_METER();
Serial.println();
Serial.print("Voltage = "); Serial.print(DATA_METER[0]);Serial.println(" VAC");
Serial.print("Current = "); Serial.print(DATA_METER[1]);Serial.println(" Amps");
Serial.print("Active Power= "); Serial.print(DATA_METER[2]);Serial.println(" Watts");
Serial.print("Power Factor = "); Serial.println(DATA_METER[3]);
Serial.print("Frequency = "); Serial.print(DATA_METER[4]);Serial.println(" Hz");
Serial.print("Total Active Energy = "); Serial.print(DATA_METER[5]);Serial.println(" kWh");
delay(5000);
}
the REG_SDM120.h
#define ID_meter 0x01
#define Total_of_Reg 6
#define Reg_Volt 0x0000 // 0.
#define Reg_Current 0x0006 // 1.
#define Reg_ActivePower 0x000C // 2.
#define Reg_PowerFactor 0x001E // 3.
#define Reg_Frequency 0x0046 // 4.
#define Reg_TotalActiveEnergy 0x0156 // 5.
uint16_t const Reg_addr[6] = {
Reg_Volt,
Reg_Current,
Reg_ActivePower,
Reg_PowerFactor,
Reg_Frequency,
Reg_TotalActiveEnergy
};
float DATA_METER [Total_of_Reg] ;