Всем привет!!!! Загорелся на днях сделать аля умный дом на Arduino и модулях, но столкнулся с проблемой нехватки знания (ееее... точнее, знания не хватает с программной частью). Понимаю что нужно создать свой протокол типа :
<старт байт> <id устройства> <команда> <байт инф> <контрольная сумма>
на этом этапе я остановился)))). Перелопатив кучу форумов я находил только незавершенные решение, или же все решалось библиотеками. Возможно у кого-то есть пример связи Arduino по rs485, или объяснит на пальцах как это сделать на крайний случай дать пинка в нужном направлении
Простой пример
Код рабочий, но в процессе работы постоянные глюки, то slave не отвечает на команду мастера то срабатывает совсем другой slave.
<старт байт> <id устройства> <команда> <байт инф> <контрольная сумма>
на этом этапе я остановился)))). Перелопатив кучу форумов я находил только незавершенные решение, или же все решалось библиотеками. Возможно у кого-то есть пример связи Arduino по rs485, или объяснит на пальцах как это сделать на крайний случай дать пинка в нужном направлении
Простой пример
master:
// Проводное соединение 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);
}
Slave:
/ Проводное соединение 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(); // если пакет не нам, очищаем буфер
}
}
Код рабочий, но в процессе работы постоянные глюки, то slave не отвечает на команду мастера то срабатывает совсем другой slave.
Изменено: