• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Передача команд по UART с использованием web

dmitrymorro

New member
Добрый день уважаемые коллеги!
Спасибо, что читаете эту тему. Буду благодарен всем откликнувшимся.
Более подробно о задаче. Что имеем:
1) ESP8266 01, прошита esp8266_nonos_sdk_v2.0.0_16_08_10. Залит скетч со стандартным примером Web сервера.
2) Web страничка с JS
3) Некая плата с микроконтроллером подключаемая по UART (далее просто плата).

Что требуется:
1) Возможность подключения к ESP по wifi с любого устройства. Это работает. Страничка работает и грузится шустро.
2) Отправка команд по UART с web странички - реализовано, При нажатии на кнопки, в порт отправляются команды, привязанные к данным кнопкам.

Что никак не получается:
3) Получить ответ по UART от платы и обновить соответствующее поле на web странице. Очень нужна подсказка, в каком направлении смотреть.
В принципе, даже устроит вариант с примером реализации окна монитора порта в окне браузера.

Перелопатил кучу информации, но видимо не правильно задаю запрос. Находил только кучу примеров как управлять выводами на платах.

Спасибо!
 

Юрий Ботов

Moderator
Команда форума
Если с отображением ответа нет спешки - просто пропишите в meta html файла "периодическое обновление страницы".
Если надо чтобы отображалось сразу, придется менять прошивку на более продвинутую. Ключевое слово в поиске "websocket".
 

dmitrymorro

New member
Если с отображением ответа нет спешки - просто пропишите в meta html файла "периодическое обновление страницы".
Если надо чтобы отображалось сразу, придется менять прошивку на более продвинутую. Ключевое слово в поиске "websocket".
Юрий, спасибо за ответ!
Спешки нет, после отправки команды нет проблемы подождать даже 1-2 сек. Про обновление страницы понял, почитаю.
А каким образом организовать передачу полученных данных с порта на страницу?
 

Юрий Ботов

Moderator
Команда форума
С порта надо принимать не на страницу а в переменную. А эту переменную после запроса снаружи использовать при генерации страницы.
 

dictor

New member
С порта надо принимать не на страницу а в переменную. А эту переменную после запроса снаружи использовать при генерации страницы.
Я пробовал сделать такое - у меня переменная почему то не целиком выводится на страницу, а каждый байт по очереди. переменная типа String. Не понимаю почему вместо строки, полученной по UART на страницу выводятся по очереди байты, (еще и в десятичной форме коды ASCII символов вместо букв, при этом по юарту получает тоже стринги)
 
Последнее редактирование:

dictor

New member
Наверное потому, что вы так написали программу.
Переменную объявляю как стринг:
Код:
String incom = "";
Далее принимаю с сериала, уже даже явное преобразование типов подключил:
Код:
incom  =(String) Serial.read();
потом в штмл страницу передаю
HTML:
 web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">---";
    web += incom ;
  
  web += "---</p>";
и все равно
полученной по UART на страницу выводятся по очереди байты, (еще и в десятичной форме коды ASCII символов вместо букв, при этом по юарту получает тоже стринги)
 

dictor

New member
Надеюсь если задам этот вопрос здесь - он не будет оффтопом. Про все тот же интерфейс и уарт. Кто ни будь может подсказать, как запилить в еспхе ползунок (ну точнее сам ползунок то я сделал, делов то - одна строчка) и получаемое с него значение передавать в уарт?
 

CodeNameHawk

Moderator
Команда форума
уарт передает символы по одному, ваша работа, что бы их собрать в строку и только тогда вывести на страницу.
Было уже на форуме.
 

dictor

New member
уарт передает символы по одному, ваша работа, что бы их собрать в строку и только тогда вывести на страницу.
Было уже на форуме.
Извините, но не нашел, можно, пожалуйста , линк?
И что, ни уже ли никто не знает как в юарт пихнуть данные с ползунка (имеется в виду ползунок на штмл)
 

CodeNameHawk

Moderator
Команда форума
https://esp8266.ru/forum/threads/arduino-nano-esp-12.2398/page-3#post-35483
Serial.read() | Аппаратная платформа Arduino
На передающей стороне вводите символы начала и конца строки, могут быть любыми, лишь бы не
встречались в передаваемой строке. например { и }
На приемной читаете по байту, пока не встретите символ начала строки.
Все последующие символы (до символа конца строки) добавляете к строке.
stroka=stroka+priniatyj_simvol;

