ESP, IoT Моргает нулевой светодиод ленты

Кидори

✩✩✩✩✩✩✩
20 Май 2021
4
1
При подключению к WIFI начинает безумно моргать нулевой светодиод ленты.

Делаю ночник управляемый через Blynk.
Плата esp8266-01s.

Мучаюсь 5 день так и не придумал как исправить.

C++:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h>
#include <BlynkSimpleEsp8266.h>

#ifndef STASSID
#define STASSID "xxxxxx"
#define STAPSK  "xxxxxx"
#endif

const char* host = "esp8266";
const char* ssid = STASSID;
const char* password = STAPSK;

char auth[] = "XXXXX";

ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;


#include "FastLED.h"

#define LED_COUNT 87
#define LED_DT 0

int max_bright = 255;
int ledMode = 5;


// цвета мячиков для режима
byte ballColors[3][3] = {
  {0xff, 0, 0},
  {0xff, 0xff, 0xff},
  {0   , 0   , 0xff},
};

// ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ-----------------
int BOTTOM_INDEX = 85;
int TOP_INDEX = int(LED_COUNT / 2);
int EVENODD = LED_COUNT % 2;
struct CRGB leds[LED_COUNT];
int ledsX[LED_COUNT][3];

int thisdelay = 20;          //-FX LOOPS DELAY VAR
int thisstep = 10;           //-FX LOOPS DELAY VAR
int thishue = 0;             //-FX LOOPS DELAY VAR
int thissat = 255;           //-FX LOOPS DELAY VAR

int thisindex = 0;
int thisRED = 0;
int thisGRN = 0;
int thisBLU = 0;

int idex = 0;                //-LED INDEX (0 to LED_COUNT-1
int ihue = 0;                //-HUE (0-255)
int ibright = 0;             //-BRIGHTNESS (0-255)
int isat = 0;                //-SATURATION (0-255)
int bouncedirection = 0;     //-SWITCH FOR COLOR BOUNCE (0-1)
float tcount = 0.0;          //-INC VAR FOR SIN LOOPS
int lcount = 0;              //-ANOTHER COUNTING VAR
// ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ-----------------

void setup(void) {

  pinMode(LED_DT, OUTPUT);
  digitalWrite(LED_DT, LOW);

  //  delay(100);

  LEDS.setBrightness(max_bright);
  LEDS.addLeds<WS2812B, LED_DT, GRB>(leds, LED_COUNT);

  one_color_all(0, 0, 0);
  LEDS.show();

  leds[0].setRGB(255, 0, 0); LEDS.show();
  delay(1500);

  leds[0].setRGB(0, 255, 0); LEDS.show();
  delay(1500);

  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);

  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    WiFi.begin(ssid, password);
    delay(500);
  }

  leds[0].setRGB(0, 0, 255); LEDS.show();
  delay(1500);

  MDNS.begin(host);

  httpUpdater.setup(&httpServer);
  httpServer.begin();

  MDNS.addService("http", "tcp", 80);

  Blynk.config(auth);

  leds[0].setRGB(0, 255, 255); LEDS.show();
  delay(1500);
}

