ESP8266 — веб-сервер не работает в цикле

У меня есть простой пример, где в цикле вызывается веб-сервер для обработки клиентов, а также для рисования текста на дисплее. Дело в том, что веб-сервер не отвечает, но когда я удаляю вторую часть цикла - рисование текста для отображения, веб-сервер начинает работать нормально.

Сервер не отвечает:

 void loop() {
      server.handleClient();
      unsigned long timeNow = millis();
      if ((timeNow > screenChangeTime))  {
          display.clear();
          display.setFont(ArialMT_Plain_16);
          display.setTextAlignment(TEXT_ALIGN_CENTER);
           display.drawString(12, 20,"Loaded: "+String(particles));
           screenChangeTime= timeNow + delay;
           display.display();
      }
    }

Сервер отвечает:

void loop() {
      server.handleClient();
}

, 👍0

Обсуждение

возможно, сторожевой таймер срабатывает из-за того, что цикл() занимает слишком много времени., @Juraj

Ваш способ обработки миллисекунд неверен; на рулоне счетчика миллис у вас будут проблемы. Лучше использовать обычный способ (if ((millis() - предыдущее время) >= screenChangeTime) { предыдущее время += screenChangeTime; ... }), @frarugi87

@ frarugi87, хотя это может быть проблемой в долгосрочной перспективе (примерно через 49 дней и 17 часов после включения питания), вряд ли это будет проблемой здесь., @Phil Haigh

@Phil, если переменная screenChangeTime не является unsigned long (даже если я сомневаюсь, что это не так), проблемы возникают гораздо раньше. В любом случае, я знаю, что это не проблема, и на самом деле это был комментарий, а не ответ., @frarugi87

Я видел такую проблему на устройствах с поддержкой Arduino, таких как Adafruit Trinket, когда не хватает памяти. Я понимаю, что вы используете чип ESP8266, но все же проверьте, есть ли у вас ограничения памяти., @barrypicker


1 ответ


1

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

Какое значение имеет delay? Я предполагаю, что вы выбрали слишком низкое число здесь. И вы действительно должны установить это новое время после обновления отображения с помощью display.display();.

Ваш веб-сервер не отвечает, потому что он недостаточно часто вызывается внутри этого кода.

,

Цель оператора if — не рисовать каждый раз, это также не блокирующая функция., @Tvde1