Очередной умный дом по rs485

MAG999

✩✩✩✩✩✩✩
12 Ноя 2019
5
0
Всем привет!!!! Загорелся на днях сделать аля умный дом на Arduino и модулях, но столкнулся с проблемой нехватки знания (ееее... точнее, знания не хватает с программной частью). Понимаю что нужно создать свой протокол типа :
<старт байт> <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.
 
Изменено:

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
есть протокол modbus, он поверх 485 работает
позволяет передавать целые и битовые числа, есть контрольная сумма, есть эмуляторы мастера и слейва

глюки могут быть из-за китайских модулей, у меня вон глюки идут от китайского измерителя мощности
раньше иногда позволял считать показания, сейчас вообще ошибку только дает

что-то с резисторами обвязки мах485 наверное или оптопарами там, по крайней мере в инторнете я такое читал
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,304
949
58
Марий-Эл
Вот 100% рабочая схема без опторазвязки. Если на китайском блоке не так, он будет глючить.
1589214468279.png

Если к линии подключено больше 2х устройств, то R4 ставится только на самых крайних.
 

MAG999

✩✩✩✩✩✩✩
12 Ноя 2019
5
0
Спасибо за схему, но по железу все ок. Проблема в программной части.