ARDUINO RS485 to TTL данные только от первого устройства

Есть схема в три устройства: Arduino + RS485 to TTL. Одна из arduino выступает в роли управляющей (собирающей данные). Master - всегда установлен на приём, а slave - слушатели, переключаются на отправку, раз в несколько секунд. На master приём только от одного устройства, которое успеет первым отправить сигнал. Как исправить? Мне нужно получать со всех arduino данные, а не только с того, ктот первый успел. введите сюда описание изображения

MASTER

/*
  Библиотека для работы с JSON
*/
#include <ArduinoSTL.h>

/*
  Библиотека для работы с JSON
*/
#include <ArduinoJson.h>

/*
  Контакт 2 переключает режим приёмник/передатчик
*/
#define SerialTxControl 2

#define RS485Transmit HIGH
#define RS485Receive LOW

char buffer[100];
byte state = 0;

/*
   Массив для хранения показателей приборов
*/
char *dev[12];

StaticJsonDocument<200> doc;

void setup(void)
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  pinMode(SerialTxControl, OUTPUT);

  /*
    Переключение устройства в режим приёмника
  */
  digitalWrite(SerialTxControl, RS485Receive);

  while (!Serial)
    continue;
}

void loop(void)
{
  if (Serial.available())
  {
    if (Serial.available())
    {
      String response = Serial.readString();

      DeserializationError error = deserializeJson(doc, response);

      if (error)
      {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.c_str());
        return;
      }

      const char *device = doc["device"];
      String temperature = doc["temperature"];
      int is_locked = doc["is_locked"];

      Serial.print("Device: " + String(device) + " | ");
      Serial.print("Temperature: " + temperature + " | ");
      Serial.print("Is locked: " + String(is_locked) + " | ");
      Serial.println();
    }
  }
}

SLAVE

/*
  Библиотека для работы с JSON
*/
#include <ArduinoJson.h>

/*
  Контакт 2 переключает режим приёмник/передатчик
*/
#define SerialTxControl 2

#define RS485Transmit HIGH
#define RS485Receive LOW

/*
  Номер устройства
*/
#define ID "1"

StaticJsonDocument<200> doc;

void setup(void)
{
  Serial.begin(9600);
  pinMode(SerialTxControl, OUTPUT);

  /*
    Переключение устройства в режим передатчика
  */
  digitalWrite(SerialTxControl, RS485Receive);

  while (!Serial)
    continue;
}

void loop(void)
{

digitalWrite(SerialTxControl, RS485Transmit);

doc["device"] = ID;
doc["temperature"] = String(random(24, 26));
doc["is_locked"] = random(0, 1);

String(serializeJson(doc, Serial));

digitalWrite(SerialTxControl, RS485Receive);
delay(4000);
}

Ответы (1 шт):

Автор решения: AFTeam

В RS485 передающим устройством может быть только одно в момент времени. Поэтому алгоритм работы примерно следующий:

мастер: Переключился в режим передачи Отправил запрос определённому устройству Переключился в режим приёма Получил данные

клиент (постоянно ждёт) Получил запрос Проверил ему ли этот запрос Если ему, то переключился в режим передачи, отправил данные, переключился в режим приёма.

Передача идёт широковещательная

→ Ссылка