• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 атака и рубит нерадивого :)
 
Сверху Снизу