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, проблема с загрузкой скетча
Читайте (ЧИТАЙТЕ! Не пишите!) эти темы, там уже есть решение вашей проблемы.
Здесь подобные вопросы считаются оффтопом и молча удаляются, а авторы получают баллы нарушений.
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
Посмотрите примеры мигалок светодиодом, думаю такой пример не тяжело найти :)
Наконец-то дошел до компьютера.
В общем для отключения светюликов достаточно написать супер-сложный код вида:
C++:
digitalWrite(2, true);
digitalWrite(16, true);
* Я отталкиваюсь от того, что значения приведенные на картинке комментарием ниже верные. :)

Посмотреть вложение 10833
Оба светодиода работают в «инвертированном» режиме с учетом уровней выводов - когда 1, светодиод выключен; когда 0, светодиод включен. Светодиод горит GPIO2 во время программирования ESP, так как он подключен к U1TXD контакту.
 
  • Лойс +1
Реакции: MadGrizly

Sapolio

✩✩✩✩✩✩✩
14 Мар 2020
1
0
Moscow
Спасибо за Ваши труды! Есть небольшая проблема.
Впервые прошил вашей прошивкой плату с маркировкой "D1 MINI PRO"
До этого делал лампу на прошивке гайвера и плате "NODEMCU"
Разница вышла следующая:
У Гайвера при первом обращении к WiFi платы можно было настроить подключение её к роутеру.
В Вашей - плата всегда стартует как ТД.
Я в файле констант нашёл следующее:
#define ESP_MODE (1U) // 0U - WiFi точка доступа, 1U - клиент WiFi (подключение к роутеру)
Ставил обе - результат "Рабочий режим лампы: ESP_MODE = 0"
Пробовал выставлять другие esp платы (ну потому что скриншоты же...) то же нет менеджера настроек к у Гайвера.
Может, он вырезан, а мне надо через код прошивки к домашней сети подключаться?
Прошу прощения за глупость. В расплату выложу заготовку своей подставки )
20200314_220448[1].jpg20200314_220527[1].jpg20200314_220617[1].jpg
Перед вами пробка от икеевского стеклянного кувшина. Фрезеровал в ручном режиме китайским дремелем под ограничительную насадку. Сверлом, т.к. фрезы в комплекте не оказалось )
Дальше буду как-то внедрять гнездо питания и отсек для двух 18650.
 

ssp1971

★★✩✩✩✩✩
14 Мар 2020
108
71
P00315-100530.jpgкак правильно сделать физическую кнопку? 1или 2 вариант? схему не нашол... или я вообще не так думаю?
 

Сотнег

★★★★★★★
15 Янв 2020
4,315
1,480
@ssp1971, если кнопку подключать на правильный пин, то резистор уже встроен в плату.
scheme2.jpg
 

ssp1971

★★✩✩✩✩✩
14 Мар 2020
108
71
это же другой проэкт. я собираю
ОГНЕННАЯ WIFI ЛАМПА

и заливаю в плату WEMOS прошивку от gunner47
 

ssp1971

★★✩✩✩✩✩
14 Мар 2020
108
71
нету в прошивке gunner47 возможности поменять параметр high_pull. поэтому и вопрос возник.
 

Сотнег

★★★★★★★
15 Янв 2020
4,315
1,480
@ssp1971, в строчке
GButton touch(BTN_PIN, LOW_PULL, NORM_OPEN);
поменяйте.
В файле GyverLamp_v1.4.ino
 
Изменено:

ssp1971

★★✩✩✩✩✩
14 Мар 2020
108
71
ДА. ВЫ правы. всё заработало после смены на high_pull в первой вкладке скетча. спасибище.
 

ssp1971

★★✩✩✩✩✩
14 Мар 2020
108
71
после пайки проэкта замучался с приложением сопрягать железо. рекомендую выполнить это как писал гуру http://wiki.amperka.ru/продукты:esp8266:flash-download-tool Если ESP8266/ESP32/NodeMCU/Wemos D1/ESP-based устройство не прошивается, не подключается к точке доступа, самопроизвольно перезагружается, то скачиваем ESP Download Tool, запускаем для ESP8266, выбираем порт и очищаем чип микроконтроллера нажатием на кнопку Erase
после Erase прошил заного и всё заработало как по маслу! кнопка механическая так включается
scheme1.jpg
 
Изменено:
  • Лойс +1
Реакции: Burai

Koteyka 🐱

