Светодиодная лента "WS2812" на "Wemos D1 mini" (WiFi отваливается от эффектов)

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
39
8
Захотелось сделать проект светодиодной ленты "WS2812" с удаленным управлением.

Сначала присмотрелся к проекту от "AlexGyver" без удаленки на "Arduino Nano": https://alexgyver.ru/ws2812b-fx/

Затем подкинул к проекту "ик-приемник" и с горечью осознал его несовместимость, т.к. стабильность кодов с пульта перебивает работа библиотеки "FastLED".
Попытки обработки через yield() и прочие уловки не давали нужной стабильности пульта на тяжелых эффектах.

Решил попробовать управление по WiFi и заказал плату "Wemos D1 Mini".
Использовал вышеуказанный проект на основе схемы подключения проекта "AlexGyverLamp" (пин - D4): https://alexgyver.ru/wp-content/uploads/2021/06/schemeEPIC.jpg
Далее подкинул библиотеку "GyverPortal" и уже через веб тыкал эффекты и снова столкнулся с нестабильностью - на тяжелых эффектах WiFi отваливается.
От смена контакта на D3 лучше не стало.
Насколько я понял, веб не успевает обрабатываться в цикле, т.к. его занимает библиотека "FastLED".

Так же пробовал сменить библиотеку на "WS2812FX" (со своим исполнением WEB) и все равно WiFi отваливался на более менее интересных эффектах (https://github.com/kitesurfer1404/WS2812FX)

Пошел гуглить и нагуглил интересный вариант подключения сигнала ленты через контакт RX (DMA \ I2S).
В вышеуказанной библиотеке "WS2812FX" даже нашелся нужный скетч "ws2812fx_dma".
Сверху добавил веб от "GyverPortal" и О чудо! Веб отваливаться перестал.

Вопрос: У всех есть проблемы с отвалом WiFi при тяжелых эффектах на плате "Wemos D1 Mini" с учетом подключения к цифровым D-пинам?

PS:

Может в ленте дело? Я не уверен, что моя лента "WS2812" с приставкой "B". Разницу не понимаю. Как-то прошляпился с описанием заказа на озоне. У меня метровая лента на 4-х контактных светодиодах 60 шт.:

https://www.ozon.ru/product/lenta-a...e_link&utm_medium=share_button&utm_source=smm
 

Сотнег

★★★★★★★
15 Янв 2020
4,131
1,443
@Zuker,
отваливается - это как?

Обычно проблемы с вайфаем случаются на бракованных платах.
И им помогает добавление строчки delay(5); в основном цикле loop().

А для ресурсоёмких алгоритмов эффектов рекомендуется увеличить скорость
в меню Инструменты с 80 до 160 ГГц (для палаты Wemos D1 Mini).
 
  • Лойс +1
Реакции: Zuker

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
39
8
@Zuker,
отваливается - это как?
К примеру, на основе https://github.com/GyverLibs/GyverPortal/blob/main/examples/demos/actionClick/actionClick.ino и https://alexgyver.ru/ws2812b-fx я набросал кнопок для смены эффектов - задействование функции change_mode(int newmode):

на картинке уже другая библиотека с эффектами, но суть та же
Безымянный.png

И при выборе того же эффекта №37, веб-страница пропадает и становится недоступна секунд 20. Т.е. эффект нельзя сменить до тех пор, пока он не закончится. И в это временное окошко еще нужно попасть. В таком случае остается перезагружать плату, чтобы перескочить на дефолтный статичный эффект.
Код эффекта №37:
//void change_mode(int newmode) {
//   ...
//   case 37: thisdelay = 20; break;                     // rainbowCycle
//   ...
//}
//void loop() {
//   ui.tick();
//   switch (ledMode) {
//      ...
//      case 37: rainbowCycle(thisdelay); break;
//      ...
//   }
//}
void rainbowCycle(int SpeedDelay) {
  byte *c;
  uint16_t i, j;

  for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
    for (i = 0; i < LED_COUNT; i++) {
      c = Wheel(((i * 256 / LED_COUNT) + j) & 255);
      setPixel(i, *c, *(c + 1), *(c + 2));
    }
    FastLED.show();
    delay(SpeedDelay);
  }
}
С другими эффектами разное время ожидание отклика веб-страницы. Первые по списку простые эффекты не заваливают веб.
С другой библиотекой "WS2812FX" такой же эффект - веб отваливается при выборе непростого эффекта: https://github.com/kitesurfer1404/WS2812FX/tree/master/examples/esp8266_webinterface

