ESP, IoT WiFi лампа-будильник. Обсуждение проекта

Сообщение изъято на правах администрации
ВНИМАНИЕ !!!
те кто живой и хочет увидеть ссылку на свое исполнение, прошу централизовать все свои доработки и сообщения. Далее в теме пишем сообщение с ссылкой на ваше сообщение (с проектом), с пометкой @mechanic .


В данной ветке обсуждаются только сия проект. Общие вопросы, доработки и проблемы, не относящиеся к конкретным прошивкам!. Вопросы по прошивкам решаем в темах самих прошивок. Здесь такие разговоры оффтоп.
Всякий любой вопрос не по теме сразу удаляется БЕЗ объяснения причины!
Для этого есть соответствующие ветки форума. Вопрос почему удалили мой пост? также удаляется.

  • Общаясь на форуме будьте взаимно вежливы!
  • Обратите внимание на то, что у нас принято говорить Спасибо путём повышения репутации, нажав на кнопочку
    .
  • Если есть претензии то нажмите кнопку .
  • Запрещено писать красным цветом в ваших постах - этот цвет только для Модераторов .
  • Вопросы, ответ на которые есть в шапке или в FAQ, будут удаляться. За повторный вопрос пользователь может быть наказан.
  • Убедительная просьба придерживаться тематики ветки, избегать флуда и оффтопа!
Очень часто при первом запуске лампы, при подключении к сети лампы не открывается менеджер сетей WIFI.
Помогает комментирование строки #define ESP_USE_BUTTON (отключение кнопки) и заливка скетча выставив Erase flash в All Flash Content
После того, как вы подключили лампу к сети эту строку можно раскомментировать и залить скетч с параметром Erase flash установленным в Only Sketh
Наш участник собрал много полезной информации по блокам питания для лампы. Качественное питание - необходимое условие надёжной работы любого устройства. Изучаем: https://community.alexgyver.ru/threads/nebolshoj-opus-po-bp-dlja-gyverlamp-wifi-lampa-budilnik.3523/

ВНИМАНИЕ! Если у вас не компилируется или не загружается скетч - значит вы сделали что-то неправильно. Специально для вас созданы две темы:
ESP8266, проблема с компиляцией скетча
ESP8266, проблема с загрузкой скетча
Читайте (ЧИТАЙТЕ! Не пишите!) эти темы, там уже есть решение вашей проблемы.
Здесь подобные вопросы считаются оффтопом и молча удаляются, а авторы получают баллы нарушений.
 

Комментарии

recoshet

★✩✩✩✩✩✩
15 Июн 2019
1
14
Сообщение изъято на правах администрации
ВНИМАНИЕ !!!
те кто живой и хочет увидеть ссылку на свое исполнение, прошу централизовать все свои доработки и сообщения. Далее в теме пишем сообщение с ссылкой на ваше сообщение (с проектом), с пометкой @mechanic .


В данной ветке обсуждаются только сия проект. Общие вопросы, доработки и проблемы, не относящиеся к конкретным прошивкам!. Вопросы по прошивкам решаем в темах самих прошивок. Здесь такие разговоры оффтоп.
Всякий любой вопрос не по теме сразу удаляется БЕЗ объяснения причины!
Для этого есть соответствующие ветки форума. Вопрос почему удалили мой пост? также удаляется.

  • Общаясь на форуме будьте взаимно вежливы!
  • Обратите внимание на то, что у нас принято говорить Спасибо путём повышения репутации, нажав на кнопочку
    .
  • Если есть претензии то нажмите кнопку .
  • Запрещено писать красным цветом в ваших постах - этот цвет только для Модераторов .
  • Вопросы, ответ на которые есть в шапке или в FAQ, будут удаляться. За повторный вопрос пользователь может быть наказан.
  • Убедительная просьба придерживаться тематики ветки, избегать флуда и оффтопа!