Вот пример приема с разборкой на JSON
Код:
const  int  buf_max = 200;            //rozmiar bufera dla dannych z Serial
char odczyt_buf[buf_max];             //przyjeta linia z serial
unsigned long start_time, now_time;   //zapisuje sie, kiedy zaczeli czekac na danne z Serial

if (Serial.available() > 0)
  { //если есть доступные данные
    // считываем байт
    odczyt = Serial.read();
    if (odczyt == '{') //szukamy poczatek linii
    {
      i = 0; //na poczatek buffera
      odczyt_buf[i] = odczyt;
      i = i + 1;
      posylka_full = false;
      start_time = millis();
      do
      {
        if (Serial.available() > 0)
        {
          odczyt = Serial.read();
          odczyt_buf[i] = odczyt;
          i = i + 1;
          if (i >= buf_max)
          {
            posylka_full = false;
            break;
          }
          if (odczyt == '}')
          {
            posylka_full = true;
            odczyt_buf[i + 1] = 0;
            break;
          }
        }
        now_time = millis();
        if ((now_time - start_time) > 5000)
        {
          posylka_full = false;
          break;
        }
      }
      while (1);
      if (posylka_full == true)
      { //otrzymali pelna posylke, rozlozyc do peremennych
        //        Serial.println();
        //        Serial.println("Cala posylka");
        //        Serial.println(i);
        for (int cykl = 0; cykl < i; cykl++)
        {
          Serial.print(odczyt_buf[cykl]);
        }

        JsonObject& root = jsonBuffer.parseObject(odczyt_buf);

        // Test if parsing succeeds.
        if (!root.success())
        {
          Serial.println("parseObject() failed");
        } else
        {
          kociol_podacza   = root["temp"][0];
          kociol_obratka   = root["temp"][1];
          podloga_podacza  = root["temp"][2];
          podloga_obratka  = root["temp"][3];
          batarei_podacza  = root["temp"][4];
          batarei_obratka  = root["temp"][5];
          boiler_podacza   = root["temp"][6];
          boiler_obratka   = root["temp"][7];

          dzien        = root["data"][0];
          miesiac      = root["data"][1];
          rok          = root["data"][2];

          hr           = root["czas"][0];
          minut        = root["czas"][1];
          sec          = root["czas"][2];

          pod_on_b     = root["pom"][0];
          bat_on_b     = root["pom"][1];
          bol_on_b     = root["pom"][2];

          work_mode    = root["mode"];
        }
      } else //posylka nie cala, tylko na czas otladki
      {
        Serial.println();
        Serial.println("Nie cala posylka");
      }
    }
  }

Теоретически все просто, отловить событие изменения ползунка и послать в уарт, на практике не делал.
Ползунок | htmlbook.ru
Ползунок в HTML (оформление и вывод значения) | Блог Костаневича Степана
 
Последнее редактирование:

pvvx

Активный участник сообщества
Serial.read() | Аппаратная платформа Arduino
Теоретически все просто, отловить событие изменения ползунка и послать в уарт, на практике не делал.
Ползунок | htmlbook.ru
Ползунок в HTML (оформление и вывод значения) | Блог Костаневича Степана
Во время перемещения "ползунка", он неоднократно передает своё значение, а Arduino = тормоз, и не успевает принимать пачку AJAX, иногда, на тормозных компах или смартах это приводит к движению "ползунка" рывками и прочие бяки...
Необходимо что-то накручивать на js...
Но топикастер не обладает мастерством в данном деле (так он представился) и ваш совет скорее всего не поможет -> он создан путем набора в Google "ползунок js".
 

pvvx

Активный участник сообщества
Наверное можно добавить кнопку Послать.
Проще тогда сработать AJAX по потере фокуса :) Но наверно проще по таймеру - завязка с приемом в Arduino это всё равно не решает. Передачи из js только в TCP (HTTP или Websoscket), а не в UDP и каждая отправка будет ждать ответа о доставке...
Примеров с ползунком и AJAX в инете нет. Т.к. задача специфическая и для её решения требуется масса параметров, которые автор вопроса не дал.
Когда он составит все необходимые для его "ползунка" параметры работы, тогда и сам решит. :)

