Ключевое ?лово

vk

UART bridge позволяет вывести свои устройства на базе любого м/к в сеть используя UART. Можно подключить любой м/к со своей прошивкой, в том числе и Arduino.

UART bridge - это более продвинутый вариант опции UART через GET, но в отличии от его он работает только со строками. UART через GET может передавать и бинарные данные.

В настройках прошивки, на вкладке UART bridge указывается скорость порта, а так же выбор режима работы: MQTT, HTTP GET, Only print.

Функция поддерживает двухсторонний обмен данными по MQTT или по HTTP протоколу. Можно так же читать данные с веб модуля.

Работа с MQTT протоколом.

uartbr1Для работы с MQTT он должен быть полностью настроен и сервер должен видеть метрики с устройства.

Для отправки данных в топик сервера mqtt необходимо отправить строку в UART следующего содержания: имя_устройства/имя_метрики пробел значение_метрики , например myhome/adc 434.

Для приема данных из MQTT необходимо указать в настройках модуля начало топика (имя устройства) в поле Mask MQTT topic to UART , например  myhome. Для простого управления м/к можно включить опцию Disable send name topic - в этом случае на устройство придет только значение метрики без полного адреса топика.

 
// отправка данных через uart на  mqtt . галка "Disable send name topic" установлена
unsigned long loopTime;

#define REL1 3 // Реле

#define interval 5000 // интервал отправки данных с датчиков
 
void setup()
{
  pinMode(REL1, OUTPUT);
  digitalWrite(REL1, LOW);

Serial.begin(115200); // задаём скорость UART
}
 
void loop()
{
unsigned long currentTime = millis();                           // считываем время, прошедшее с момента запуска программы
  if (currentTime >= (loopTime + interval)) {            // сравниваем текущий таймер с переменной loopTime

// чтение датчиков и отправка данных в UART  
  int adc = analogRead(A7);
  Serial.print("arduino/adc7 ");
  Serial.println(adc, DEC);

      loopTime = currentTime;
    }
 // простой прием команды с включенной опцией "Disable send name topic" в ESP
  if (Serial.available()) {         //если есть принятый символ,
  int val = Serial.read();            //  то читаем его и сохраняем в val
    if (val == '1') {               //  если принят симовол '1',
      digitalWrite(REL1, HIGH);//  то включаем светодиод
    }
    if (val == '2') {               //  если принят симовол '2',
      digitalWrite(REL1, LOW); //    то выключаем светодиод
    }

  }
}
 
 
// отправка данных через uart на  mqtt. галка "Disable send name topic" снята
unsigned long loopTime;

#define REL1 3 // Реле

#define interval 5000 // интервал отправки данных с датчиков
#define readbufsize 100 // максимальный размер буфера 
 
char *buf;
 