Очень часто при первом запуске лампы, при подключении к сети лампы не открывается менеджер сетей WIFI.
Помогает комментирование строки #define ESP_USE_BUTTON (отключение кнопки) и заливка скетча выставив Erase flash в All Flash Content
После того, как вы подключили лампу к сети эту строку можно раскомментировать и залить скетч с параметром Erase flash установленным в Only Sketh
Наш участник собрал много полезной информации по блокам питания для лампы. Качественное питание - необходимое условие надёжной работы любого устройства. Изучаем: https://community.alexgyver.ru/threads/nebolshoj-opus-po-bp-dlja-gyverlamp-wifi-lampa-budilnik.3523/

ВНИМАНИЕ! Если у вас не компилируется или не загружается скетч - значит вы сделали что-то неправильно. Специально для вас созданы две темы:
ESP8266, проблема с компиляцией скетча
ESP8266, проблема с загрузкой скетча
Читайте (ЧИТАЙТЕ! Не пишите!) эти темы, там уже есть решение вашей проблемы.
Здесь подобные вопросы считаются оффтопом и молча удаляются, а авторы получают баллы нарушений.
 

Belokota

★✩✩✩✩✩✩
24 Дек 2019
101
32
@Сотнег, мне понравились первый, 17 и 18(если я правильно понял). 18 это квадрат со шлейфом, вот бы из нашего бегающего кубика такое сделать. Но опять же, у нас разрешение матрицы ниже. Как будет смотреться пока не ясно.
 

Сотнег

★★★★★★★
15 Янв 2020
4,340
1,492
Попытался первый портировать (№11)...
Пока что без звезды, вылетающей из центра. Только кометы.
Но что-то не получается. Не знаю, в чём ошибка.
C-like:
// ------------------------------ ЭФФЕКТ БОЛЬШОЙ ВЗРЫВ ----------------------
// https://github.com/marcmerlin/NeoMatrix-FastLED-IR/blob/master/Table_Mark_Estes_Impl.h
// https://github.com/marcmerlin/FastLED_NeoMatrix_SmartMatrix_LEDMatrix_GFX_Demos/blob/master/LEDMatrix/Table_Mark_Estes/Table_Mark_Estes.ino
unsigned int  counter;//, ringdelay, bringdelay, sumthum;
int16_t shifty = 6;//, pattern = 0, poffset;
int16_t fpeed[WIDTH * 3], fcount[WIDTH * 3], fcolor[WIDTH * 3], fcountr[WIDTH * 3];//, xxx, yyy, dot = 3, radius2, rr, gg, bb, adjunct = 3;
uint16_t h = 0, howmany;// ccoolloorr, why1, why2, why3, eeks1, eeks2, eeks3, oldpattern, xhowmany, kk;
float driftx, drifty;//, locusx, locusy, xcen, ycen, yangle, xangle;
float xfire[WIDTH * 3], yfire[WIDTH * 3], cangle, sangle;//radius, xslope[MATRIX_WIDTH * 3], yslope[MATRIX_WIDTH * 3];
void whitewarp() {
  hue++;//increment the color basis
  h = hue;  //set h to the color basis
  counter++;
  if (counter % shifty == 0) driftx =  driftx + cangle;//move the x center every so often
  if (driftx > (WIDTH - spirocenterX / 2))//change directin of drift if you get near the right 1/4 of the screen
    cangle = 0 - abs(cangle);
  if (driftx < spirocenterX / 2)//change directin of drift if you get near the right 1/4 of the screen
    cangle = abs(cangle);
  if ((counter + shifty / 2) % shifty == 0) drifty =  drifty + sangle;//move the y center every so often
  if (drifty > ( HEIGHT - spirocenterY / 2))// if y gets too big, reverse
    sangle = 0 - abs(sangle);
  if (drifty < spirocenterY / 2) {// if y gets too small reverse
    sangle = abs(sangle);
  }

  driftx = constrain(driftx, spirocenterX - spirocenterX / 3, spirocenterX + spirocenterX / 3);//constrain the center, probably never gets evoked any more but was useful at one time to keep the graphics on the screen....
  drifty = constrain(drifty, spirocenterY - spirocenterY / 3, spirocenterY - spirocenterY / 3);


  if (loadingFlag)
  {
    loadingFlag = false;
    setCurrentPallete();

    hue = random8();//get a starting point for the color progressions
    driftx = random8(4, WIDTH - 4);//set an initial location for the animation center
    drifty = random8(4, HEIGHT - 4);// set an initial location for the animation center
  
    cangle = (sin8(random(25, 220)) - 128.0) / 128.0;//angle of movement for the center of animation gives a float value between -1 and 1
    sangle = (sin8(random(25, 220)) - 128.0) / 128.0;//angle of movement for the center of animation in the y direction gives a float value between -1 and 1
    shifty = random (3, 12);//how often the drifter moves
  
    howmany = random (spirocenterX * 3 / 2, WIDTH + 4 );

    for (int i = 0; i < howmany; i++) {
      fcount[i] = random8(); //angle
      fcolor[i] = random8();
      fpeed[i] = random(2, 12);
      xfire[i] = driftx;
      yfire[i] = drifty;

    }
  }

  for (int i = 0; i < howmany; i++)
  {
    xfire[i] = xfire[i] + fpeed[i] / 4.0 * (sin8(fcount[i] + h ) - 128.0) / 128.0;
    yfire[i] = yfire[i] + fpeed[i] / 4.0 * (cos8(fcount[i] + h ) - 128.0) / 128.0;

//    if (!flip2)
//      leds[XY(xfire[i], yfire[i])] = CRGB::White;
//    else
      leds[XY((uint8_t)round(xfire[i]), (uint8_t)round(yfire[i]))] = CHSV(fcolor[i] , 255, 255); //one shade of color

    if (xfire[i] < 0 || yfire[i] < 0 || xfire[i] > WIDTH || yfire[i] > HEIGHT) {
      xfire[i] = driftx;
      yfire[i] = drifty;
      fcount[i] = random8(); //angle
      fcolor[i] = random8();
      fpeed[i] = random8(2, 12);
    }
  }
//  if (!flip2)
    leds[XY((uint8_t)round(xfire[howmany - 1]), (uint8_t)round(yfire[howmany - 1]))] = CHSV(fcolor[howmany - 1] , 255, 255);//many color
//  else
//    leds[XY((uint8_t)round(xfire[howmany - 1]), (uint8_t)round(yfire[howmany - 1]))] = CRGB::White;
}
 