★★★★★★✩
Команда форума
27 Окт 2019
935
556
54
Днепр, Украина
firelamp.pp.ua
ВНИМАНИЕ!!!
Приложение изменено кардинально, поэтому всё делаем внимательно...
...ну и на свой страх и риск.
1. В приложении добавлен английский язык (Включается, если изменить язык системы на отличный от русского).
2. Названия эффектов теперь хранятся не в строковых ресурсах, так что перевести эффекты на другой язык, отличный от русского или английского не получится. Если нужен перевод эффектов на другой язык, то задайте его в прошивке.
3. Добавлена возможность использовать эффекты из лампы (т.е. Названия и параметры эффектов можно задать прямо в прошивке и загрузить в приложение)
Для этого нужно в constants.h после списка эффектов добавить следующее:
C-like:
// ================ РЕЕСТР ДОСТУПНЫХ ЭФФЕКТОВ ===================
// ==== ДЛЯ ПЕРЕДАЧИ В ПРИЛОЖЕНИЯ С ПОДДЕРЖКОЙ ЭТОЙ ФУНКЦИИ =====
// формат записи:
//"Название эффекта,min_скорость,max_скорость,min_масштаб,max_масштаб,выбор_ли_цвета_это(0-нет,1-да, 2-для кометы);"
//                  это максимальная длина строчки с названием и параметрами
// Порядок эффектов можно менять на своё усмотрение, не забывая при этом менять номера в списке ВЫШЕ
// Можно добавлять новые или удалять ненужные эффекты сохраняя количество эффектов в каждой строке примерно одинаковым, т.е.
// общее количество эффектов делим на три строки
// Передаются частями из 3-х строк. !!!ЭФФЕКТ БЕГУЩАЯ СТРОКА ДОЛЖЕН БЫТЬ ПОСЛЕДНИМ ВСЕГДА!!!
// ОЧЕНЬ ВАЖНО!!! Следите за знаками при редавктировании эффектов. Не допускайте пробелов, кроме как в названии эффекта.
// В кавычках Имя эффекта и его параметры должны быть разделены запятой, а вконце точка с запятой.

