Introduction: Use Arduino to Communicate With Tracer MT5 Charge Controller

I bought an MPPT TRACER 3215RN Solar Charge Controller, made by EP Solar (I've also seen SainSonic mentioned as the manufacturer, but it's the same product). I wanted to use my computer to monitor the PV panel and battery instead of buying the manufacturer's MT-5 Remote Meter, (a) because I wanted to log the data on my computer, and (b) why spend $36 when you don't need to.

I hunted around on the Internet and found a straightforward way of doing this with an Arduino Uno. I hope it works for you.

Step 1: Prepare Ethernet Cable

Get an Ethernet cable. It makes your head spin when you start looking into connector standards (technically the Tracer uses 8P8C), but so long as it has 8 wires it should be ok.

Cut the connector off one end.

Plug the end with the connector still on it into the Tracer.

On the end you just cut, use a multimeter to determine which wires are which:

- 4 of them will be ground

- 2 of them will be approx +12V

- 2 of them will be approx +3.3V

Trim off three of the ground wires and the two 12V wires, so you're left with one ground wire and the two 3.3V wires.

I then soldered breadboard wires to the three used wires to make it easy to hook up to the Arduino.

Step 2: Install This Arduino Sketch

This Arduino sketch (and most of the info in this posting) is from https://github.com/xxv/tracer However they used a serial baud rate of 57600, I had to drop it to 9600 to work on my Arduino/computer combination.

I had some trouble copying and pasting the sketch below because of unsupported characters, so if you get any errors with the sketch get the original from the github site.

/*
* An interface to the Tracer solar regulator. * Communicating in a way similar to the MT-5 display */

#include

SoftwareSerial myserial(10, 11); // RX, TX

uint8_t start[] = { 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xEB, 0x90, 0xEB, 0x90, 0xEB, 0x90 }; uint8_t id = 0x16; uint8_t cmd[] = { 0xA0, 0x00, 0xB1, 0xA7, 0x7F };

uint8_t buff[128];

void setup() { Serial.begin(9600);

myserial.begin(9600); }

float to_float(uint8_t* buffer, int offset){ unsigned short full = buffer[offset+1] << 8 | buff[offset];

return full / 100.0; }

void loop() { Serial.println("Reading from Tracer");

myserial.write(start, sizeof(start)); myserial.write(id); myserial.write(cmd, sizeof(cmd));

int read = 0;

for (int i = 0; i < 255; i++){ if (myserial.available()) { buff[read] = myserial.read(); read++; } }

Serial.print("Read "); Serial.print(read); Serial.println(" bytes");

for (int i = 0; i < read; i++){ Serial.print(buff[i], HEX); Serial.print(" "); }

Serial.println();

float battery = to_float(buff, 9); float pv = to_float(buff, 11); //13-14 reserved float load_current = to_float(buff, 15); float over_discharge = to_float(buff, 17); float battery_max = to_float(buff, 19); // 21 load on/off // 22 overload yes/no // 23 load short yes/no // 24 reserved // 25 battery overload // 26 over discharge yes/no uint8_t full = buff[27]; uint8_t charging = buff[28]; int8_t battery_temp = buff[29] - 30; float charge_current = to_float(buff, 30);

Serial.print("Load is "); Serial.println(buff[21] ? "on" : "off");

Serial.print("Load current: "); Serial.println(load_current);

Serial.print("Battery level: "); Serial.print(battery); Serial.print("/"); Serial.println(battery_max);

Serial.print("Battery full: "); Serial.println(full ? "yes " : "no" );

Serial.print("Battery temperature: "); Serial.println(battery_temp);

Serial.print("PV voltage: "); Serial.println(pv);

Serial.print("Charging: "); Serial.println(charging ? "yes" : "no" );

Serial.print("Charge current: "); Serial.println(charge_current);

delay(1000); }

Step 3: Connect Wires to Arduino

Connect the ground wire to Arduino ground.

One of the 3.3V wires connects to Arduino pin 10, and the other 3.3V wire connects to Arduino pin 11. There's probably a way of telling which goes which from the colors (comments welcome!), but there's only 2 wires so just swap them if it doesn't work first time.

Watch the results in the serial window (terminal emulator) on your computer.

Good luck!

Home Technology Contest

Participated in the
Home Technology Contest