Изменено:
  • Лойс +1
Реакции: menooooo

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@Сотнег, ИМХО, ни один не подходит. Там все под большое разрешение матрицы и плоский экран, а не для круглой лампы.
 

Okashnik_

✩✩✩✩✩✩✩
22 Апр 2020
1
0
Здравствуйте, делал всё по инструкции, но пробовал подключить ленту ws2811 - 12V(тк другой не имеется). Работало корректно, но лента светится тускло, розовым цветом. подал на ESP 5v, на ленту 12, землю соединил. В результате при включении в розетку загораются (и горят так постоянно, типа как на фото) последовательно рандомное количество участков рандомным светом, при работе и смене режимов работает только три первых участка, но не правильно отображается цвет. при выключении через кнопку светодиоды статически горят. Концы ленты соединил, конденсатор и резистор ставил. Вроде как у 12 вольтовой ленты логический вход 5в, поставил логический усилитель с 3,3v (с ESP) на 5v., результат тот же.
Следовательно вопрос, сталкивался ли кто-нибуть с подобной проблемой, и какие пути её решения, или сама лента не подходит для этих целей?
 

Вложения

Сотнег

★★★★★★★
15 Янв 2020
4,340
1,492
Лампа перестала отвечать программе Arduino IDE по воздуху.
Сетевой порт теперь не появляется. Выключение из розетки не помогает.

Но с приложением работает без проблем. В режим OTA, вроде бы, переключается.
С компьютера по ip пингуется.


Кто сталкивался, как решилось? Неохота разбирать корпус...

update:
Сидел, минут 15 тыкал в долбаную сенсорную кнопку, пытаясь вызвать режим ОТА без подключения приложения.
Пару раз вызвал какой-то неизвестный мне режим.
Лампа осталась клиентом роутера и пароль от него не просила.
Но порт появился...
 
Изменено:

Belokota

★✩✩✩✩✩✩
24 Дек 2019
101
32
@Сотнег, у меня было несколько иначе. Из приложения ввожу в режим обновления, порт появляется, после компиляции просит пароль на загрузку, но загрузка не идёт. Помогала перезагрузка компа. В режим обновления ввожу только с приложения - зачем жать кнопку(морзянка)? А лампу всё таки пришлось разобрать для перевода выхода на матрицу на пин D5 (GPIO14) на всякий случай, хотя проблем на D4 не было.
 

Сотнег

★★★★★★★
15 Янв 2020
4,340
1,492
В режим обновления ввожу только с приложения - зачем жать кнопку(морзянка)?
Я где-то читал, что контроллер может глюкануть, и перестать поддерживать 2 параллельных подключения (приложение + обновление).
В этом случае предлагалось не занимать подключение приложением, а сразу открывать подключение для прошивки.
 

Belokota

★✩✩✩✩✩✩
24 Дек 2019
101
32
@Сотнег, я это подозревал и сразу после перехода лампы в режим прошивки выхожу из приложения и после этого запускаю компиляцию и заливку скетча на компе.
 

Сотнег

★★★★★★★
15 Янв 2020
4,340
1,492
Так оно никуда не денется, если уже было открыто, даже если приложение закрыть.
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
Я где-то читал, что контроллер может глюкануть, и перестать поддерживать 2 параллельных подключения (приложение + обновление).
В этом случае предлагалось не занимать подключение приложением, а сразу открывать подключение для прошивки.
Я вообще хз, но у меня нормально дефолтный порт не работал, пришлось перейти на 3232 для OTA через PlatformIO, ну и добавить альтернативный вариант - через http... Так что глючить может, но причины - не сильно мне понятны.
 

victory_lad

★✩✩✩✩✩✩
17 Сен 2019
56
22
На винде10 были проблемы с непоявлением сетевого порта. Грешил на плату, но оказалась это винда качевряжилась, потому что на 7ке все работало идеально. Поставил 8ку второй системой, на ней тоже все хорошо работает, всё появляется и обновляется. Но есть прикол, когда после перезагрузки лампы из режима точки доступа в локальный, при вызове OTA, лампа тупо перезагружалась и со второй попытки всё нормально вызывается. Вот только с этим проблема. Хотя даже и не проблема, если при переходе лампы из одного режима сети в другой, просто отключить/ включить питание. Если не прошивается, может нужно глянуть во вкладку инструментов в ардуино иде и настроить как это должно быть🤷‍♂️
 

Gogy

★✩✩✩✩✩✩
14 Апр 2019
80
14
Лампа перестала отвечать программе Arduino IDE по воздуху.
Сетевой порт теперь не появляется. Выключение из розетки не помогает.

Но с приложением работает без проблем. В режим OTA, вроде бы, переключается.
С компьютера по ip пингуется.


Кто сталкивался, как решилось? Неохота разбирать корпус...

update:
Сидел, минут 15 тыкал в долбаную сенсорную кнопку, пытаясь вызвать режим ОТА без подключения приложения.
Пару раз вызвал какой-то неизвестный мне режим.
Лампа осталась клиентом роутера и пароль от него не просила.
Но порт появился...
У меня не совсем аналогия, ОТА был доступен и порт выбирался но плата "притворялась", что прошивается , но я особо разбираться не стал, перепрошил по ПРОВОДУ в режиме "All flash contents" и вот уже месяца четыре проблем 3 X тьфу.
 

victory_lad

★✩✩✩✩✩✩
17 Сен 2019
56
22
Новый
Эффект Мерцание
По сути это наш Конфетти, только светодиоды загораются и гаснут постепенно.
Эффект стоящий!

Сперва сделал адаптацию кода от автора идеи, потом решил, что для возможности регулировки скорости проще будет написать с нуля свой простой эффект вместо того, чтобы пытаться переделать это чудовище.
C-like:
// добавлено изменение текущей палитры (используется во многих эффектах ниже для бегунка Масштаб)
const TProgmemRGBPalette16 *palette_arr[] = {&PartyColors_p, &OceanColors_p, &LavaColors_p, &HeatColors_p, &WaterfallColors_p, &CloudColors_p, &ForestColors_p, &RainbowColors_p, &RainbowStripeColors_p};
const TProgmemRGBPalette16 *curPalette = palette_arr[0];
void setCurrentPallete(){
      if (modes[currentMode].Scale > 100) modes[currentMode].Scale = 100; // чтобы не было проблем при прошивке без очистки памяти
      curPalette = palette_arr[(int)((float)modes[currentMode].Scale/100*((sizeof(palette_arr)/sizeof(TProgmemRGBPalette16 *))-1U))];
}