const String efList_1 = String("LIST1;") +              // ПЕРВАЯ СТРОКА
String("Конфетти,100,1,1,255,0;") +                     // EFF_SPARKLES          (0U)
String("Огонь,100,1,1,255,1;") +                        // EFF_FIRE              (1U)
String("Водопад,100,1,1,255,1;") +                      // EFF_WHITTE_FIRE       (2U)
String("Радуга горизонтальная,100,1,1,50,0;") +         // EFF_RAINBOW_HOR       (3U)
String("Радуга вертикальная,100,1,1,50,0;") +           // EFF_RAINBOW_VER       (4U)
String("Радуга диагональная,100,1,1,50,0;") +           // EFF_RAINBOW_DIAG      (5U)
String("Смена цвета,1,10,1,1,0;") +                     // EFF_COLORS            (6U)
String("Безумие 3D,1,100,100,1,0;") +                   // EFF_MADNESS           (7U)
String("Облака 3D,1,100,100,1,0;") +                    // EFF_CLOUDS            (8U)
String("Лава 3D,1,100,100,1,0;") +                      // EFF_LAVA              (9U)
String(+ "\n");
const String efList_2 = String("LIST2;") +              // ВТОРАЯ СТРОКА
String("Плазма 3D,1,100,100,1,0;") +                    // EFF_PLASMA            (10U)
String("Радуга 3D,1,100,100,1,0;") +                    // EFF_RAINBOW           (11U)
String("Павлин 3D,1,100,100,1,0;") +                    // EFF_RAINBOW_STRIPE    (12U)
String("Зебра 3D,1,100,100,1,0;") +                     // EFF_ZEBRA             (13U)
String("Лес 3D,1,100,100,1,0;") +                       // EFF_FOREST            (14U)
String("Океан 3D,1,100,100,1,0;") +                     // EFF_OCEAN             (15U)
String("Цвет,70,70,1,255,1;") +                         // EFF_COLOR             (16U)
String("Снегопад,100,1,1,100,0;") +                     // EFF_SNOW              (17U)
String("Метель,100,1,1,100,0;") +                       // EFF_SNOWSTORM         (18U)
String("Звездопад,100,1,1,100,0;") +                    // EFF_STARFALL          (19U)
String(+ "\n");
const String efList_3 = String("LIST3;") +              // ТРЕТЬЯ СТРОКА
String("Матрица,100,1,1,100,0;") +                      // EFF_MATRIX            (20U)
String("Светлячки,100,1,1,100,0;") +                    // EFF_LIGHTERS          (21U)
String("Светлячки со шлейфом,100,1,1,100,0;") +         // EFF_LIGHTER_TRACES    (22U)
String("Пейнтбол,100,1,1,1,0;") +                       // EFF_PAINTBALL         (23U)
String("Блуждающий кубик,1,100,40,255,0;") +            // EFF_CUBE              (24U)
String("Аквариум,255,1,1,255,1;") +                     // EFF_AQUARIUM          (25U)
String("Пульс,100,1,1,100,0;") +                        // EFF_PULSE             (26U)
String("Комета,100,1,1,100,2;") +                       // EFF_COMET             (27U)
String("Белый свет,1,100,40,255,0;") +                  // EFF_WHITE_COLOR       (28U)
String("Бегущая строка,100,1,1,255,1;") +               // EFF_PAINTBALL        (29U)
String(+ "\n");
// ============= КОНЕЦ РЕЕСТРА =====
/* Для английской версии раскомментировать нижеследующее и закомментировать предыдущее
const String efList_1 = String("LIST1;") +              // ПЕРВАЯ СТРОКА
String("Confetti,100,1,1,255,0;") +                     // EFF_SPARKLES          (0U)
String("Fire,100,1,1,255,1;") +                         // EFF_FIRE              (1U)
String("Waterfall,100,1,1,255,1;") +                    // EFF_WHITTE_FIRE       (2U)
String("Rainbow horizontal,100,1,1,50,0;") +            // EFF_RAINBOW_HOR       (3U)
String("Rainbow vertical,100,1,1,50,0;") +              // EFF_RAINBOW_VER       (4U)
String("Rainbow diagonal,100,1,1,50,0;") +              // EFF_RAINBOW_DIAG      (5U)
String("Change of color,1,10,1,1,0;") +                 // EFF_COLORS            (6U)
String("Madness 3D,1,100,100,1,0;") +                   // EFF_MADNESS           (7U)
String("Clouds 3D,1,100,100,1,0;") +                    // EFF_CLOUDS            (8U)
String("Lava 3D,1,100,100,1,0;") +                      // EFF_LAVA              (9U)
String(+ "\n");
const String efList_2 = String("LIST2;") +              // ВТОРАЯ СТРОКА
String("Plasma 3D,1,100,100,1,0;") +                    // EFF_PLASMA            (10U)
String("Rainbow 3D,1,100,100,1,0;") +                   // EFF_RAINBOW           (11U)
String("Peacock 3D,1,100,100,1,0;") +                   // EFF_RAINBOW_STRIPE    (12U)
String("Zebra 3D,1,100,100,1,0;") +                     // EFF_ZEBRA             (13U)
String("Forest 3D,1,100,100,1,0;") +                    // EFF_FOREST            (14U)
String("Ocean 3D,1,100,100,1,0;") +                     // EFF_OCEAN             (15U)
String("Color,70,70,1,255,1;") +                        // EFF_COLOR             (16U)
String("Snowfall,100,1,1,100,0;") +                     // EFF_SNOW              (17U)
String("Snowstorm,100,1,1,100,0;") +                    // EFF_SNOWSTORM         (18U)
String("Starfall,100,1,1,100,0;") +                     // EFF_STARFALL          (19U)
String(+ "\n");
const String efList_3 = String("LIST3;") +              // ТРЕТЬЯ СТРОКА
String("Matrix,100,1,1,100,0;") +                       // EFF_MATRIX            (20U)
String("Fireflies,100,1,1,100,0;") +                    // EFF_LIGHTERS          (21U)
String("Fireflies with a train,100,1,1,100,0;") +       // EFF_LIGHTER_TRACES    (22U)
String("Paintball,100,1,1,1,0;") +                      // EFF_PAINTBALL         (23U)
String("Wandering Cube,1,100,40,255,0;") +              // EFF_CUBE              (24U)
String("Aquarium,255,1,1,255,1;") +                     // EFF_AQUARIUM          (25U)
String("Pulse,100,1,1,100,0;") +                        // EFF_PULSE             (26U)
String("Comet,100,1,1,100,2;") +                        // EFF_COMET             (27U)
String("White Light,1,100,40,255,0;") +                 // EFF_WHITE_COLOR       (28U)
String("Ticker,100,1,1,255,1;") +                       // EFF_PAINTBALL        (29U)
String(+ "\n");
*/
В parsing после
C-like:
    else if (!strncmp_P(inputBuffer, PSTR("GET"), 3))
    {
      sendCurrent(inputBuffer);
    }
