Wemos D1 mini зависает через несколько минут
Я использую мини-плату Wemos D1 для управления светодиодной лентой RGB и запрограммировал простой код с помощью Arduino IDE. Wemos подключается к моему Интернету просто отлично, и с помощью IP-адреса я могу изменить значения RGB полосы. Все работает, но через несколько минут плата зависает, и ничего не работает. После сброса он снова работает.
Я также подключил простую схему к плате только для того, чтобы управлять RGB-светодиодной лентой с несколькими транзисторами, ничего такого, что могло бы вызвать проблему, а также если я ничего не подключаю к плате, возникает проблема.
Я также протестировал пример из библиотеки Wemos, но там та же проблема. Вот мой код, который я использовал (И извините, если код не так хорошо запрограммирован, я новичок ;)):
#include <ESP8266WiFi.h>
const char* ssid = "my SSID";
const char* pass = "my password";
void setup() {
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D5, OUTPUT);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.begin(9600);
//Serial.println(WiFi.localIP());
server.begin();
}
void setColor(String rgb)
{
String rgb_val = rgb.substring(4, rgb.lastIndexOf('H'));
String red_val = rgb_val.substring(1,rgb_val.indexOf(':'));
String green_val = rgb_val.substring(rgb_val.indexOf(':') + 1,rgb_val.indexOf(':',rgb_val.indexOf(':') + 1));
String blue_val = rgb_val.substring(rgb_val.lastIndexOf(':') + 1);
int redval = red_val.toInt();
int greenval = green_val.toInt();
int blueval = blue_val.toInt();
analogWrite(D5, redval);
analogWrite(D2, greenval);
analogWrite(D1, blueval);
redval = redval >= 1023 ? 1023 : redval <= 0 ? 0 : redval;
if (redval == 0)
analogWrite(D5, 0);
greenval = greenval >= 1023 ? 1023 : greenval <= 0 ? 0 : greenval;
if (greenval == 0)
analogWrite(D1, 0);
blueval = blueval >= 1023 ? 1023 : blueval <= 0 ? 0 : blueval;
if (blueval == 0)
analogWrite(D2, 0);
return;
}
void loop() {
//delay(50) //just a test if there are not so many updates
WiFiClient client = server.available();
if (!client) return;
while (!client.available()) delay(1);
String request = client.readStringUntil('\r');
client.flush();
//Serial.print(request);
setColor(request);
client.stop();
client.print("HTTP/1.1 200 OK\r\n");
client.flush();
return;
}
Есть ли кто-нибудь, кто знает, что я сделал не так?
@rlcmtzc, 👍-1
Обсуждение1 ответ
Я сомневаюсь, что в этом проблема, но этот код выглядит неправильно.
int redval = red_val.toInt();
analogWrite(D5, redval);
redval = redval >= 1023 ? 1023 : redval <= 0 ? 0 : redval;
if (redval == 0)
analogWrite(D5, 0);
Я думаю, что это должно быть больше похоже на это:
int redval = red_val.toInt();
if (redval > 1023) // Если это>1023, вам нужно установить его на 1023.
redval= 1023;
else if (redval < 0)
redval = 0;
analogWrite(D5, redval);
Встроенный оператор if слишком уродлив и на самом деле ничего не добавляет.
Честно говоря, я бы посмотрел на то, чтобы включить этот код в функции, чтобы его было легче читать, и я подозреваю, что вы обнаружите проблему.
Когда эти микропроцессоры через некоторое время останавливаются, это обычно память, тепло или электричество. Если вы проверили электрику и она довольно быстро остановилась, вероятно, это утечка памяти. Таким образом, рефакторинг вашего кода может помочь людям легче определить проблему.
Возможно, вы захотите заменить вызов setColour()
вызовом Serial.println()
и посмотреть, устранит ли это проблему. Если это не так, то ваша проблема в том, как вы звоните клиенту.
Хорошо, я просто отредактировал код, как вы сказали, а также заменил функцию вызова на Serial.println (), но проблема снова возникла через несколько секунд, @rlcmtzc
- esp8266 WiFi не может подключиться к PHP- серверу
- Как разрешить междоменные запросы на ESP8266 WebServer
- Почему мы используем client.flush() в коде, когда мы подключаем Esp8266 к Интернету или серверу?
- Управление реле 5В с помощью Wemos D1 R1
- Создать один сервер в режиме точки доступа, а другой - в режиме станции.
- Веб-сервер ESP8266 недоступен через 2 минуты после сброса
- Веб-сервер ESP8266 отображает только текст, даже если тип контента — текст/HTML.
- Ошибка при компиляции скетча для Arduino Uno (ld return 1)
Вы уверены, что это фактический код, который вы используете? Он не компилируется, потому что вы вызываете server.begin (), но не объявили сервер., @jose can u c
Сначала вы останавливаете клиента, а затем продолжаете писать ему. Я понятия не имею, как именно реализован клиент, но вы можете себе представить, как это может привести к проблемам с памятью., @tttapa