NodeMCU перестает отвечать через несколько часов
Я управляю некоторыми устройствами через реле и NodeMCU, он работает нормально и подключается без проблем, тем временем я его тестирую, но после того, как я оставляю его на 3 или более часов, он перестает отвечать. Мне нужно, чтобы эта система всегда работала без сна или чего-то еще. Вот мой код:
#include <ESP8266WiFi.h>
const char* ssid = "wifi_Guerrero ";
const char* password = "3245968530";
int ledPin = 13; // GPIO13
int ledPin2 = 12; // GPIO13
int desconectado = 5;
int conectado = 4;
WiFiServer server(80);
WiFiClient client;
int counter = 0;
void setup() {
Serial.begin(9600);
delay(10);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, LOW);
pinMode(conectado, OUTPUT);
pinMode(desconectado, OUTPUT);
digitalWrite(desconectado, HIGH);
connectWifi();
Serial.print(F("Setting static ip to : "));
Serial.println(WiFi.localIP());
// Start the server
server.begin();
Serial.println("Server started");
}
void loop() {
delay(200);
if (WiFi.status() != WL_CONNECTED) {
delay(100);
digitalWrite(conectado, LOW);
digitalWrite(desconectado, HIGH);
connectWifi();
}
// Check if a client has connected
client = server.available();
if (!client) {
return;
}
// Wait until the client sends some data
Serial.println("new client");
int t = millis();
while(!client.available()){
delay(1);
if (millis()-t>130) return;
}
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Match the request
if (request.indexOf("/switch") != -1) {
digitalWrite(ledPin, !digitalRead(ledPin));
digitalWrite(ledPin2, !digitalRead(ledPin2));
printSwitch();
}else if (request.indexOf("/uno") != -1) {
client.print("Canal 1 apagagado | Canal 2 encendido");
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, LOW);
}else if (request.indexOf("/dos") != -1){
client.print("Canal 1 encendido | Canal 2 apagado");
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, HIGH);
}else if (request.indexOf("/tres") != -1){
client.print("Canal 1 apagado | Canal 2 apagado");
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, HIGH);
}else if (request.indexOf("/cuatro") != -1){
client.print("Canal 1 encendido | Canal 2 encendido");
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
}else if (request.indexOf("/cinco") != -1){
printIP();
}else if (request.indexOf("/apagaruno") != -1){
client.print("Canal 1 apagado");
digitalWrite(ledPin, HIGH);
}else if (request.indexOf("/apagardos") != -1){
client.print("Canal 2 apagado");
digitalWrite(ledPin2, HIGH);
}else if (request.indexOf("/prenderuno") != -1){
client.print("Canal 1 encendido");
digitalWrite(ledPin, LOW);
}else if (request.indexOf("/prenderdos") != -1){
client.print("Canal 2 encendido");
digitalWrite(ledPin2, LOW);
}else if (request.indexOf("/canaluno") != -1){
if(digitalRead(ledPin) == HIGH) {
client.print("Off");
} else {
client.print("On");
}
}else if (request.indexOf("/canaldos") != -1){
if(digitalRead(ledPin2) == HIGH) {
client.print("Off");
} else {
client.print("On");
}
}
// Set ledPin according to the request
//digitalWrite(ledPin, value);
// Return the response
delay(1);
Serial.println("Client disonnected");
Serial.println("");
}
void printSwitch(){
if(digitalRead(ledPin) == LOW) {
client.print("Canal 1 Encendido");
} else {
client.print("Canal 1 Apagado");
}
Serial.println("");
if(digitalRead(ledPin2) == LOW) {
client.print("Canal 2 Encendido");
} else {
client.print("Canal 2 Apagado");
}
}
void printIP(){
delay(100);
client.print(WiFi.localIP());
}
void connectWifi()
{
Serial.print("Connecting to "+*ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// config static IP
IPAddress ip(192, 168, 0, 8);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
WiFi.config(ip, gateway, subnet);
digitalWrite(conectado, HIGH);
digitalWrite(desconectado, LOW);
Serial.println("");
Serial.println("Connected");
Serial.println("");
// Print the IP address
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}//end connect
@Javier Guerrero, 👍-1
Обсуждение1 ответ
Я думаю, что проблема заключается в этом определении
String request = client.readStringUntil('\r');
который вы определяете динамически в цикле, это, возможно, приводит к фрагментации кучи, вызывая сброс через некоторое время
Определите глобальный массив символов
char request [256] ={'\0'};
char c;
uint cc = 0;
и вместо этого работайте со строковыми функциями с
while(client.available()){
c = client.read();
if (c != '\r'){
request[cc] = c;
cc++;
}
else return;
}
затем обработайте заполненный буфер запроса следующим образом
if (strcmp(request,"/switch") != 0) {
....
}
Это должно поддерживать вашу экстрасенсорную активность
Это не компилируется. Вам нужна закрывающая круглая скобка в цикле while. Я тоже получаю: ошибка: пустая символьная константа char c = ";, @David Klempfner
Вам нужно добавить строку, где вы читаете, в этот буфер, чтобы убедиться, что вы не переполняете его. Убедитесь, что cc не превышает 255., @Delta_G
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Как изменить имя модуля ESP8266-12E по умолчанию
- Простой запрос GET с ESP8266HTTPClient
- В ESP-12E NodeMCU, какой выход PIN A0?
Вам нужно понять, почему он останавливается. Начните с чего-то вроде печати сообщений последовательного журнала и записи их в файл журнала, который можно проверить после сбоя. Предпочтительно делать это по чистому UART-соединению (к отдельному USB-последовательному логическому уровню) без использования встроенного USB-конвертера, если только вы не планируете подключать USB к работающему ПК. Хотя вы, конечно, можете начать с встроенного USB-накопителя и посмотреть, узнаете ли вы что-нибудь, просто существует риск того, что его подключение может скрыть причины сбоев, связанных с питанием., @Chris Stratton
Вы также должны рассмотреть вопрос о наличии конструктивных ошибок в вашей неуказанной электрической цепи. Особенно такие вещи, как недостаточное входное напряжение регулятора, катушки реле без диодов-ловушек или любое совместное использование логических и нагрузочных источников питания., @Chris Stratton
Я думаю, что проблема не в цепи или источнике питания, потому что я также оставил его в режиме AP, и когда статический ip, который я ему назначил,перестал отвечать, я подключился непосредственно к его AP с помощью 192.168.4.1, и он ответил, попробовав это, я попробовал еще раз со статическим IP и работал нормально. кажется, что он спит или что-то программно, @Javier Guerrero
Ответ здесь может вам помочь: https://arduinoprosto.ru/q/75494/esp8266-not-responding-after-random-intervals-of-time, @David Klempfner