void loop(void) {
  httpServer.handleClient();
  MDNS.update();

  Blynk.run();

  switch (ledMode) {
    case 999: break;
    case  0: one_color_all(0, 0, 0); break;
    case  1: one_color_all(255, 0, 0); break;
    case  2: rainbow_fade(); break;            // плавная смена цветов всей ленты
    case  3: rainbow_loop(); break;            // крутящаяся радуга
    case  4: random_burst(); break;            // случайная смена цветов
    case  5: color_bounce(); break;            // бегающий светодиод
    case  6: color_bounceFADE(); break;        // бегающий паровозик светодиодов
    case  7: ems_lightsONE(); break;           // вращаются красный и синий
    case  8: ems_lightsALL(); break;           // вращается половина красных и половина синих
    case  9: flicker(); break;                 // случайный стробоскоп
    case 10: pulse_one_color_all(); break;     // пульсация одним цветом
    case 11: pulse_one_color_all_rev(); break; // пульсация со сменой цветов
    case 12: fade_vertical(); break;           // плавная смена яркости по вертикали (для кольца)
    case 13: rule30(); break;                  // безумие красных светодиодов
    case 14: random_march(); break;            // безумие случайных цветов
    case 15: rwb_march(); break;               // белый синий красный бегут по кругу (ПАТРИОТИЗМ!)
    case 16: radiation(); break;               // пульсирует значок радиации
    case 17: color_loop_vardelay(); break;     // красный светодиод бегает по кругу
    case 18: white_temps(); break;             // бело синий градиент (?)
    case 19: sin_bright_wave(); break;         // тоже хрень какая то
    case 20: pop_horizontal(); break;          // красные вспышки спускаются вниз
    case 21: quad_bright_curve(); break;       // полумесяц
    case 22: flame(); break;                   // эффект пламени
    case 23: rainbow_vertical(); break;        // радуга в вертикаьной плоскости (кольцо)
    case 24: pacman(); break;                  // пакман
    case 25: random_color_pop(); break;        // безумие случайных вспышек
    case 26: ems_lightsSTROBE(); break;        // полицейская мигалка
    case 27: rgb_propeller(); break;           // RGB пропеллер
    case 28: kitt(); break;                    // случайные вспышки красного в вертикаьной плоскости
    case 29: matrix(); break;                  // зелёненькие бегают по кругу случайно
    case 30: new_rainbow_loop(); break;        // крутая плавная вращающаяся радуга
    case 31: strip_march_ccw(); break;         // чёт сломалось
    case 32: strip_march_cw(); break;          // чёт сломалось
    case 33: colorWipe(0x00, 0xff, 0x00, thisdelay);
      colorWipe(0x00, 0x00, 0x00, thisdelay); break;                                // плавное заполнение цветом
    case 34: CylonBounce(0xff, 0, 0, 4, 10, thisdelay); break;                      // бегающие светодиоды
    case 35: Fire(55, 120, thisdelay); break;                                       // линейный огонь
    case 36: NewKITT(0xff, 0, 0, 8, 10, thisdelay); break;                          // беготня секторов круга (не работает)
    case 37: rainbowCycle(thisdelay); break;                                        // очень плавная вращающаяся радуга
    case 38: TwinkleRandom(20, thisdelay, 1); break;                                // случайные разноцветные включения (1 - танцуют все, 0 - случайный 1 диод)
    case 39: RunningLights(0xff, 0xff, 0x00, thisdelay); break;                     // бегущие огни
    case 40: Sparkle(0xff, 0xff, 0xff, thisdelay); break;                           // случайные вспышки белого цвета
    case 41: SnowSparkle(0x10, 0x10, 0x10, thisdelay, random(100, 1000)); break;    // случайные вспышки белого цвета на белом фоне
    case 42: theaterChase(0xff, 0, 0, thisdelay); break;                            // бегущие каждые 3 (ЧИСЛО СВЕТОДИОДОВ ДОЛЖНО БЫТЬ НЕЧЁТНОЕ)
    case 43: theaterChaseRainbow(thisdelay); break;                                 // бегущие каждые 3 радуга (ЧИСЛО СВЕТОДИОДОВ ДОЛЖНО БЫТЬ КРАТНО 3)
    case 44: Strobe(0xff, 0xff, 0xff, 10, thisdelay, 1000); break;                  // стробоскоп

    case 45: BouncingBalls(0xff, 0, 0, 3); break;                                   // прыгающие мячики
    case 46: BouncingColoredBalls(3, ballColors); break;                            // прыгающие мячики цветные

    case 888: demo_modeA(); break;             // длинное демо
    case 889: demo_modeB(); break;             // короткое демо
  }
}

BLYNK_WRITE(V0)
{
  int newmode = param.asInt();
  change_mode(newmode);
}
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
4,366
1,494
@Кидори,
а одна из этих?
IMG_20210606_211034.jpg

