Ошибка тайм-аута с Arduino Mega и ESP8266 в качестве модуля Wi-Fi

Я пытаюсь использовать ESP8266 в качестве модуля Wi-Fi на основе этого учебника. Мои связи следующие:

ESP8266 <-----------------> Arduino Mega
VCC     ------------------> 3.3V (converted 5V from Mega to 3.3V using LD33V)
CH_PD   ------------------> 3.3V
GND     ------------------> GND
RX      ------------------> TX1(Pin 18)
TX      ------------------> RX1(Pin 19)

Я проверил скорость передачи данных, введя AT-команды со скоростью 115200 бод, и ESP отвечает. Ниже приведен мой код, который я пытаюсь использовать:

#include "WiFiEsp.h"
#include <PubSubClient.h>

const char* ssid = "MySSID";
const char* password = "MyPassword";
int status = WL_IDLE_STATUS; //статус Wi-Fi радио
byte* messageBuff;

//MQTT
const char* mqtt_server = "192.xxx.x.xxx";
//const char* mqtt_topic = "Rpi_Master";
const char* mqtt_username = "username";
const char* mqtt_password = "password";
//ID клиента
const char* clientID = "A_1";


//Переменные для чисел
long randNumber1;
String rn1;
char rn1_char[50];
long randNumber2;
String rn2;
char rn2_char[50];
long randNumber3;
String rn3;
char rn3_char[50];
long randNumber4;
String rn4;
char rn4_char[50];
long randNumber5;
String rn5;
char rn5_char[50];
long randNumber6;
String rn6;
char rn6_char[50];

WiFiEspClient wifiClient;
PubSubClient client(mqtt_server, 1883, wifiClient); //1883 — это порт слушателя для брокера

void callback(char* topic, byte* payload, unsigned int length) {


    Serial.print("Message Received: [");
    Serial.print(topic);
    Serial.println("]");
    Serial.print("Message is:");
    String message = (char *)payload;
    Serial.println(message);

    Serial.println();
    if (!strncmp((char *)payload, "Start", length)) //Начальный код можно изменить на любое строковое значение вместо 1
    {
      randomNumberGenerator();
      client.publish("Arduino_A", "OK");
    }

}

void reconnect() {
  //Цикл, пока мы не переподключимся
  while (!client.connected())
  {
    Serial.print("Attempting MQTT Connection...");
    //Попытка подключения
    if (client.connect(clientID, mqtt_username, mqtt_password))
    {
      Serial.println("connected");
      //После подключения публикуем объявление
      client.publish("Arduino_A", "Please send the pass code to send the values");
      //и переподписаться
      client.subscribe("Rpi_Master"); //Это имя можно изменить
    }
    else
    {
      Serial.print("failed, rc = ");
      Serial.print(client.state());
      Serial.println("Trying again in 5 seconds");
      // Подождите 5 секунд перед повторной попыткой
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  Serial1.begin(115200);

  // инициализируем модуль ESP
  WiFi.init(&Serial1);
  Serial.println("Attempting to connect to WPA network");
  status = WiFi.begin(ssid, password);
  // если вы не подключены, остановитесь здесь
  if (status != WL_CONNECTED)
  {
    Serial.println("Couldn't get a wifi network");
    while (true);
  }
  //если вы подключены, распечатайте информацию о подключении
  else
  {
    Serial.println("Connected to the network");
  }
  //client.setServer(сервер, 1883);
  client.setCallback(callback);
  // Разрешить аппаратному обеспечению сортировать себя
  delay(1500);
  randomSeed(25);
}

void loop() {
  if (!client.connected())
  {
    reconnect();
  }
  // задержка (1000);
  client.loop();
  delay(50);
}

void randomNumberGenerator()
{
    randNumber1 = random(10,20);
    Serial.println(randNumber1); // вывести случайное число от 0 до 299
    rn1 = String(randNumber1);
    rn1.toCharArray(rn1_char, rn1.length() + 1);
    randNumber2 = random(20, 30);// вывести случайное число от 10 до 19
    Serial.println (randNumber2);
    rn2 = String(randNumber2);
    rn2.toCharArray(rn2_char, rn2.length() + 1);
    randNumber3 = random(30,40);
    Serial.println(randNumber3);
    rn3 = String(randNumber3);
    rn3.toCharArray(rn3_char, rn1.length() + 1);
    randNumber4 = random (40,50);
    Serial.println(randNumber4);
    rn4 = String(randNumber4);
    rn4.toCharArray(rn4_char, rn4.length() + 1);
    randNumber5 = random (50,60);
    Serial.println(randNumber5);
    rn5 = String(randNumber5);
    rn5.toCharArray(rn5_char, rn5.length() + 1);
    randNumber6 = random (60,70);
    Serial.println(randNumber6);
    rn6 = String(randNumber6);
    rn6.toCharArray(rn6_char, rn6.length() + 1);
    client.publish("LC_1", rn1_char);
    client.publish("LC_2", rn2_char);
    client.publish("LC_3", rn3_char);
    client.publish("LC_4", rn4_char);
    client.publish("LC_5", rn5_char);
    client.publish("LC_6", rn6_char);
    client.publish("Arduino_A", "End Transaction");
}

В настоящее время я использую этот код для отправки 6 случайных значений всякий раз, когда от брокера отправляется запрос по MQTT. Я намерен заменить этот код, как только проблема с ошибкой будет решена. Код работает нормально, и ESP изначально подключается к брокеру (в моем случае Raspberry Pi). Однако через некоторое время я продолжаю получать сообщение об ошибке тайм-аута, а ESP8266 продолжает отключаться от сервера.

Я читал на других форумах, что ESP8266 не будет обрабатывать высокие скорости передачи, такие как 115200, и должен быть установлен на 9600. Может ли это быть причиной ошибки тайм-аута? Пожалуйста, дайте мне знать, какие изменения мне нужны, чтобы исправить эту проблему. Большое спасибо за ваше время заранее. Прикрепил скриншот ошибки.

, 👍-1


1 ответ


1

Старая библиотека WiFiEsp от Бруно Полтарури мало что может сделать с полученными большими данными. Прошивка AT отправляет все данные сразу, и последовательный буфер RX переполняется. Лучше работает со скоростью 9600 бод, что замедляет прошивку AT.

Трудно получить больше данных по сети с прошивкой AT без аппаратного управления потоком UART, а платы Arduino AVR не имеют управления потоком, а простые модули esp8266 не имеют открытых контактов управления потоком.

Моя новая библиотека WiFiEspAT использует новый режим пассивного приема, реализованный в прошивке AT 1.7.0 (SDK 3). Новый режим пассивного приема прошивки AT пока не поддерживается для UDP и безопасного соединения (SSL). По этой причине в новой библиотеке размер полученного UDP-сообщения ограничен настроенным размером буфера, а безопасное соединение (SSL, https) не поддерживается.

С моей новой библиотекой по аппаратному последовательному порту можно использовать высокие скорости передачи данных. Для Arduino Mega 500000 бод работает хорошо. Например, веб-сервер, обслуживающий веб-файлы с SD-карты, требует высокой скорости передачи данных, чтобы иметь возможность достаточно быстро обслуживать несколько файлов один за другим.

,

Спасибо Юрай. Попробую., @Prashant

@Prashant, помог ли ответ?, @Juraj