C-like:
CRGB ledsbuff[NUM_LEDS];// на эту строчку будет ругаться, если она уже есть в вашей прошивке

// ------------------------------ ЭФФЕКТ МЕРЦАНИЕ ----------------------
// (c) SottNick

#define TWINKLES_SPEEDS 4     // всего 4 варианта скоростей мерцания
#define TWINKLES_MULTIPLIER 6 // слишком медленно, если на самой медленной просто по единичке добавлять

void twinklesRoutine(){
    if (loadingFlag)
    {
      loadingFlag = false;
      setCurrentPallete();
      hue = 0U;
      for (uint32_t idx=0; idx < NUM_LEDS; idx++) {
        if (random8(modes[currentMode].Scale % 11U) == 0){
          ledsbuff[idx].r = random8();                          // оттенок пикселя
          ledsbuff[idx].g = random8(1, TWINKLES_SPEEDS * 2 +1); // скорость и направление (нарастает 1-4 или угасает 5-8)
          ledsbuff[idx].b = random8();                          // яркость
        }
        else
          ledsbuff[idx] = 0;                                    // всё выкл
      }
    }
    for (uint32_t idx=0; idx < NUM_LEDS; idx++) {
      if (ledsbuff[idx].b == 0){
        if (random8(modes[currentMode].Scale % 11U) == 0 && hue > 0){  // если пиксель ещё не горит, зажигаем каждый ХЗй
          ledsbuff[idx].r = random8();                          // оттенок пикселя
          ledsbuff[idx].g = random8(1, TWINKLES_SPEEDS +1);     // скорость и направление (нарастает 1-4, но не угасает 5-8)
          ledsbuff[idx].b = ledsbuff[idx].g;                    // яркость
          hue--; // уменьшаем количество погасших пикселей
        }
      }
      else if (ledsbuff[idx].g <= TWINKLES_SPEEDS){             // если нарастание яркости
        if (ledsbuff[idx].b > 255U - ledsbuff[idx].g - TWINKLES_MULTIPLIER){            // если досигнут максимум
          ledsbuff[idx].b = 255U;
          ledsbuff[idx].g = ledsbuff[idx].g + TWINKLES_SPEEDS;
        }
        else
          ledsbuff[idx].b = ledsbuff[idx].b + ledsbuff[idx].g + TWINKLES_MULTIPLIER;
      }
      else {                                                    // если угасание яркости
        if (ledsbuff[idx].b <= ledsbuff[idx].g - TWINKLES_SPEEDS + TWINKLES_MULTIPLIER){// если досигнут минимум
          ledsbuff[idx].b = 0;                                  // всё выкл
          hue++; // считаем количество погасших пикселей
        }
        else
          ledsbuff[idx].b = ledsbuff[idx].b - ledsbuff[idx].g + TWINKLES_SPEEDS - TWINKLES_MULTIPLIER;
      }
      if (ledsbuff[idx].b == 0)
        leds[idx] = 0U;
      else
        leds[idx] = ColorFromPalette(*curPalette, ledsbuff[idx].r, ledsbuff[idx].b);
    }
}

C-like:
// ------------------------------ ЭФФЕКТ МЕРЦАНИЕ ----------------------
// https://github.com/marcmerlin/FastLED_NeoMatrix_SmartMatrix_LEDMatrix_GFX_Demos/blob/master/FastLED/TwinkleFOX/TwinkleFOX.ino
// TwinkleFOX by Mark Kriegsman: https://gist.github.com/kriegsman/756ea6dcae8e30845b5a
// адаптация (c) SottNick

// Overall twinkle speed.
// 0 (VERY slow) to 8 (VERY fast).
// 4, 5, and 6 are recommended, default is 4.
#define TWINKLE_SPEED 4

// Overall twinkle density.
// 0 (NONE lit) to 8 (ALL lit at once).
// Default is 5.
#define TWINKLE_DENSITY 5