Вставляем следующее:
C-like:
    else if (!strncmp_P(inputBuffer, PSTR("TXT"), 3)) {     // Принимаем текст для бегущей строки
      memcpy(buff, &inputBuffer[3], strlen(inputBuffer));
      String T = buff;
      int str_len = T.length() + 1;
      T.toCharArray(Text, str_len);
    }
    else if (!strncmp_P(inputBuffer, PSTR("LIST1"), 5))     // Список эффектов 1
    {
      char replyPacket[600U];
      efList_1.toCharArray(replyPacket, 600U);
      Udp.write(replyPacket);
    }
    else if (!strncmp_P(inputBuffer, PSTR("LIST2"), 5))     // Список эффектов 2
    {
      char replyPacket[600U];
      efList_2.toCharArray(replyPacket, 600U);
      Udp.write(replyPacket);
    }
    else if (!strncmp_P(inputBuffer, PSTR("LIST3"), 5))     // Список эффектов 3
    {
      char replyPacket[600U];
      efList_3.toCharArray(replyPacket, 600U);
      Udp.write(replyPacket);
    }
Для бегущей строки перед void stup() добавляем char* Text; а в самом void stup() вконце добавить Text = "ТУТ ВАШ ТЕКСТ ПО УМОЛЧАНИЮ, ЕСЛИ НЕ ЗАДАН В ПРИЛОЖЕНИИ";
Для вывода текста в effectTicker последней строкой перебора эффектов добавляем
C-like:
case EFF_TEXT:           fillString(Text, CHSV(modes[EFF_TEXT].Scale, 255U, 255U));    break;
Так же не забываем править количество и названия эффектов.
Для правильной работы избранного в основном файле прошивки, в строке
C-like:
uint8_t FavoritesManager::FavoriteModes[MODE_AMOUNT] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
количество нулей должно соответствовать количеству эффектов.
ПРИЛОЖЕНИЕ (только в rar архиве, т.к. этот хост не принимает apk)
Если что не так, пишите.
П.С. Забыл добавить, что если мин_скорость или мин_масштаб больше чем макс_скорость или макс_масштаб, значит регулятор работает наоборот (реверс)
 
Изменено:
  • Лойс +1
Реакции: Belokota и kostyamat

Sergey40@

✩✩✩✩✩✩✩
15 Мар 2020
2
0
Добрый вечер. Подскажите, что может быть. Собрал лампу на NodeMCU точнее купил готовый конструктор с Али. Прошивка прошла с первого раза, пару раз работала лампа затем перестала работать, блок питания выдаёт 5,3 вольт, плюсом сенсорная кнопка через некоторое время померла. Куда копать не пойму.
 

Сотнег

★★★★★★★
15 Янв 2020
4,315
1,480
Эффект Прыгающие мячики
недоделанный, но вдруг надо кому
Я так немного посмотрел на результат и решил бросить им заниматься...

Бегунок Скорость к эффекту не прикручен. Так что выставляйте почти максимальную, чтобы не тормозило (15-30 единиц от максимально возможной).
Бегунок Масштаб регулирует количество мячиков. Максимальное количество задаётся в коде - увидите.

Устанавливается вместо любого эффекта, который хотите.
Просто добавьте код из файла или из спойлера в effects.ino и подключите в effectTicker.ino
типа так:
// case EFF_SPARKLES: sparklesRoutine(); break; // отключили эффект Конфетти
case EFF_SPARKLES: BBallsRoutine(); break;

C-like:
// --------------------------- эффект мячики ----------------------
//  BouncingBalls2014 is a program that lets you animate an LED strip
//  to look like a group of bouncing balls
//  Daniel Wilson, 2014
//  https://github.com/githubcdr/Arduino/blob/master/bouncingballs/bouncingballs.ino
//  With BIG thanks to the FastLED community!
//  адаптация от SottNick
#define bballsGRAVITY           (-9.81)              // Downward (negative) acceleration of gravity in m/s^2
#define bballsH0                (1)                  // Starting height, in meters, of the ball (strip length)
#define bballsMaxNUM            (WIDTH * 2)          // максимальное количество мячиков прикручено при адаптации для бегунка Масштаб
uint8_t bballsNUM;                                   // Number of bouncing balls you want (recommend < 7, but 20 is fun in its own way) ... количество мячиков теперь задаётся бегунком, а не константой

