Проводное соединение Arduino при помощи RS485

RS485, стандарт проводной связи, обычно переменяется для соединение в сеть различного промышленного оборудования, им можно соединять ардуино на расстоянии до 1,2км, объединять в сеть до 32 устройств.

ниже код из видео
часть 1 — https://youtu.be/6pirdFDzWzA
часть 2 — https://youtu.be/CDn2mM9vSUk
часть 3 — https://youtu.be/LGmxI7M_Yfc

 

пока так (

Часть 1, Передатчик
// Проводное соединение Arduino при помощи RS485, часть 1
// http://youtu.be/6pirdFDzWzA

#include <SoftwareSerial.h>

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

SoftwareSerial RS485 (7, 6); // RX, TX

void setup(){
  Serial.begin(9600); 
  RS485.begin(4800); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
 
}

void loop(){
      digitalWrite(DIR, HIGH); // включаем передачу             
        RS485.println(millis()); // отправляем  
      digitalWrite(DIR, LOW); // включаем прием
      delay(1000);
}


Часть 1, Приемник
// Проводное соединение Arduino при помощи RS485, часть 1
// http://youtu.be/6pirdFDzWzA

#include <SoftwareSerial.h>

SoftwareSerial RS485 (12, 11); // RX, TX

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

void setup(){
  Serial.begin(9600); 
  RS485.begin(4800); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
 
}

void loop(){
  
  if (RS485.available()){ // если чтото есть в буфере
    Serial.write(RS485.read()); // отправляем это в сериал
   
  } 
 
}

 

Часть 2, первый пример, мастер.
// Проводное соединение Arduino при помощи RS485, часть 2
// первый пример, мастер.
//
#include <SoftwareSerial.h>

#define DIR 13 // переключатель прием\передача
 
SoftwareSerial RS485 (7, 6); // RX, TX

void setup(){
  Serial.begin(9600); 
  RS485.begin(4800); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, HIGH); // включаем передачу
  
}

void loop(){  
   byte id = random(1, 3);
   RS485.write(id); // отправляем первый байт, в нем ID
   Serial.print(id);
     
  delay(500);
    
}
 


 

Часть 2, первый пример, слейв.

 


// Проводное соединение Arduino при помощи RS485, часть 2
// первый пример, слейв.
//

#include <SoftwareSerial.h>

#define DIR 8 // переключатель прием\передача
#define ID 1 // номер ардуины

SoftwareSerial RS485 (7, 6); // RX, TX

void setup(){
  Serial.begin(9600); 
  RS485.begin(4800); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
}

void loop(){
  
  if (RS485.available() > 0) {
    byte id = RS485.read(); // читаем байт, в нем для кого этот пакет    
    if (id == ID){ // и если пакет пришел нам        
        digitalWrite(13, HIGH); // мигнем диодом
        delay(100);
        digitalWrite(13, LOW);     
     }
    else RS485.flush(); // если не нам, очищаем буфер
    
  }
   
}


Часть 2, второй пример, мастер.

 

// Проводное соединение Arduino при помощи RS485, часть 2
// второй пример, мастер.
//
#include <SoftwareSerial.h>

#define DIR 13 // переключатель прием\передача
 
SoftwareSerial RS485 (7, 6); // RX, TX

void setup(){
  Serial.begin(9600); 
  RS485.begin(9600); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
}

void loop(){
  
   if (RS485.available() >= 2) { // если пришел ответ 
     Serial.print(RS485.read()); // читаем первый байт, в нем от кого этот пакет
     if (RS485.read()) Serial.println(" - ON");     
     else Serial.println(" - OFF"); 
     
   }
    
 digitalWrite(DIR, HIGH); // включаем передачу
    RS485.write(random(1, 3)); // отправляем первый байт, в нем ID
    RS485.write(random(1, 3)); // отправляем второй байт,      
 digitalWrite(DIR, LOW); // включаем прием  
  
    delay(250); 
}
 


Часть 2, второй пример, слейв.
// Проводное соединение Arduino при помощи RS485, часть 2
// второй пример, слейв.
//
#include <SoftwareSerial.h>

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

const byte ID = 2; // номер ардуины
 
SoftwareSerial RS485 (7, 6); // RX, TX
 
void setup(){
  Serial.begin(9600); 
  RS485.begin(9600); // SoftwareSerial   
 
  pinMode(DIR, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
}

void loop(){
  
 if (RS485.available() >= 2) { // если пришло 2 байта
   byte id = RS485.read(); // читаем первый байт, в нем для кого этот пакет    
    if (id == ID){ // и если пакет пришел нам 
      byte val = RS485.read(); // читаем что хочет мастер
        if (val == 1) digitalWrite(13, HIGH);  // если там 1, включаем светодиод
        else digitalWrite(13, LOW);
        
      delay(10); // делаем задержку перед отправкой
      digitalWrite(DIR, HIGH); // включаем передачу
        RS485.write(ID); // отправляем свой id
        RS485.write(digitalRead(13)); // отправляем состояние светодиода
      digitalWrite(DIR, LOW);     
    }     
    else RS485.flush(); // если пакет не нам, очищаем буфер
    
  }
   
}

 

Часть 3, SoftEasyTransfer, Передатчик
// Библиотека https://github.com/madsci1016/Arduino-EasyTransfer
//  передача

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

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

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

 
SEND_DATA_STRUCTURE txdata;


void setup() {
  Serial.begin(9600);  
  mySerial.begin(9600);
 
  ET.begin(details(txdata), &mySerial);   
  Wire.begin();
  
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW);                          // включаем прием 
}

void loop() {   
       
  delay(500); 
  
    txdata.SHT20_T = SHT2x.readT();             // пишим данные в структуру
    txdata.SHT20_RH = SHT2x.readRH();
 
  digitalWrite(DIR, HIGH);                      // включаем передачу
    delay(1);                                     // небольшая задержка, иначе неуспевает
    ET.sendData();                              // отправляем     
    delay(50);                                  // небольшая задержка, иначе неуспевает       
  digitalWrite(DIR, LOW);                       // включаем прием 
      
   
}


Часть 3, SoftEasyTransfer, Приемник
// Библиотека https://github.com/madsci1016/Arduino-EasyTransfer
// прием

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

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

SoftwareSerial mySerial(8, 10);                     // Serial для RS485
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);              // LCD экран
 
SoftEasyTransfer ET;
  
  
struct RECEIVE_DATA_RS485{  
  float SHT20_T;
  float SHT20_RH; 
};
 
RECEIVE_DATA_RS485 rxdata; 


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

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

 
}

void loop(){
  
  if(ET.receiveData()){                           // если пришли данные 
                                                  // отображаем их на LCD
    lcd.clear();
    lcd.setCursor(0, 0); 
    lcd.print(rxdata.SHT20_T);
    lcd.print("C "); 
    
    lcd.setCursor(0, 1); 
    lcd.print(rxdata.SHT20_RH ); 
    lcd.print("% ");
     
    Serial.print(rxdata.SHT20_T);                 // и отправляем в Serial
    Serial.print("C ");
    Serial.print(rxdata.SHT20_RH);
    Serial.println("% "); 
     
  }
 
}