void setup()
{
  pinMode(REL1, OUTPUT);
  digitalWrite(REL1, LOW);

Serial.begin(115200); // задаём скорость UART

   buf = new char[readbufsize];
}
void loop() { unsigned long currentTime = millis(); // считываем время, прошедшее с момента запуска программы   if (currentTime >= (loopTime + interval)) { // сравниваем текущий таймер с переменной loopTime // чтение датчиков и отправка данных в UART     int adc = analogRead(A7);   Serial.print("arduino/adc7 ");   Serial.println(adc, DEC);       loopTime = currentTime;     }  // прием команд с парсингом с вЫключенной опцией "Disable send name topic" в ESP // с поддержкой atoi - может быть любое число int i = 0;   while (Serial.available() && (i < readbufsize)) {     buf[i++] = Serial.read();     delay(2);   }      if (i) { // в UART что-то пришло. обрабатываем char *pdata = NULL; char lwt[30]; // пишем в топик email/arduino/gpioset 13 для установки 13 пина в единицу // не поддерживается mqtt flymon pdata = NULL;     sprintf(lwt,"arduino/gpioset ");         pdata = (char *)strstr(buf,lwt);           if (pdata != NULL) {         pdata+= strlen(lwt); uint8_t pin = atoi(pdata);   digitalWrite(pin, HIGH);      }       // пишем в топик email/arduino/gpioclear 13 для установки 13 пина в ноль // не поддерживается mqtt flymon pdata = NULL;     sprintf(lwt,"arduino/gpioclear ");         pdata = (char *)strstr(buf,lwt);           if (pdata != NULL) {         pdata+= strlen(lwt); uint8_t pin = atoi(pdata);  digitalWrite(pin, LOW);      }    // пишем в топик email/arduino/gpio3 вкл/выкл REL1  pdata = NULL;     sprintf(lwt,"arduino/gpio3 ");         pdata = (char *)strstr(buf,lwt);           if (pdata != NULL) {         pdata+= strlen(lwt); uint8_t pin = atoi(pdata);  digitalWrite(REL1,pin);      }                memset(buf, 0, readbufsize);     i = 0;   }  }
 

Работа с HTTP GET протоколом

uartbr2В случае MajorDoMo устройство по UART должно отправлять строку вида &name1=val1&name2=val2 . Метрики name1 и name2 в этом случае будут видны на сервере.

В случае TCP клиента устройство отправляет данные в зависимости от протокола, который используется на сервере, если это HTTP протокол, то все аналогично MajorDoMo. В шаблоне TCP клиента необходимо вставить макрос _UARTBR_ - в шаблоне отправки он заменится на текст из UART.

Если подключенное по UART устройство иницилизирует само переодическую отправку , то в модуле рекомендуется поставить интервалы отправки равное нулю.

Отправить информацию через GET запрос в UART можно через команду ip_adr/uartbrget?data=строка , эта команда доступна и при других режимах работы. В строке запроса не должно быть спец символа &, используйте другие разделители параметров.

 
// код аналогичен варианту MQTT кроме части кода ниже:
  int adc = analogRead(A7);
  Serial.print("&adc7="); // основное отличие тут
  Serial.println(adc, DEC);
 

Работа в варианте AUTO

Авто режим дает возможность работать одновременно с MQTT и TCP(GET) отправкой данных с Вашего устройства. Для того, чтобы отправить данные на сервер MQTT необходимо в начале строки указать метку ~M (большая анлгийская буква). Для отправки на TCP сервер указываем метку ~T. Если в начале метка не будет  найдена, то данные игнорируются.

 
// часть кода для отправки для TCP:
  int adc6 = analogRead(A6);
  int adc7 = analogRead(A7);
  Serial.print("~T&adc6="); // тут указываем метку ~T
  Serial.print(adc6, DEC); // без переноса ln
  Serial.print("&adc7=");
  Serial.println(adc7, DEC);
  // часть кода для отправки для MQTT
  Serial.print("~Marduino/adc6 "); // тут указываем метку ~M
  Serial.println(adc6, DEC);
  Serial.print("~Marduino/adc7 "); // и тут указываем метку ~M
  Serial.println(adc7, DEC);

 

 

Работа в варианте Only print

В этом режиме нет отправки на сервера, доступен вывод только в веб модуля по адресу ip_adr/uartbrprint . Эта команда доступна во всех режимах.

Вывод данных UART на дисплеи

Вывести данные на дисплеи можно через конструктор строк используя макросы:

Макрос _UARTBR_ выведет данные в том виде, в котором их приняло по UART.

Макрос _UBRVx_ выведет числовую переменную, которую отправили в UART командой ubrvalX YYY, где x - номер метрики от 1 до 9. YYY - число для передачи.

 
// код отправки макрос _UBRV1_:
  int adc = analogRead(A7);
  Serial.print("ubrval1 "); // 
  Serial.println(adc, DEC);
 

Работа с RS-485

Теоретически прошивка может работать по шине RS-485 через микросхему MAX485 (существуют готовые модули для Arduino. Цена около 1$). Возможно подключение нескольких устройств на одну шину. Пока возможен только прием. Управление передачей в планах.


Home`s Smart © 2013-2016. г.Киров.
Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.