// Also: toward the bottom of the file is an array
// called "ActivePaletteList" which controls which color
// palettes are used; you can add or remove color palettes
// from there freely.

// Background color for 'unlit' pixels
// Can be set to CRGB::Black if desired.
CRGB gBackgroundColor = CRGB::Black;
// Example of dim incandescent fairy light background color
// CRGB gBackgroundColor = CRGB(CRGB::FairyLight).nscale8_video(16);

// If AUTO_SELECT_BACKGROUND_COLOR is set to 1,
// then for any palette where the first two entries
// are the same, a dimmed version of that color will
// automatically be used as the background color.
#define AUTO_SELECT_BACKGROUND_COLOR 0

// If COOL_LIKE_INCANDESCENT is set to 1, colors will
// fade out slighted 'reddened', similar to how
// incandescent bulbs change color as they get dim down.
#define COOL_LIKE_INCANDESCENT 1

uint8_t attackDecayWave8( uint8_t i)
{
  if( i < 86) {
    return i * 3;
  } else {
    i -= 86;
    return 255 - (i + (i/2));
  }
}

// This function takes a pixel, and if its in the 'fading down'
// part of the cycle, it adjusts the color a little bit like the
// way that incandescent bulbs fade toward 'red' as they dim.
void coolLikeIncandescent( CRGB& c, uint8_t phase)
{
  if( phase < 128) return;

  uint8_t cooling = (phase - 128) >> 4;
  c.g = qsub8( c.g, cooling);
  c.b = qsub8( c.b, cooling * 2);
}

//  This function takes a time in pseudo-milliseconds,
//  figures out brightness = f( time ), and also hue = f( time )
//  The 'low digits' of the millisecond time are used as
//  input to the brightness wave function.
//  The 'high digits' are used to select a color, so that the color
//  does not change over the course of the fade-in, fade-out
//  of one cycle of the brightness wave function.
//  The 'high digits' are also used to determine whether this pixel
//  should light at all during this cycle, based on the TWINKLE_DENSITY.
CRGB computeOneTwinkle( uint32_t ms, uint8_t salt)
{
  uint16_t ticks = ms >> (8-TWINKLE_SPEED);
  uint8_t fastcycle8 = ticks;
  uint16_t slowcycle16 = (ticks >> 8) + salt;
  slowcycle16 += sin8( slowcycle16);
  slowcycle16 =  (slowcycle16 * 2053) + 1384;
  uint8_t slowcycle8 = (slowcycle16 & 0xFF) + (slowcycle16 >> 8);

  uint8_t bright = 0;
  if( ((slowcycle8 & 0x0E)/2) < TWINKLE_DENSITY) {
    bright = attackDecayWave8( fastcycle8);
  }

  uint8_t hue = slowcycle8 - salt;
  CRGB c;
  if( bright > 0) {
    c = ColorFromPalette( *curPalette, hue, bright, NOBLEND);
    if( COOL_LIKE_INCANDESCENT == 1 ) {
      coolLikeIncandescent( c, fastcycle8);
    }
  } else {
    c = CRGB::Black;
  }
  return c;
}



