Возникают ошибки при передаче ESP01S -> Arduino UNO

Попробую, конечно. Но где-то я вычитал, что библиотеки ESP такую скорость не поддерживают.

Это стандартная скорость работы сериала на esp

1 лайк

Посчитайте, наличие скольких ошибок будет зафиксировано, если, скажем, канал передачи тупо устанавливает в 1 четвертый бит. Serial.write(Serial1.read() | 0x10);

1 лайк

Сделал. Количество ошибок не уменьшилось.

Вы меня извините, но обычно УАРТ годами работает без единой ошибки. Ошибок передачи на линии Сериал НЕ БЫВАЕТ.

Проблема либо в коде, либо в соединениях. Либо вы показали нам только часть кода и у вас там еще 100500 функций, которые портят данные, либо у вас контакты постоянно отваливаются, потому что не пропаяны или соединены на болтающихся стяжках.

Никаких других причин быть не может.

Вы сделали то что я вам советовал в посте 14?

2 лайка

@Optron
Я смотрю ваши темы - вы в той или иной форме воюете с передачей по УАРТ с середины июня. Может, это самое… пора взрослеть? Учиться отлаживать код грамотно, а не вслепую менять параметры железа и строчки кода?

Для начала выкиньте из обоих кодов ВСЕ, что не касается Сериал - всю эту работу с сетью, HTTP-запросы и прочую муть. ЕСП посылает пакет - ардуина принимает. БОЛЬШЕ НИЧЕГО.
Посмотрите, будет ли работать.

Пока не добьетесь, чтоб работало - ничего в код не добавляйте.

Как заработает - начинайте добавлять обратно то, что удалили. Небольшими порциями. И постоянно проверяйте, что УАРТ не “сломался”. Пока не отладили одну порцию - к другой не переходите.

2 лайка

Точно что ли?

1 лайк

Вы отладкой через serial принципиально не пользуетесь?

1 лайк

Попробуйте снизить напряжение питания ардуино до 3.5 В или как- нибудь иначе согласовать лог уровни

1 лайк

В кратчайшее время, постепенно, отвечу на вопросы, заданные мне.

А пока скажу, что у меня была и почти такая мысль, как в #29 от Дим-мычъ.

И поделюсь своими изысканиями.

Решил проверить - на каком этапе возникают ошибки.
С этой целью сократил скетч ESP до минимума:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

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

ESP8266WebServer server(10200);

IPAddress ip(192, 168, 0, 62);
IPAddress dns(8, 8, 8, 8);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

void setup()
{
  WiFi.config(ip, dns, gateway, subnet);
  Serial.begin(115200);
  delay(100);

  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);

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

  server.on("/s", razborki);

  server.begin();
}

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

void razborki()
{
  server.send(200, "text/plain", server.arg(0));  // arg(0) из GET-запроса - возвращаю обратно
}

Этот фрагмент программы (Delphi) на компьютере отправляет GET-запрос.

procedure TForm1.Button5Click(Sender: TObject);
var idHttp: TIdHTTP;
  out_str, inp_str: string;
begin
  out_str := '12345678901234567890'; // строка для отправки 20 символов
  try
    idHttp := TIdHTTP.Create(nil);
    try
      IP := trim(Form1.Edit1.Text); // IP-адрес из настроек
      inp_str := idHttp.Get('http://' + IP + ':10200/s?s=' + out_str); // GET-запрос
      Form1.Label1.Caption := inp_str; // inp_str вывожу на форму
      application.ProcessMessages;
    finally
      idHttp.Free;
    end;
  finally
  end;
  // и дальше сравниваю отправленную строку с принятой
  // строки совпадают!
  if (inp_str = out_str) then Form1.Label3.Caption := inp_str + ' OK'
  else Form1.Label3.Caption := 'Error';
end;

Получаю такую же строку.
Значит, ошибка пороисходит при передаче аргумента в ARDUINO через Serial.

Либо надо посмотреть в сторону GPIO.

Либо подумать о согласовании уровней ESP TX с ARDUINO RX.

Или при обработке принятых данных

1 лайк

Да. Вот это и заставило меня проделать то, о чем я расписал в #30.

Это интересно. Попробую.

Может быть их не бывает при согласованных уровнях?

Пользуюсь. А еще у меня есть для отладки “светофор”: три светодиода.

Попробую поставить транзистор в режиме ключа от ESP к ARDUINO. Но там надо будет ещё сигнал инвертировать.

Не надо там ничего инвертировать

1 лайк

Начните с того, что создайте такие же минимальные скетчи для ЕСП и ардуино, которые обмениваются данными через сериал

Выложите их на форум

1 лайк

ESP01

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

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

ESP8266WebServer server(10200);


IPAddress ip(192, 168, 0, 62);
IPAddress dns(8, 8, 8, 8);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