Даже на скоростном PC может банально не хватить портов из-за TIME_WAIT, т.к. он (PC) в данном случае <клиент> и закрывает TCP соединение первым, а портов у его сетевухи всего 65535 и это на 120 секунд. По этому AJAX помер давно и его заместил websocket, не требующий для передачи каждого байта открытия и закрытия HTTP соединения в интерактивных страницах...
Так-же удаленный UART изумительно работает через websocket, хоть с бинарными массивами, организуя подобие телнет терминала на странице... И писать там гораздо проще, без всяких сторонних либ, т.к. это всего несколько строк на js, в отличии от кода AJAX запросов-ответов.
 
Последнее редактирование:

dictor

New member
Ладно, решил этот вопрос другим путем, запилил приложение на ндроид, которое для каждого положения ползунка в андроид приложении открывает свою ссылку(для каждого положения разная ссылка). Может быть кто то подскажет как сделать так, чтобы в штмл передавать положение ползунка по одной и той же ссылке, но с параметром(значением), а потом уже передавать из штмля в уарт значение переданное ползунком по ссылке?
 

dictor

New member
Ладно, решил этот вопрос другим путем, запилил приложение на ндроид, которое для каждого положения ползунка в андроид приложении открывает свою ссылку(для каждого положения разная ссылка). Может быть кто то подскажет как сделать так, чтобы в штмл передавать положение ползунка по одной и той же ссылке, но с параметром(значением), а потом уже передавать из штмля в уарт значение переданное ползунком по ссылке?
Какая то хня происходит, ползунок отправляет свое значение только раз в секунду, а если менять быстро значения, то они потом по очереди начинают очень долго пуляться на еспшку и потом в юарт, по дергал ползунком - и ждешь пока оно поотправляет значения с интервалом в секунду. Можно что то с этим сделать? Подскажите, великие умы!
 

pvvx

Активный участник сообщества
Какая то хня происходит, ползунок отправляет свое значение только раз в секунду, а если менять быстро значения, то они потом по очереди начинают очень долго пуляться на еспшку и потом в юарт, по дергал ползунком - и ждешь пока оно поотправляет значения с интервалом в секунду. Можно что то с этим сделать? Подскажите, великие умы!
Во время перемещения "ползунка", он неоднократно передает своё значение, а Arduino = тормоз, и не успевает принимать пачку AJAX, иногда, на тормозных компах или смартах это приводит к движению "ползунка" рывками и прочие бяки...
Необходимо что-то накручивать на js...
 

dictor

New member
@pvvx Дык дело в том, что он рывками то не двигается, он вообще на яве написан и на смартфоне работает, не на штмл, он просто открывает ссылки (разные, в зависимости от положения)(используется для реголирования ШИМа).По разным ссылкам швыряются команды на юарт на атмегу 8, которая в зависимости от команды устанавливает тот или иной уровень ШИМ на своих ногах. Я так понимаю задержка происходит при открытии ссылки, по которой переходит ползунок.
Код выглядит как то так:
Код:
  server.on("/", [](){
  
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
  });
  server.on("/Forward", [](){
    Serial.println('w');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  
  });
  server.on("/Backward", [](){
    Serial.println('s');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  });
  server.on("/FullLeft", [](){
    Serial.println('e');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  });
  server.on("/HalfLeft", [](){
    Serial.println('r');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  });
  server.on("/NullSpin", [](){
    Serial.println('t');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  });
  server.on("/HalfRight", [](){
    Serial.println('y');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  });
  server.on("/FullRight", [](){
    Serial.println('u');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  });
  server.on("/Stop", [](){
    Serial.println('.');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  });
  server.on("/Min", [](){
    Serial.println(';');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  });
  server.on("/Mid", [](){
    Serial.println('[');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  });
  server.on("/Max", [](){
    Serial.println('=');
    Serial.readBytes(incom,2);
    server.send(200, "text/html", webPage());
    delay(1);
  });
Кроме ползунка я еще отправляю разные команды о наклоне телефона относительно горизонта, полученные с датчика ориентации. Этот процесс вообще очень болезненным скрипом отдается в недрах еспхи
 

pvvx

Активный участник сообщества
Я так понимаю задержка происходит при открытии ссылки, по которой переходит ползунок.
Примерно про это и написано - если от ползунка запрашивается сторонний ресурс, то ползунок может накидать сотни запросов, и ждите когда они все отработаются... Всё-же зависит от того, что вы там написали - а мы тут можем только гадать по скудной информации от вас :)
Знаю только, если данные с ползунка поступают по событию смены его значения, и кидаются в AJAX, то сервер (или "файрвол" роутера, через который это прет), через время, начинает считать что это DDOS атака и рубит нерадивого :)
 
Сверху Снизу