Передача данных по RS485 с применением ретранслятора для увеличения дальности передачи.

SVD
Offline
Зарегистрирован: 05.04.2018

Доброго времени суток. Помогите пожалуйста написать скетч для ретранслятора на ArduinoUNO.



Суть следующая, UNO-1 собирает данные с датчиков температуры далее передает их на UNO-2 по RS485, которая просто передает их на UNO-3 также по RS485. (Расстояние между всеми контроллерами 1000 м.)



Скетч для UNO-1:

#include <Wire.h>
#include <SoftEasyTransfer.h>
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// сигнальный провод подключен к 2 пину на Arduino
#define ONE_WIRE_BUS 2
// выберем разрешение от 9 до 12
#define TEMPERATURE_PRECISION 9

// настроем библиотеку 1-Wire для связи с датчиком
OneWire oneWire(ONE_WIRE_BUS);

// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire);

// создаем массивы для хранения адреса датчиков
DeviceAddress insideThermometer, outsideThermometer;

SoftwareSerial mySerial(7, 6);                // Serial для RS485
#define DIR 13                                // переключатель прием\передача
SoftEasyTransfer ET;

struct SEND_DATA_STRUCTURE{                   // структура которую будем передавать
  float SHT20_T;
  float SHT20_RH;
};

SEND_DATA_STRUCTURE txdata;

// функция вывода адреса датчика
void printAddress(DeviceAddress deviceAddress){
  for (uint8_t i = 0; i < 8; i++){
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}


void setup() {
  Serial.begin(9600); 
  mySerial.begin(9600);
 
  sensors.begin();    // инициализируем работу с датчиком

  sensors.getAddress(insideThermometer, 0);    // сделаем запрос на получение адреса датчика
  sensors.getAddress(outsideThermometer, 1);

  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION); // установим выбранное разрешение датчика
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
  ET.begin(details(txdata), &mySerial);  
  Wire.begin();
 
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW);                          // включаем прием
}

void loop() {  
      
  sensors.requestTemperatures();   // отправляем запрос на измерение температуры
  float tempC0 = sensors.getTempC(insideThermometer);  // создаем переменную для хранения температуры в градусах Цельсия и выводим её значение
  float tempC1 = sensors.getTempC(outsideThermometer);
  delay(500);
 
    txdata.SHT20_T = tempC0;             // пишим данные в структуру
    txdata.SHT20_RH = tempC1;
  digitalWrite(DIR, HIGH);                      // включаем передачу
    delay(1);                                     // небольшая задержка, иначе неуспевает
    ET.sendData();                              // отправляем    
    delay(50);                                  // небольшая задержка, иначе неуспевает      
  digitalWrite(DIR, LOW);                       // включаем прием
     
  
}

Скетч для UNO-2 который нужно изменить и сделать ретранслятор:

#include <SoftEasyTransfer.h>
#include <SoftwareSerial.h>

#define DIR 13                                       // переключатель прием\передача

SoftwareSerial mySerial(7, 6);                     // Serial для RS485
SoftEasyTransfer ET;
 
 
struct RECEIVE_DATA_RS485{ 
  float SHT20_T;
  float SHT20_RH;
};
RECEIVE_DATA_RS485 rxdata;


void setup(){
  Serial.begin(9600);
  mySerial.begin(9600);
  
  ET.begin(details(rxdata), &mySerial);

 
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW);                          // включаем прием

}

void loop(){
 
  if(ET.receiveData()){                           // если пришли данные
   
    Serial.print("Temp_1: ");
    Serial.print(rxdata.SHT20_T);                 // и отправляем в Serial
    Serial.print(" ");
    Serial.print("Temp_2: ");
    Serial.println(rxdata.SHT20_RH);
    
  }
}
 

 

Technolog
Offline
Зарегистрирован: 19.11.2014

А нельзя ли вместо ретранслятора RS485<-->RS485 поставить просто повторитель RS485<-->RS485 для восстановления уровня сигнала?