Покупал плату "Wemos D1 Mini" на Озоне
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
4,131
1,443
@Zuker,
так это просто у вас эффект неправильно написан.
Между циклами обслуживания веб-интерфейса 1280 раз перерисовать всю матрицу, да ещё и позависать столько же раз.

Не думаю, что плата вообще такое способна сделать.
Она, вроде, должна каждые 8 секунд перезагружаться у вас с такими эффектами.
 

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
39
8
@Сотнег,

Это эффект из исходника проекта "AlexGyver": https://alexgyver.ru/ws2812b-fx/
Дело в том, что это не единственный эффект из проекта, который делает веб-страницу недоступной на время выполнения самого эффекта.
В таком случае я не могу плавно переключать эффекты, приходится ожидать отклик веб-страницы, ее восстановления.
Как я писал выше, для эксперимента я взял другую библиотеку (WS2812FX) и тоже столкнулся с долгим откликом веб на разных эффектах.
Но когда я переключил сигнал ленты на контакт RX (DMA \ I2S), веб-страница стала стабильной при любых эффектах.

Без эффектов, на статичном цвете или другом простом эффекте веб-страница работает стабильно.
Если в основном цикле "loop()" вставить "Serial.print()" и посмотреть вывод в мониторе порта, то очевидна задержка в эффектах, дело до обработки веб просто не доходит.
Почему-то мой случай гуглится плохо. Что-то я делаю не так.
Подобная проблема: https://github.com/kitesurfer1404/WS2812FX/issues/307

Хотелось бы понять, в чем все таки дело - плата или неоптимизированные эффекты.
Как получить стабильность на D3\D4.
Думаю в будущем собрать "GyverLamp" и опасаюсь повторения ситуации.
При возможности попробую ваши советы. Спасибо!
 

Сотнег

★★★★★★★
15 Янв 2020
4,131
1,443
Это эффект из исходника проекта "AlexGyver":
Который вы переделали, не понимая смысла своих изменений.


Хотелось бы понять, в чем все таки дело - плата или неоптимизированные эффекты.
Проблема наверняка в вашем коде


очевидна задержка в эффектах, дело до обработки веб просто не доходит.
Вот-вот...
 

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
39
8
@Сотнег,

Эффекты я не переделывал. Это ж лень. Эффекты и код 99% беру чужие)))
Выше в код-блоке накидал код эффекта для общего понимания.
В проекте от AlexGyver используется прерывание (attachInterrupt) для смены эффектов по кнопке, что уже говорит о сильных задержках в эффектах.
Эффекты библиотеки "FastLED" все построены на этих delay()-задержках!
Хотя при беглом осмотре проекта "GyverLamp" как-то умудряется выполнять эффекты без "delay()".

Было бы у Wemos два ядра, одно целиком бдит WiFi, другое на прочие расходы. Было бы без проблем.
 

Сотнег

★★★★★★★
15 Янв 2020
4,131
1,443
при беглом осмотре проекта "GyverLamp" как-то умудряется выполнять эффекты без "delay()".
Ну вот и будет вам пример, как нужно делать.

Было бы у Wemos два ядра, одно целиком бдит WiFi, другое на прочие расходы. Было бы без проблем.
На ESP32 два ядра.
И скетчей с эффектами и с веб-интерфейсами много написано.

Но вряд ли ядра распределяются так, как вы придумали.