Если не получится, понижайте версию библиотеки FastLED.
Наверное, она у вас на новое ядро уже завязана.
 
Изменено:

Кидори

✩✩✩✩✩✩✩
20 Май 2021
4
1
@Сотнег,

Я использую esp8266-01s. Выбор пал из за компактного размера, возможность выбрать плату больше размером нету.

Моргания происходят только при подключение к wifi. Без подключения к интернету работает все отлично.
 

Сотнег

★★★★★★★
15 Янв 2020
4,366
1,494
@Кидори,
вряд ли ваш скетч был сделан после обновления ядра до 3.0.0.
Возможно даже, вместе со скетчем есть папка с теми версиями библиотек, под которые он был написан, и указано, под которую версию ядра.

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

bort707

★★★★★★✩
21 Сен 2020
3,056
910
Моргания происходят только при подключение к wifi. Без подключения к интернету работает все отлично.
если все остальное работает - простое сермяжное решение - заклеить первый светодиод, чтобы его было не видно
 
  • Вау +0
Реакции: stepko

Кидори

✩✩✩✩✩✩✩
20 Май 2021
4
1
@Сотнег, скетч писал я, все версии библиотек взял свежие. Из чужих скетчей взял только циклы для анимаций.

Попробую еще раз понизить версию, на 2.7.4 не давал компилировать(

@Сотнег,
Удалил 3.0.0 полностью закачал с нуля 2.7.4 и действительно это решило мою проблему)
Низкий поклон.

@Сотнег,

Разрешите задать вопрос.

В скейтче для плавности анимации используются delay(), но в документации esp не рекомендуют их использовать так как нарушает стабильность подключения.

Как быть с задержкой для ленты и чтобы не нарушить основной цикл делеями.
 
  • Лойс +1
Реакции: Сотнег

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@Сотнег, второй раз замечаю, что вы людям ГайверТаймер рекомендуете, для скетчей с FastLED. Вопрос - зачем в скетче, где подключен FastLED эта библиотека - ГайверТаймер? Если в самом FastLED есть масса, просто масса методов работы с таймингами. Те же EVERY_N_MILLIS() как пример, или с интервалами как EVERY_N_MILLIS_I(). Я уже о всяких beatsin() молчу, и других генераторах чисел в интервалах. Они работают в пределах всей программы, при этом отлично, а не только в эффектах. В чем цимис?
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
4,366
1,494
@kostyamat,
я даю ссылку на урок про таймеры.
Там первые строчки кода на странице - самый обычный таймер из трёх строчек.

А в ФастЛеде там вот такой монстр для каждой копии создаётся:
C-like:
class CEveryNTimePeriods {
public:
    timeType mPrevTrigger;
    timeType mPeriod;
    CEveryNTimePeriods() { reset(); mPeriod = 1; };
    CEveryNTimePeriods(timeType period) { reset(); setPeriod(period); };
    void setPeriod( timeType period) { mPeriod = period; };
    timeType getTime() { return (timeType)(timeGetter()); };
    timeType getPeriod() { return mPeriod; };
    timeType getElapsed() { return getTime() - mPrevTrigger; }
    timeType getRemaining() { return mPeriod - getElapsed(); }
    timeType getLastTriggerTime() { return mPrevTrigger; }
    bool ready() {
        bool isReady = (getElapsed() >= mPeriod);
        if( isReady ) { reset(); }
        return isReady;
    }
    void reset() { mPrevTrigger = getTime(); };
    void trigger() { mPrevTrigger = getTime() - mPeriod; };
    operator bool() { return ready(); }
};
 
Изменено:

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632

@Сотнег,
И в чем же его монструозность? Просто набор простеньких методов для удобства программиста, не более. Ничуть не тяжелее такового "монстра" из ГайверТаймер. И заметьте - FastLED уже полключен к проекту. Почему же тогда не использовать его возможности?