Ошибка тайм-аута с 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. Может ли это быть причиной ошибки тайм-аута? Пожалуйста, дайте мне знать, какие изменения мне нужны, чтобы исправить эту проблему. Большое спасибо за ваше время заранее. Прикрепил скриншот ошибки.
@Prashant, 👍-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-карты, требует высокой скорости передачи данных, чтобы иметь возможность достаточно быстро обслуживать несколько файлов один за другим.
- Проблема с WiFi на Mega + WiFi R3 ATmega2560 + ESP8266
- Как Arduino Mega 2560+Wifi Shield 2.0 (SeeedStudio) может получать данные из базы данных на сервере XAMPP на моем ПК?
- Существуют ли какие-либо модули Wi-Fi для Arduino или Uno, которые можно подключить к внешней антенне Wi-Fi?
- Ошибка тайм-аута Arduino Mega Wifi Shield
- Связь Mega <> esp8266 отправляет непонятные данные
- ESP8266 не подключается к Wi-Fi
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Можно ли отключить WiFi на ESP8266?
Спасибо Юрай. Попробую., @Prashant
@Prashant, помог ли ответ?, @Juraj