UART bridge позволяет вывести свои устройства на базе любого м/к в сеть используя UART. Можно подключить любой м/к со своей прошивкой, в том числе и Arduino.
UART bridge - это более продвинутый вариант опции UART через GET, но в отличии от его он работает только со строками. UART через GET может передавать и бинарные данные. На данный момент есть более продвинутая опция UART HTTP bridge
В настройках прошивки, на вкладке UART bridge указывается скорость порта, а так же выбор режима работы: MQTT, HTTP GET, Only print.
Функция поддерживает двухсторонний обмен данными по MQTT или по HTTP протоколу. Можно так же читать данные с веб модуля.
Важно ! В конце передаваемой строки требуется передавать код окончания строки( \n ) . Ардуино для этого используют оператор println
Работа с MQTT протоколом.
Для работы с 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 протоколом
В случае 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$). Возможно подключение нескольких устройств на одну шину. Пока возможен только прием. Управление передачей в планах.