Page 1 of 1

Heltec Wireless Stick V3: Modbus RS485 not working

Posted: Wed Mar 13, 2024 5:27 pm
by iotdeveloper
Hello,I am trying to set up communication with the Epever MPPT controller via Modbus. Unfortunately, with Heltec Wireless Stick V3 (https://heltec.org/project/wireless-stick-v3/) the communication does not work - on the serial port it says something like:

Code: Select all

1~⸮226
I tried the same code on the ESP32 Wroom kit + external converter with MAX485, where the communication works properly and I get data from the controller as:

Code: Select all

PV Voltage:
0.00
PV Current:
0.00
Battery Voltage:
12.47
I am using MAX3485 converter, pins DE and RE_NEG are defined and wired the same. I have connected the RO and DI pins of the converter to the RX and TX pins of the Heltec Wireless Stick V3 board.

The connection of MAX3485 and Heltec WS is:

RO -> RX (GPIO 44)
RE| -> 46
DE -> 45
DI -> TX (GPIO 43)

The registers are definitely defined correctly, so the problem must be in the communication between Wireless Stick and converter for RS485.

I also tried the Heltec WiFi LoRa32 V3 board, and it still didn’t work.

I am attaching the code that I was trying with Heltec Wireless Stick V3:

Code: Select all

#include <ModbusMaster.h>

#define MAX485_DE     45
#define MAX485_RE_NEG 46

ModbusMaster node;

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

void setup()
{

  pinMode(Vext,OUTPUT);
  digitalWrite(Vext, LOW);

  
  // put your setup code here, to run once:
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  // Init in receive mode
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);

  // Modbus communication runs at 115200 baud
  Serial.begin(115200);

  //Modbus slave ID 1
  node.begin(1, Serial);
  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);

  Serial.println("test");
}

void loop()
{
  // put your main code here, to run repeatedly:
  uint8_t resultMain;

  resultMain = node.readInputRegisters(0x3100, 6);
  Serial.println( resultMain );
  if (resultMain == node.ku8MBSuccess)
  {
    Serial.println(" - - - - - - - - ");
    Serial.println("PV Voltage: ");
    Serial.println(node.getResponseBuffer(0x00) / 100.0f);
    Serial.println("PV Current: ");
    Serial.println(node.getResponseBuffer(0x01) / 100.0f);
    Serial.println("Battery Voltage: ");
    Serial.println(node.getResponseBuffer(0x04) / 100.0f);
    Serial.println("Battery Charge Current: ");
    Serial.println(node.getResponseBuffer(0x05) / 100.0f);
  }

  delay(1000);

}

When I open the serial monitor in the arduino IDE, only periodic nonsense strings are displayed.

Do you see a bug in the code or do you know how to make the communication work? Thanks