//  This function loops over each pixel, calculates the
//  adjusted 'clock' that this pixel should use, and calls
//  "CalculateOneTwinkle" on each pixel.  It then displays
//  either the twinkle color of the background color,
//  whichever is brighter.
void drawTwinkles( )
{
    if (loadingFlag)
    {
      loadingFlag = false;
      setCurrentPallete();
    }


  // "PRNG16" is the pseudorandom number generator
  // It MUST be reset to the same starting value each time
  // this function is called, so that the sequence of 'random'
  // numbers that it generates is (paradoxically) stable.
  uint16_t PRNG16 = 11337;

  uint32_t clock32 = millis();

  // Set up the background color, "bg".
  // if AUTO_SELECT_BACKGROUND_COLOR == 1, and the first two colors of
  // the current palette are identical, then a deeply faded version of
  // that color is used for the background color
  CRGB bg;
  if (AUTO_SELECT_BACKGROUND_COLOR == 1)
//      && (gCurrentPalette[0] == gCurrentPalette[1] ))
  {
//    bg = gCurrentPalette[0];
    uint8_t bglight = bg.getAverageLight();
    if( bglight > 64) {
      bg.nscale8_video( 16); // very bright, so scale to 1/16th
    } else if( bglight > 16) {
      bg.nscale8_video( 64); // not that bright, so scale to 1/4th
    } else {
      bg.nscale8_video( 86); // dim, scale to 1/3rd.
    }
  } else {
    bg = gBackgroundColor; // just use the explicitly defined background color
  }

  uint8_t backgroundBrightness = bg.getAverageLight();
  // 320x240 = 76800, so we need an int32
  for ( uint32_t idx=0; idx < NUM_LEDS; idx++) {
    PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; // next 'random' number
    uint16_t myclockoffset16= PRNG16; // use that number as clock offset
    PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; // next 'random' number
    // use that number as clock speed adjustment factor (in 8ths, from 8/8ths to 23/8ths)
    uint8_t myspeedmultiplierQ5_3 =  ((((PRNG16 & 0xFF)>>4) + (PRNG16 & 0x0F)) & 0x0F) + 0x08;
    uint32_t myclock30 = (uint32_t)((clock32 * myspeedmultiplierQ5_3) >> 3) + myclockoffset16;
    uint8_t  myunique8 = PRNG16 >> 8; // get 'salt' value for this pixel

    // We now have the adjusted 'clock' for this pixel, now we call
    // the function that computes what color the pixel should be based
    // on the "brightness = f( time )" idea.
    CRGB c = computeOneTwinkle( myclock30, myunique8);

    uint8_t cbright = c.getAverageLight();
    int16_t deltabright = cbright - backgroundBrightness;
    if( deltabright >= 32 || (!bg)) {
      // If the new pixel is significantly brighter than the background color,
      // use the new color.
      leds[idx] = c;
    } else if( deltabright > 0 ) {
      // If the new pixel is just slightly brighter than the background color,
      // mix a blend of the new color and the background color
      leds[idx] = blend( bg, c, deltabright * 8);
    } else {
      // if the new pixel is not at all brighter than the background color,
      // just use the background color.
      leds[idx] = bg;
    }
  }
}
Да, эффект реально красивый. Вот так он выглядит на лампе: https://yadi.sk/i/KwNTxmE5rL-aPw
Не обращайте внимание на красные/розовые тона, лампа подключена к дохлому повербанку
 

Yaken

✩✩✩✩✩✩✩
20 Апр 2020
10
0
Ребят, еще такой вопрос: есть ли клиент для управления лампой для андроида или IOS на английском?
 

menooooo

