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("% "); } }