Проблема с подключением двух датчиков

Здравствуйте!
У меня возникла проблема с подключением датчиков. Датчики измеряют скорость и направление ветра. У меня тех.задание подключить их к плате ардуино нано через модуль hw-97. Но проблема в том, что когда использую библиотеку SoftwareSerial, то информация идет только с одного датчика, хотя адреса у каждого свои:
{0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};
и
{0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};

Подскажите пожалуйста как можно решить эту проблему? Пробовал библиотеку ArduinoModbus, но я в ней не разобрался.

У нас хрустальный шар на профилактике !!!
ХЗ какой код не работает на ХЗ каких датчиках …

С реализацией ТЗ вам в платный раздел !

ХЗ куда и как подключённых.

Датчики используются PR-fxjt и PR-fsjt. Подключены плате hw-97, которая подключена к плате ардуино нано к пинам D2, D3, D7, D8.
Вот код:

//#include <ModbusMaster.h>
#include <SoftwareSerial.h>
#include <Wire.h>

#define RE 8
#define DE 7
uint8_t reg_data[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};
uint8_t reg_data_1[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
//byte Anemometer_request[] = {0x01, 0x03, 0x00, 0x16, 0x00, 0x01, 0x65, 0xCE};
uint8_t Anemometer_request[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
uint8_t Anemometer_request_1[] = {0x01, 0x03, 0x00, 0x16, 0x00, 0x01, 0x65, 0xCE};
uint8_t receive_data[19];
uint8_t receive_data_1[19];
float reg1, reg2, reg3, reg4, reg5, reg6, reg7, crc16;
uint32_t display_timer = 0, read_timer = 0;


byte values[11];
bool state = true;
SoftwareSerial mod(2, 3);
SoftwareSerial mod2(2, 3);
//ModbusMaster node;

/*void preTransmission()
{
  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
}


void postTransmission()
{
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);
}
*/
void readData() {
  // tranmission enable
  Serial.println("========================");
   mod.begin(4800);
  
  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  if (mod.write(Anemometer_request, sizeof(Anemometer_request)) == 8) {
    // receiving enable
    mod.flush();
    byte Anemometer_buf[8];
    digitalWrite(DE, LOW);
    digitalWrite(RE, LOW);
    //mod.readBytes(receive_data, 19);
    mod.readBytes(Anemometer_buf, 8);
    Serial.println("OK!!!!!");
    for (int i=0; i<8; i++)
    {
      Serial.print(Anemometer_buf[i]);
    }
    Serial.println();
    Serial.print(Anemometer_buf[4]);
    Serial.print(" m/s");
    //Serial.println(reg1);
    Serial.println("=======");
    //    Serial.write(receive_data, sizeof(receive_data));
    reg1 = receive_data[3] << 8 | receive_data[4];
    reg1 = reg1 / 10;
    //reg2 = receive_data[5] << 8 | receive_data[6];
    //reg2 = reg2 / 10;
  }
  mod.end();
  delay(1000);
  mod2.begin(4800);
  
  if (mod2.write(Anemometer_request_1, sizeof(Anemometer_request_1)) == 8) {
    // receiving enable
    mod2.flush();
    byte Anemometer_buf2[8];
    digitalWrite(DE, LOW);
    digitalWrite(RE, LOW);
    Serial.println("OK!!!!!");
    //mod2.readBytes(receive_data_1, 19);
    mod2.readBytes(Anemometer_buf2, 8);
    for (int i=0; i<19; i++)
    {
      Serial.print(Anemometer_buf2[i]);
    }
    Serial.println();   
    Serial.print(Anemometer_buf2[4]);
    Serial.print(" m/s");
    //Serial.println(reg1);
    Serial.println("=======");
    //    Serial.write(receive_data, sizeof(receive_data));
    reg1 = receive_data[3] << 8 | receive_data[4];
    reg1 = reg1 / 10;
    //reg2 = receive_data[5] << 8 | receive_data[6];
    //reg2 = reg2 / 10;
  }
   mod2.end();

   Serial.println("========================");
}

void setup() {
  Serial.begin(9600);//9600
  //Serial1.begin(9600);
  //mod.begin(4800);
  //mod2.begin(4800);
  
  /*if (!ModbusRTUClient.begin(4800, SERIAL_8E1)) {
    Serial.println("Failed to start Modbus RTU Client!");
    while (1);
  }*/
  pinMode(RE, OUTPUT);
  pinMode(DE, OUTPUT);
  //node.begin(1, Serial);
  //node.preTransmission(preTransmission);
  //node.postTransmission(postTransmission);
  delay(1000);
}

void loop() {
  if (millis() - display_timer >= 1000) {
    /*Serial.print("Wind speed: ");
    //speed_val = analogRead(speed_pin);
    sensorValue = analogRead(speed_pin);
    sensorVoltage = sensorValue * voltageConversionConstant;
    if (sensorVoltage <= voltageMin){
      windSpeed = 0; //Check if voltage is below minimum value. If so, set wind speed to zero.
    }else {
      windSpeed = (sensorVoltage - voltageMin)*windSpeedMax/(voltageMax - voltageMin); //For voltages above minimum value, use the linear relationship to calculate wind speed.
    }
    Serial.println(windSpeed);*/
    //Serial.println(speed_val);
    /*uint8_t result;
    result = node.writeSingleCoil(0x01, state);
    state = !state;
    result = node.readInputRegisters(0x03,6);

    if (result == node.ku8MBSuccess)
    {
      Serial.println(node.getResponseBuffer(0x00)/100.0f);
      Serial.println(node.getResponseBuffer(0x02)/100.0f);
      Serial.println(node.getResponseBuffer(0xC4)/100.0f);
      Serial.println(node.getResponseBuffer(0x0B)/100.0f);
    }
    else
    {
      Serial.println("Error");
    }*/
    
    /*if (!ModbusRTUClient.requestFrom(1, HOLDING_REGISTERS, 0x01, 2)) 
    {
    Serial.print("failed to read registers! ");
    Serial.println(ModbusRTUClient.lastError());
    } 
    else 
    {
      // If the request succeeds, the sensor sends the readings, that are
      // stored in the holding registers. The read() method can be used to
      // get the raw temperature and the humidity values.
      short wind_speed = ModbusRTUClient.read();
      Serial.println(wind_speed); 
    }*/
    readData();    
    
    display_timer = millis();
    Serial.print("Wind speed: ");
    Serial.print(reg1);
    Serial.println();
    Serial.print("Wind direction: ");
    Serial.print(reg2);
    Serial.println("°");
    
  }
}

Что ожидается от такой комбинации?

Хотел показать коллегам, что их предложенное решение не работает. А потом забыл удалить.

А это как понимать? Адрес в обоих случаях один и тот же - 0x01.

Оба датчика имеют по умолчанию этот адрес. Я ведь правильно вас понял, что пока я не поменяю адрес устройства, то работать будет только один?

Отвечать могут оба. Пакеты будут или портится или приходить друг за другом, но различить кто ответил, не удастся, если адрес обоих устройств одинаков.

Нужен второй hw-97 … или реле с двумя группами и переключать …

А изменить их адрес по умолчанию можно подключив устройства к компьютеру? Или можно как то по другому?

Ясно, сейчас пробую этот вариант.

Я не имею ни понятия, ни такого оборудования. Самое простое - сделать две линии, каждая со своим софтсериалом и конвертором.

Datasheet есть на них ?

На датчики? Есть то что скачал из сети. И даже скинули какой-то софт с оф. сайта.

в документации на датчик должна быть команда на запись адреса. Также вам нужно будет добавить проверку контрольной суммы, в ваших командах она рассчитана заранее, тоже так делал если команда константа, но на приеме получаемое значение с датчика будет меняться и нужно будет сделать проверку CRC. Также нужно правильно соблюсти тайминги ответа с датчика и последующей отправки поскольку у вас RTU, это тоже должно быть в документации на ваш датчик
image