NodeMCU ESP8266 отключился от WiFi после нескольких часов работы
Я попытался протестировать NodeMCU ESP8266 с помощью этого кода из здесь
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
/* Set these to your desired credentials. */
const char *ssid = "dummy"; //ВВЕДИТЕ НАСТРОЙКИ WIFI
const char *password = "12345678";
//Веб/адрес сервера для чтения/записи
const char *host = "192.168.43.128"; //https://circuits4you.com веб-сайт или IP-адрес сервера
//=============================================== =======================
// Включаем настройку
//=============================================== =======================
void setup() {
delay(1000);
Serial.begin(115200);
WiFi.mode(WIFI_OFF); // Предотвращает проблему повторного подключения (слишком долгое подключение)
delay(1000);
WiFi.setSleepMode(WIFI_NONE_SLEEP);
WiFi.mode(WIFI_STA); //Эта строка скрывает просмотр ESP как точки доступа Wi-Fi
WiFi.begin(ssid, password); //Подключитесь к вашему Wi-Fi роутеру
Serial.println("");
Serial.print("Connecting");
// Ждем подключения
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//Если подключение успешное, показать IP-адрес в последовательном мониторе
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //IP-адрес, присвоенный вашему ESP
}
//=============================================== =======================
// Основной цикл программы
//=============================================== =======================
void loop() {
HTTPClient http; //Объявляем объект класса HTTPClient
String ADCData, station, postData;
int adcvalue=analogRead(A0); //Чтение аналогового значения LDR
ADCData = String(adcvalue); // Преобразование строки в подмножество
station = "A";
//Отправить данные
postData = "status=" + ADCData + "&station=" + station ;
http.begin("http://192.168.43.128/c4yforum/postdemo.php"); // Указываем место назначения запроса
http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // Указываем заголовок типа контента
int httpCode = http.POST(postData); //Отправить запрос
String payload = http.getString(); //Получить полезную нагрузку ответа
Serial.println(httpCode); //Выводим код возврата HTTP
Serial.println(payload); //Печать полезной нагрузки ответа на запрос
http.end(); //Закрыть соединение
delay(5000); //Отправлять данные каждые 5 секунд
}
Он работал хорошо и отправлял данные в базу данных через несколько часов. Потом каким-то образом отключился от WiFi. Конечно, я снова сбросил питание. Подключено.
Как мне исправить этот код, чтобы повторно подключить Wi-Fi сразу после аварии или какое-либо другое решение для этого? Спасибо
@ELIP, 👍0
Обсуждение2 ответа
Лучший ответ:
Что вам нужно сделать, так это оставить плату подключенной к вашему компьютеру и наблюдать за последовательным монитором, чтобы зафиксировать выходные данные во время сбоя. Если на плате произошел настоящий сбой, она выведет кучу информации, которая может сказать вам, почему она сбой. Это может быть проблема со строками/кучей или проблема с памятью, поскольку вы объявляете новый объект http каждые 5 секунд. Может быть, попробуйте поставить HTTPClient http; выровняйте, где вы объявляете переменную хоста, чтобы это была глобальная переменная, а не локальная переменная.
Поскольку ваш цикл не проверяет, чтобы убедиться, что соединение Wi-Fi все еще хорошее, если вы получите отключение, программа просто завершится ошибкой и никогда не попытается повторно подключиться. Итак, в начале вашего основного цикла поместите ту же логику тестирования Wi-Fi, что и в функции настройки. Если соединение не работает, выполните сброс и начните с самого начала, чтобы восстановить соединение Wi-Fi.
if (WiFi.status() != WL_CONNECTED) {
ESP.reset()
}
Спасибо . Я объявил HTTPClient http ; метод вне цикла. Однако он все еще получает те же ошибки. Предположим, что это может быть проблема со строками/кучей или, возможно, проблема с памятью. Как мне поступить, пожалуйста?, @ELIP
Это сработало для меня! Спасибо, @ELIP
У меня тоже были такие проблемы. Я искал некоторые публикации, например здесь. Вы можете попробовать эти коды
void loop()
{
WiFiClient client;
Serial.printf("\n[Connecting to %s ... ", host);
if (client.connect(host, 80))
{
Serial.println("connected]");
Serial.println("[Sending a request]");
client.print(String("GET /") + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n" +
"\r\n"
);
Serial.println("[Response:]");
while (client.connected() || client.available())
{
if (client.available())
{
String line = client.readStringUntil('\n');
Serial.println(line);
}
}
client.stop();
Serial.println("\n[Disconnected]");
}
else
{
Serial.println("connection failed!]");
client.stop();
}
delay(5000);
}
Что касается секунд, как сказал @tavis, вы можете попробовать от здесь. Звучит ESP.restart(); рекомендуется вместо ESP.reset(); Кажется, наша проблема очень сложна.
Спасибо, что поделился, @ELIP
- Простой запрос GET с ESP8266HTTPClient
- Скетч Arduino для NodeMCU v1.0 (ESP8266-12E) не имеет ошибок при компиляции, но не запускается на плате NodeMCU v1.0 (ESP8266-12E)
- Как связать MPU9250 и NodeMcu?
- NodeMCU не может подключиться к мобильной точке доступа, когда я включаю коды для считывания датчика температуры
- Невозможно извлечь основные данные с помощью ThingspeakHTTP.
- nodemcu не отвечает в командном режиме
- Как получить список IP-адресов в локальной сети с помощью NodeMcu?
- Как код, набранный в Arduino IDE, работает на nodemcu?
не используйте String таким образом. https://majenko.co.uk/blog/evils-arduino-strings, @Juraj