uint8_t bballsCOLOR[bballsMaxNUM] ;                   // прикручено при адаптации для разноцветных мячиков
uint8_t bballsX[bballsMaxNUM] ;                       // прикручено при адаптации для распределения мячиков по радиусу лампы
bool bballsShift[bballsMaxNUM] ;                      // прикручено при адаптации для того, чтобы мячики не стояли на месте
float bballsVImpact0 = sqrt( -2 * bballsGRAVITY * bballsH0 );  // Impact velocity of the ball when it hits the ground if "dropped" from the top of the strip
float bballsVImpact[bballsMaxNUM] ;                   // As time goes on the impact velocity will change, so make an array to store those values
int   bballsPos[bballsMaxNUM] ;                       // The integer position of the dot on the strip (LED index)
long  bballsTLast[bballsMaxNUM] ;                     // The clock time of the last ground strike
float bballsCOR[bballsMaxNUM] ;                       // Coefficient of Restitution (bounce damping)

void bballsSetup() {
  bballsNUM = (modes[currentMode].Scale-1U)/99.0 * (bballsMaxNUM-1U) + 1U;
  for (int i = 0 ; i < bballsNUM ; i++) {             // Initialize variables
    bballsCOLOR[i] = random(0U, 256U);
    bballsX[i] = random(0U, WIDTH);
    bballsTLast[i] = millis();
    bballsPos[i] = 0U;                                 // Balls start on the ground
    bballsVImpact[i] = bballsVImpact0;                // And "pop" up at vImpact0
    bballsCOR[i] = 0.90 - float(i)/pow(bballsNUM,2);  // это, видимо, прыгучесть. для каждого мячика уникальная изначально
    bballsShift[i] = false;
  }
}

void bballsLoop() {
  float bballsHi;
  float bballsTCycle;
  for (int i = 0 ; i < bballsNUM ; i++) {
    leds[getPixelNumber(bballsX[i], bballsPos[i])] = CRGB::Black; // off for the next loop around

    bballsTCycle =  millis() - bballsTLast[i] ; // Calculate the time since the last time the ball was on the ground

    // A little kinematics equation calculates positon as a function of time, acceleration (gravity) and intial velocity
    bballsHi = 0.5 * bballsGRAVITY * pow( bballsTCycle/1000.0 , 2.0 ) + bballsVImpact[i] * bballsTCycle/1000.0;

    if ( bballsHi < 0 ) {                     
      bballsTLast[i] = millis();
      bballsHi = 0; // If the ball crossed the threshold of the "ground," put it back on the ground
      bballsVImpact[i] = bballsCOR[i] * bballsVImpact[i] ; // and recalculate its new upward velocity as it's old velocity * COR

      if ( bballsVImpact[i] < 0.01 ) // If the ball is barely moving, "pop" it back up at vImpact0
        {
          bballsCOR[i] = 0.90 - float(random(0U,9U))/pow(random(4U,9U),2); // сделал, чтобы мячики меняли свою прыгучесть каждый цикл
          bballsShift[i] = bballsCOR[i] >= 0.89;                           // если мячик максимальной прыгучести, то разрешаем ему сдвинуться
          bballsVImpact[i] = bballsVImpact0;
        }
    }
    bballsPos[i] = round( bballsHi * (HEIGHT - 1) / bballsH0);             // Map "h" to a "pos" integer index position on the LED strip
    if (bballsShift[i] && (bballsPos[i] == HEIGHT - 1)) {                  // если мячик получил право, то пускай сдвинется на максимальной высоте 1 раз
      bballsShift[i] = false;
      if (bballsCOLOR[i] % 2 == 0) {                                       // чётные налево, нечётные направо
        if (bballsX[i] == 0U) bballsX[i] = WIDTH - 1U;
          else --bballsX[i];
      } else {
        if (bballsX[i] == WIDTH - 1U) bballsX[i] = 0U;
          else ++bballsX[i];
      }
    }
    leds[getPixelNumber(bballsX[i], bballsPos[i])] = CHSV(bballsCOLOR[i], 255, 255);
  }
}

void BBallsRoutine()
{
  if (loadingFlag)
  {
    loadingFlag = false;
    FastLED.clear();
    bballsSetup();
  }
  bballsLoop();
}
 

Вложения

Изменено:

ssp1971

★★✩✩✩✩✩
14 Мар 2020
108
71
в приложении скорость на минимум. масштаб на максимум. работает. прикрутил. очень красиво. прошил. супер!!!!