ESP01 -> Arduino UNO -> ESP01

И снова здравствуйте!
Связал WEB-сервер на ESP01 c Arduino UNO и добился управления пином 13 на Arduino с браузера.
Теперь надо получить в браузере ответ от Arduino о состоянии диода “On” или “Off”.

В адресной строке браузера ввожу:
“http://<статический IP>:10200/s?z=a”
диод выключается.
Если же ввожу:
“http://<статический IP>:10200/s?z=b”
диод включается.
Так и было задумано.

в стоке 38 этого скетча передается аргумент в Arduino.

[code]
#include <ESP8266WiFi.h> 
#include <ESP8266WebServer.h>

char priem;
bool persim=0;
String stroka="";
char sim;
uint8_t newMACAddress[] = {0xFA, 0xEB, 0xDC, 0xCD, 0xBE, 0xAF};
const char* ssid = "ABRAKADABRA";  // SSID
const char* password = "19661117"; // пароль

ESP8266WebServer server(10200);   

void setup() 
{
  Serial.begin(9600);
  delay(100);
  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);
  wifi_set_macaddr(STATION_IF, &newMACAddress[0]);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(1000);
  }
  server.on("/s", toarduino);
  server.begin();
}

void loop() 
{
  server.handleClient();    // обработка входящих запросов
}

void toarduino() 
{
  server.send(200, "text/plain",server.arg(0)); // ответ в браузер
  Serial.println(server.arg(0)); // ответ в MK на этот аргумент Arduino реагирует включением/выключением диода
}
[/code]

Вопрос. В каком месте этого скетча организовать получение строки от ардуино для передачи ее в браузер.
Спасибо.

PS. Я понимаю, что в случае передачи в браузер ответа от Arduino строку 37 надо закомментировать.

37 строка и есть выдача в браузер. Вместо последнего аргумента подставишь что нужно «плюнуть» и всё.

Но перед этим мне как-то надо получить ответ от Arduino после строки 38, в которой я даю ей “команду”.

Плюнуть в браузер и дать/получить данные с ардуино - это разные вещи. И логичнее сначала получать/отправлять что-то, а уже потом выводить на экран (в данном случае - в браузер).

Представьте, что строки 37 нет.
В строке 38 я даю команду Arduino, которая возвращает мне ответ: “On” или “Off”.
А затем я этот ответ пересылаю в браузер.
Так логично будет? Точнее, эти операции надо проводить в этом месте?

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

Да, именно так и нужно сделать.

Могу ошибаться, но вот что у меня получается.

Arduino может принимать строку от ESP01 на любой свой UART: программный или аппаратный.

А ESP01 принимает строку ТОЛЬКО c аппаратного UART Arduino.

Так и должно быть?

нет
Какая скорость у программного Уарта?

Скорость 9600.

показывайте код

Код ESP01. Смотрите комментарии в строках 38, 43.

[code]
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
char priem;
bool persim = 0;

uint8_t newMACAddress[] = {0xFA, 0xEB, 0xDC, 0xCD, 0xBE, 0xAF};

const char* ssid = "ABRAKADABRA";
const char* password = "19661117";

ESP8266WebServer server(10200);
void setup()
{
  Serial.begin(9600);
  delay(100);

  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);
  wifi_set_macaddr(STATION_IF, &newMACAddress[0]);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
  }

  server.on("/s", handleSpecificArg);
  server.begin();
}

void loop()
{
  server.handleClient();
}

void handleSpecificArg()
{
  Serial.println(server.arg(0)); // отсылаю в Arduino заведомо единственный аргумент
  delay(250); // жду ответ от Arduino
  
  String stroka = "w"; // здесь будет String stroka = "";

  if (Serial.available() > 0) // Если в Arduino UART программный, то это условие не выполняется.
  {

    while (Serial.available() > 0)
    {
      char sim = Serial.read();
      stroka += sim;
    }
    server.send(200, "text/plain", stroka);
  }
  else
  {
    server.send(200, "text/plain", "Oblom");
  }
}
[/code]

Код Arduino-UNO.

[code]
#include <SoftwareSerial.h>
SoftwareSerial port(8, 9); //RX TX

String stroka = "";
void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  Serial.begin(9600); // пины 0,1
  port.begin(9600);
}

void loop()
{
  if (Serial.available() > 0) // if (port.available() > 0)
  {
    char priem = Serial.read(); // char priem = port.read();
    if (priem == '\n')
    {
      if (stroka == "a")
      {
        digitalWrite(13, 0);
        Serial.println("Off"); // port.println("Off");
      }
      if (stroka == "b")
      {
        digitalWrite(13, 1);
        Serial.println("On"); // port.println("On");
      }
      stroka = "";
    }
    else
    {
      if ((byte) priem != 13) stroka += priem;
    }
  }
}
[/code]

Что-то мне припоминается, что у esp скорость сериала должна быть 115200

Судя по коду, вы предполагаете что в этой строке отсылается либо “a\n” либо “b\n”
А с чего вы взяли, что у вас конец строки именно “\n” ? А не “\r\n”, к примеру?
Вы проверяли, что там приходит?

Где-то я встречался с тем, что библиотеки такую скорость не поддерживают и её надо снижать. При такой скорости работает корректно.

\r десятичный код 13. Я игнорирую его в строке 35 скетча Arduino.

Тут ещё вопрос по железу. Может и не в тему. Нужно ли преобразовывать уровень выхода TX Arduino для связи с RX ESP?

да, нужно

Просто смотрю схемы в интернете. В подавляющем большинтве схем (которые попадаются) соединение напрямую.

Ок, принято, не заметил.
Тем не менее, совет тот же - посмотреть что именно приходит. Только так можно понять, почему не срабатывает.

И да, попробуйте поменять местами RX и TX

Спасибо за совет. Обязательно посмотрю. И параллельно буду разбираться с проблемой символов кириллицы.

Попробую. Сейчас у меня подключено RX->TX. И TX->RX.