★✩✩✩✩✩✩
4 Мар 2019
72
10
Попытался первый портировать (№11)...
Пока что без звезды, вылетающей из центра. Только кометы.
Но что-то не получается. Не знаю, в чём ошибка. Рисунок даже не близко похожий.
C-like:
// ------------------------------ ЭФФЕКТ БОЛЬШОЙ ВЗРЫВ ----------------------
unsigned int  counter;//, ringdelay, bringdelay, sumthum;
int16_t shifty = 6;//, pattern = 0, poffset;
int16_t fpeed[WIDTH * 3], fcount[WIDTH * 3], fcolor[WIDTH * 3], fcountr[WIDTH * 3];//, xxx, yyy, dot = 3, radius2, rr, gg, bb, adjunct = 3;
uint16_t h = 0, howmany;// ccoolloorr, why1, why2, why3, eeks1, eeks2, eeks3, oldpattern, xhowmany, kk;
float driftx, drifty;//, locusx, locusy, xcen, ycen, yangle, xangle;
float xfire[WIDTH * 3], yfire[WIDTH * 3], cangle, sangle;//radius, xslope[MATRIX_WIDTH * 3], yslope[MATRIX_WIDTH * 3];
void whitewarp() {

  counter++;
  if (counter % shifty == 0) driftx =  driftx + cangle;//move the x center every so often
  if (driftx > (WIDTH - e_centerX / 2))//change directin of drift if you get near the right 1/4 of the screen
    cangle = 0 - abs(cangle);
  if (driftx < e_centerX / 2)//change directin of drift if you get near the right 1/4 of the screen
    cangle = abs(cangle);
  if ((counter + shifty / 2) % shifty == 0) drifty =  drifty + sangle;//move the y center every so often
  if (drifty > ( HEIGHT - e_centerY / 2))// if y gets too big, reverse
    sangle = 0 - abs(sangle);
  if (drifty < e_centerY / 2) {// if y gets too small reverse
    sangle = abs(sangle);
  }

  driftx = constrain(driftx, e_centerX - e_centerX / 3, e_centerX + e_centerX / 3);//constrain the center, probably never gets evoked any more but was useful at one time to keep the graphics on the screen....
  drifty = constrain(drifty, e_centerY - e_centerY / 3, e_centerY - e_centerY / 3);


  if (loadingFlag)
  {
    loadingFlag = false;

    cangle = (sin8(random(25, 220)) - 128.0) / 128.0;//angle of movement for the center of animation gives a float value between -1 and 1
    sangle = (sin8(random(25, 220)) - 128.0) / 128.0;//angle of movement for the center of animation in the y direction gives a float value between -1 and 1
    shifty = random (3, 12);//how often the drifter moves

    howmany = random (e_centerX * 3 / 2, WIDTH + 4 );

    for (int i = 0; i < howmany; i++) {
      fcount[i] = random8(); //angle
      fcolor[i] = random8();
      fpeed[i] = random(2, 12);
      xfire[i] = driftx;
      yfire[i] = drifty;

    }
  }

  for (int i = 0; i < howmany; i++)
  {
    xfire[i] = xfire[i] + fpeed[i] / 4.0 * (sin8(fcount[i] + h ) - 128.0) / 128.0;
    yfire[i] = yfire[i] + fpeed[i] / 4.0 * (cos8(fcount[i] + h ) - 128.0) / 128.0;

//    if (!flip2)
//      leds[xfire[i], yfire[i]] = CRGB::White;
//    else
      leds[(uint8_t)round(xfire[i]), (uint8_t)round(yfire[i])] = CHSV(fcolor[i] , 255, 255); //one shade of color

    if (xfire[i] < 0 || yfire[i] < 0 || xfire[i] > WIDTH || yfire[i] > HEIGHT) {
      xfire[i] = driftx;
      yfire[i] = drifty;
      fcount[i] = random8(); //angle
      fcolor[i] = random8();
      fpeed[i] = random8(2, 12);
    }
  }
//  if (!flip2)
//    leds[(uint8_t)round(xfire[howmany - 1]), (uint8_t)round(yfire[howmany - 1])] = CHSV(fcolor[howmany - 1] , 255, 255);//many color
//  else
    leds[(uint8_t)round(xfire[howmany - 1]), (uint8_t)round(yfire[howmany - 1])] = CRGB::White;
}
У меня не работает... Мигает три светодиода верху и несколько внизу....
 

Сотнег

★★★★★★★
15 Янв 2020
4,340
1,492
@menooooo, я не могу понять, что с ним не так.
Если бы кто-то сказал, что у него на матрице размером 64х64 тоже всё плохо,
я бы перестал думать, что в моём коде нет ошибки.
:ROFLMAO:
 

ameTTi

✩✩✩✩✩✩✩
2 Янв 2020
4
0
Здраствуйте, Что с приложением для IOS? В поиске не нахожу. Через тунец для ПК написало, что недоступно для России. Как быть?
 

Сотнег

★★★★★★★
15 Янв 2020
4,340
1,492
@ameTTi, пока так:
 

YES IDI

★✩✩✩✩✩✩
11 Фев 2020
20
13
Так он же высотой сантиметров 10-12.
Этакий крошечный светильничек.
Так можно же поставить туда плафон из Леруа и будет полноценная версия. Только придется внутреннюю трубку, на которую крепятся светодиоды, увеличивать.
 

vlad5

✩✩✩✩✩✩✩
12 Ноя 2019
9
5
Только придется внутреннюю трубку, на которую крепятся светодиоды, увеличивать.
Ага, придется. А потом еще окажется что и плафон в корпус не лезет. Так что либо делать в том какой придет, либо сразу делать какой надо ;)