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 шт):
В RS485 передающим устройством может быть только одно в момент времени. Поэтому алгоритм работы примерно следующий:
мастер: Переключился в режим передачи Отправил запрос определённому устройству Переключился в режим приёма Получил данные
клиент (постоянно ждёт) Получил запрос Проверил ему ли этот запрос Если ему, то переключился в режим передачи, отправил данные, переключился в режим приёма.
Передача идёт широковещательная