void setup()
{
  WiFi.config(ip, dns, gateway, subnet);
  Serial.begin(115200);
  delay(100);

  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
  }
  server.on("/s", razborki);
  server.begin();
}

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

void razborki()
{
  Serial.println(server.arg(0)); // один единственный аргумент из GET-запроса передаю в ARDUINO
  delay(250); // жду ответ от ARDUINO

  String stroka = "w"; // просто так

  if (Serial.available() > 0)
  {

    while (Serial.available() > 0)
    {
      char sim = Serial.read();
      byte simb = (byte) sim;

      if (!((simb == 10) || (simb == 13))) stroka += sim;

    }
    server.send(200, "text/plain", stroka);   // успех
  }
  else
  {
    server.send(200, "text/plain", "Oblom"); // ARDUINO не ответила
  }
}

Arduino

String stroka;
byte colwo = 0;
void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  Serial.begin(115200);
}
void loop()
{
  if (Serial.available() > 0)
  {
    char priem = Serial.read();
    if (priem == '\n')
    {
      bool prizerror = false;
      for (int i = 0; i <= 13; i++) if (stroka[i] != stroka[i + 14]) prizerror = true; // сравниваю половины строки
      if (prizerror == true)
      {
        digitalWrite(13, 0);
        Serial.println("ERROR " + stroka + String(colwo));
      }
      else
      {
        digitalWrite(13, 1);
        Serial.println("OK " + stroka + String(colwo));
      }
      stroka = "";
      colwo = 0; // количество нужных символов: цифр и точек
    }
    else
    {
      if ((byte) priem != 13)
      {
        if (((priem >= '0') && (priem <= '9')) || (priem == '.'))
        {
          stroka += priem; // приклеиваю ТОЛЬКО нужный символ
          colwo++;
        }
      }
      // если строку 35 заменить на: if (true),
      // то colwo=28, но stroka в строке 26 приходит в ESP с искаженным символом
    }
  }
}

это все что?

Вы читать умеете? Я вам написал

1 лайк

ESP01 с ардуины по AT-командам “рулить” можно было. Чем не понравилось?

1 лайк

В коде Arduino я работу с сетью не вижу.
Код ESP сейчас буду пробовать такой:

const int period = 1000;
unsigned long moment;
void setup()
{
  Serial.begin(115200);
}
void loop()
{
  if (millis()-moment>period)
  {
    Serial.println("123456789.12.3123456789.12.3");
    moment+=period;
  }
}

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

МММ направляет меня на верный путь.
Но есть еще непонятки.

Выполнил его рекомендации из #34.

Вот скетч ESP:

const int period = 1000;
unsigned long moment;
void setup()
{
  Serial.begin(115200);
}
void loop()
{
  if (millis()-moment>period)
  {
    Serial.println("123456789.12.3123456789.12.3");
    moment+=period;
  }
}

Вот скетч Arduino:

int st;
String stroka;
byte colwo = 0;
void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  Serial.begin(115200);
}
void loop()
{
  if (Serial.available() > 0)
  {
    char priem = Serial.read();
    if (priem == '\n')
    {
      st++;
      bool prizerror = false;
      for (int i = 0; i <= 13; i++) if (stroka[i] != stroka[i + 14]) prizerror = true; // сравниваю половины строки
      if (prizerror == true)
      {
        digitalWrite(13, 0);
        Serial.println(String(st)+" ERROR " + stroka +' '+ String(colwo));
      }
      else
      {
        digitalWrite(13, 1);
        Serial.println(String(st)+" OK " + stroka +' '+ String(colwo));
      }
      stroka = "";
      colwo = 0; // количество нужных символов: цифр и точек
    }
    else
    {
      if ((byte) priem != 13)
      {
        if (((priem >= '0') && (priem <= '9')) || (priem == '.'))
        {
          stroka += priem; // приклеиваю ТОЛЬКО нужный символ
          colwo++;
        }
      }
      // если строку 35 заменить на: if (true),
      // то colwo=28, но stroka в строке 26 приходит в ESP с искаженным символом
    }
  }
}

Работает почти четко. За 840 циклов было несколько ошибок.
В строке 28 (arduino) перед " ОК " стоит пробел. Один раз при выводе этот пробел пропал: "ОК ".
Другой раз пробел был вместо буквы “О”: " К ". Еще в двух случаях пропадало по одному символу.

Значит, ошибка возникает в этом месете (ESP): Serial.println(server.arg(0)); ???
Но при отправке server.arg(0) в интернет: server.send(200, “text/plain”,server.arg(0)); ошибок не замечено.
Как это исправить - пока не знаю.

Вот результат работы:

Если символы пропадают, то это уже таксебе симптомы.

1 лайк