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;
}

Есть ли кто-нибудь, кто знает, что я сделал не так?

, 👍-1

Обсуждение

Вы уверены, что это фактический код, который вы используете? Он не компилируется, потому что вы вызываете server.begin (), но не объявили сервер., @jose can u c

Сначала вы останавливаете клиента, а затем продолжаете писать ему. Я понятия не имею, как именно реализован клиент, но вы можете себе представить, как это может привести к проблемам с памятью., @tttapa


1 ответ


0

Я сомневаюсь, что в этом проблема, но этот код выглядит неправильно.

  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