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

ЗДЕСЬ ОБСУЖДАЕМ ТОЛЬКО ДАННУЮ ПРОШИВКУ
ВСЕ ЧТО НЕ ПО СИЯ ТЕМЕ И ПРОШИВКЕ, ВСЕ СНОСИТСЯ НА@@@!

Очень просим не делать репост "ЦИТИРОВАНИЕ" сообщений! Делать только в КРАЙНЕЙ необходимости, удаляя лишний текст (у нас не ЧАТ)!
Иначе опять будет 160 страниц и 0 пользы ....

Для ответа КОНКРЕТНОМУ пользователю, достаточно нажать " ОТВЕТ"

При описании проблемы обязательно, как можно подробнее, описывайте ход своих действий до ее возникновения. Телепатов (как я думаю) среди участников нет. Потом 20 постов будет только для того, чтобы Вас понять.
Если Вы считаете ваше сообщение важным и его нужно поднять в шапку, пишите мне в личку с пометкой "Сообщение в шапку"


ПО ВОПРОСАМ РАБОТЫ ПРИЛОЖЕНИЯ ОТ KOTEYKA ИДЕМ В ЭТУ ТЕМУ

Голосовое управление лампой Гайвера, через Яндекс Алису (прошивка Gunner47).

Яндекс диск Файл ПДФ. Актуально на 27.01.2020г
наш сервер НЕ ОБНОВЛЯЕТСЯ, от 27.01.2020г
Прошивка gunner47 v.2 "86 эффектов в 1" или уже больше - разработку ведет @Сотнег
Прошивка gunner47 v.2.X_web : веб-интерфейс (без необходимости перепрошивки) - разработку ведет @alvikskor
Прошивка от Shaitan с поддержкой mp3 и пульта (тут не обсуждается. Обсуждается в теме прошивки)
Прошивка FireLamp with Remote Control - разработку ведет @SlingMaster

Для тех у кого умный дом Home Assistant есть отличный компонент

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

Комментарии

mechanic

★★★★✩✩✩
Команда форума
31 Июл 2018
403
205
ЗДЕСЬ ОБСУЖДАЕМ ТОЛЬКО ДАННУЮ ПРОШИВКУ
ВСЕ ЧТО НЕ ПО СИЯ ТЕМЕ И ПРОШИВКЕ, ВСЕ СНОСИТСЯ НА@@@!

Очень просим не делать репост "ЦИТИРОВАНИЕ" сообщений! Делать только в КРАЙНЕЙ необходимости, удаляя лишний текст (у нас не ЧАТ)!
Иначе опять будет 160 страниц и 0 пользы ....

Для ответа КОНКРЕТНОМУ пользователю, достаточно нажать " ОТВЕТ"

При описании проблемы обязательно, как можно подробнее, описывайте ход своих действий до ее возникновения. Телепатов (как я думаю) среди участников нет. Потом 20 постов будет только для того, чтобы Вас понять.
Если Вы считаете ваше сообщение важным и его нужно поднять в шапку, пишите мне в личку с пометкой "Сообщение в шапку"


ПО ВОПРОСАМ РАБОТЫ ПРИЛОЖЕНИЯ ОТ KOTEYKA ИДЕМ В ЭТУ ТЕМУ

Голосовое управление лампой Гайвера, через Яндекс Алису (прошивка Gunner47).

Яндекс диск Файл ПДФ. Актуально на 27.01.2020г
наш сервер НЕ ОБНОВЛЯЕТСЯ, от 27.01.2020г
Прошивка gunner47 v.2 "86 эффектов в 1" или уже больше - разработку ведет @Сотнег
Прошивка gunner47 v.2.X_web : веб-интерфейс (без необходимости перепрошивки) - разработку ведет @alvikskor
Прошивка от Shaitan с поддержкой mp3 и пульта (тут не обсуждается. Обсуждается в теме прошивки)
Прошивка FireLamp with Remote Control - разработку ведет @SlingMaster

Для тех у кого умный дом Home Assistant есть отличный компонент

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

VadZher

★✩✩✩✩✩✩
4 Ноя 2021
114
27
Омск
@Mishanya TS,
Попробуйте вместо своего в файле "new_effect" использовать этот код:
// ************************** СТРЕЛКИ *************************
int8_t arrow_x[4], arrow_y[4], stop_x[4], stop_y[4];
uint8_t arrow_direction; // 0x01 - слева направо; 0x02 - снизу вверх; 0х04 - справа налево; 0х08 - сверху вниз
uint8_t arrow_mode, arrow_mode_orig;// 0 - по очереди все варианты
// 1 - по очереди от края до края экрана;
// 2 - одновременно по горизонтали навстречу к ентру, затем одновременно по вертикали навстречу к центру
// 3 - одновременно все к центру
// 4 - по два (горизонталь / вертикаль) все от своего края к противоположному, стрелки смещены от центра на 1/3
// 5 - одновременно все от своего края к противоположному, стрелки смещены от центра на 1/3
bool arrow_complete, arrow_change_mode;
uint8_t arrow_hue[4];
uint8_t arrow_play_mode_count[6]; // Сколько раз проигрывать полностью каждый режим если вариант 0 - текущий счетчик
uint8_t arrow_play_mode_count_orig[6]; // Сколько раз проигрывать полностью каждый режим если вариант 0 - исходные настройки

void arrowsRoutine() {
if (loadingFlag) {
loadingFlag = false;
//modeCode = MC_ARROWS;
FastLED.clear();
arrow_complete = false;
// arrow_mode_orig = (specialTextEffectParam >= 0) ? specialTextEffectParam : getEffectScaleParamValue2(MC_ARROWS);

arrow_mode = (arrow_mode_orig == 0 || arrow_mode_orig > 5) ? random8(1,5) : arrow_mode_orig;
arrow_play_mode_count_orig[0] = 0;
arrow_play_mode_count_orig[1] = 4; // 4 фазы - все стрелки показаны по кругу один раз - переходить к следующему ->
arrow_play_mode_count_orig[2] = 4; // 2 фазы - гориз к центру (1), затем верт к центру (2) - обе фазы повторить по 2 раза -> 4
arrow_play_mode_count_orig[3] = 4; // 1 фаза - все к центру (1) повторить по 4 раза -> 4
arrow_play_mode_count_orig[4] = 4; // 2 фазы - гориз к центру (1), затем верт к центру (2) - обе фазы повторить по 2 раза -> 4
arrow_play_mode_count_orig[5] = 4; // 1 фаза - все сразу (1) повторить по 4 раза -> 4
for (uint8_t i=0; i<6; i++) {
arrow_play_mode_count = arrow_play_mode_count_orig;
}
arrowSetupForMode(arrow_mode, true);
}

//uint8_t effectBrightness;
//effectBrightness = modes[currentMode].Brightness;

// fader(65);
dimAll(160);
CHSV color;

// движение стрелки - cлева направо
if ((arrow_direction & 0x01) > 0) {
color = CHSV(arrow_hue[0], 255, modes[currentMode].Brightness);
for (int8_t x = 0; x <= 4; x++) {
for (int8_t y = 0; y <= x; y++) {
if (arrow_x[0] - x >= 0 && arrow_x[0] - x <= stop_x[0]) {
CHSV clr = (x < 4 || (x == 4 && y < 2)) ? color : CHSV(0,0,0);
drawPixelXY(arrow_x[0] - x, arrow_y[0] - y, clr);
drawPixelXY(arrow_x[0] - x, arrow_y[0] + y, clr);
}
}
}
arrow_x[0]++;
}

// движение стрелки - cнизу вверх
if ((arrow_direction & 0x02) > 0) {
color = CHSV(arrow_hue[1], 255, modes[currentMode].Brightness);
for (int8_t y = 0; y <= 4; y++) {
for (int8_t x = 0; x <= y; x++) {
if (arrow_y[1] - y >= 0 && arrow_y[1] - y <= stop_y[1]) {
CHSV clr = (y < 4 || (y == 4 && x < 2)) ? color : CHSV(0,0,0);
drawPixelXY(arrow_x[1] - x, arrow_y[1] - y, clr);
drawPixelXY(arrow_x[1] + x, arrow_y[1] - y, clr);
}
}
}
arrow_y[1]++;
}

// движение стрелки - cправа налево
if ((arrow_direction & 0x04) > 0) {
color = CHSV(arrow_hue[2], 255, modes[currentMode].Brightness);
for (int8_t x = 0; x <= 4; x++) {
for (int8_t y = 0; y <= x; y++) {
if (arrow_x[2] + x >= stop_x[2] && arrow_x[2] + x < WIDTH) {
CHSV clr = (x < 4 || (x == 4 && y < 2)) ? color : CHSV(0,0,0);
drawPixelXY(arrow_x[2] + x, arrow_y[2] - y, clr);
drawPixelXY(arrow_x[2] + x, arrow_y[2] + y, clr);
}
}
}
arrow_x[2]--;
}

// движение стрелки - cверху вниз
if ((arrow_direction & 0x08) > 0) {
color = CHSV(arrow_hue[3], 255, modes[currentMode].Brightness);
for (int8_t y = 0; y <= 4; y++) {
for (int8_t x = 0; x <= y; x++) {
if (arrow_y[3] + y >= stop_y[3] && arrow_y[3] + y < HEIGHT) {
CHSV clr = (y < 4 || (y == 4 && x < 2)) ? color : CHSV(0,0,0);
drawPixelXY(arrow_x[3] - x, arrow_y[3] + y, clr);
drawPixelXY(arrow_x[3] + x, arrow_y[3] + y, clr);
}
}
}
arrow_y[3]--;
}

// Проверка завершения движения стрелки, переход к следующей фазе или режиму

switch (arrow_mode) {

case 1:
// Последовательно - слева-направо -> снизу вверх -> справа налево -> сверху вниз и далее по циклу
// В каждый сомент времени сктивна только одна стрелка, если она дошла до края - переключиться на следующую и задать ее начальные координаты
arrow_complete = false;
switch (arrow_direction) {
case 1: arrow_complete = arrow_x[0] > stop_x[0]; break;
case 2: arrow_complete = arrow_y[1] > stop_y[1]; break;
case 4: arrow_complete = arrow_x[2] < stop_x[2]; break;
case 8: arrow_complete = arrow_y[3] < stop_y[3]; break;
}

arrow_change_mode = false;
if (arrow_complete) {
arrow_direction = (arrow_direction << 1) & 0x0F;
if (arrow_direction == 0) arrow_direction = 1;
if (arrow_mode_orig == 0) {
arrow_play_mode_count[1]--;
if (arrow_play_mode_count[1] == 0) {
arrow_play_mode_count[1] = arrow_play_mode_count_orig[1];
arrow_mode = random8(1,5);
arrow_change_mode = true;
}
}

arrowSetupForMode(arrow_mode, arrow_change_mode);
}
break;

case 2:
// Одновременно горизонтальные навстречу до половины экрана
// Затем одновременно вертикальные до половины экрана. Далее - повторять
arrow_complete = false;
switch (arrow_direction) {
case 5: arrow_complete = arrow_x[0] > stop_x[0]; break; // Стрелка слева и справа встречаются в центре одновременно - проверять только стрелку слева
case 10: arrow_complete = arrow_y[1] > stop_y[1]; break; // Стрелка снизу и сверху встречаются в центре одновременно - проверять только стрелку снизу
}

arrow_change_mode = false;
if (arrow_complete) {
arrow_direction = arrow_direction == 5 ? 10 : 5;
if (arrow_mode_orig == 0) {
arrow_play_mode_count[2]--;
if (arrow_play_mode_count[2] == 0) {
arrow_play_mode_count[2] = arrow_play_mode_count_orig[2];
arrow_mode = random8(1,5);
arrow_change_mode = true;
}
}

arrowSetupForMode(arrow_mode, arrow_change_mode);
}
break;

case 3:
// Одновременно со всех сторон к центру
// Завершение кадра режима - когда все стрелки собрались в центре.
// Проверять стрелки по самой длинной стороне
if (WIDTH >= HEIGHT)
arrow_complete = arrow_x[0] > stop_x[0];
else
arrow_complete = arrow_y[1] > stop_y[1];

arrow_change_mode = false;
if (arrow_complete) {
if (arrow_mode_orig == 0) {
arrow_play_mode_count[3]--;
if (arrow_play_mode_count[3] == 0) {
arrow_play_mode_count[3] = arrow_play_mode_count_orig[3];
arrow_mode = random8(1,5);
arrow_change_mode = true;
}
}

arrowSetupForMode(arrow_mode, arrow_change_mode);
}
break;

case 4:
// Одновременно слева/справа от края до края со смещением горизонтальной оси на 1/3 высоты, далее
// одновременно снизу/сверху от края до края со смещением вертикальной оси на 1/3 ширины
// Завершение кадра режима - когда все стрелки собрались в центре.
// Проверять стрелки по самой длинной стороне
switch (arrow_direction) {
case 5: arrow_complete = arrow_x[0] > stop_x[0]; break; // Стрелка слева и справа движутся и достигают края одновременно - проверять только стрелку слева
case 10: arrow_complete = arrow_y[1] > stop_y[1]; break; // Стрелка снизу и сверху движутся и достигают края одновременно - проверять только стрелку снизу
}

arrow_change_mode = false;
if (arrow_complete) {
arrow_direction = arrow_direction == 5 ? 10 : 5;
if (arrow_mode_orig == 0) {
arrow_play_mode_count[4]--;
if (arrow_play_mode_count[4] == 0) {
arrow_play_mode_count[4] = arrow_play_mode_count_orig[4];
arrow_mode = random8(1,5);
arrow_change_mode = true;
}
}

arrowSetupForMode(arrow_mode, arrow_change_mode);
}
break;

case 5:
// Одновременно со всех сторон от края до края со смещением горизонтальной оси на 1/3 высоты, далее
// Проверять стрелки по самой длинной стороне
if (WIDTH >= HEIGHT)
arrow_complete = arrow_x[0] > stop_x[0];
else
arrow_complete = arrow_y[1] > stop_y[1];

arrow_change_mode = false;
if (arrow_complete) {
if (arrow_mode_orig == 0) {
arrow_play_mode_count[5]--;
if (arrow_play_mode_count[5] == 0) {
arrow_play_mode_count[5] = arrow_play_mode_count_orig[5];
arrow_mode = random8(1,5);
arrow_change_mode = true;
}
}

arrowSetupForMode(arrow_mode, arrow_change_mode);
}
break;
}

}

void arrowSetupForMode(uint8_t mode, bool change) {
switch (mode) {
case 1:
if (change) arrow_direction = 1;
arrowSetup_mode1(); // От края матрицы к краю, по центру гориз и верт
break;
case 2:
if (change) arrow_direction = 5;
arrowSetup_mode2(); // По центру матрицы (гориз / верт) - ограничение - центр матрицы
break;
case 3:
if (change) arrow_direction = 15;
arrowSetup_mode2(); // как и в режиме 2 - по центру матрицы (гориз / верт) - ограничение - центр матрицы
break;
case 4:
if (change) arrow_direction = 5;
arrowSetup_mode4(); // От края матрицы к краю, верт / гориз
break;
case 5:
if (change) arrow_direction = 15;
arrowSetup_mode4(); // как и в режиме 4 от края матрицы к краю, на 1/3
break;
}
}
void arrowSetup_mode1() {
// Слева направо
if ((arrow_direction & 0x01) > 0) {
arrow_hue[0] = random8();
arrow_x[0] = 0;
arrow_y[0] = HEIGHT / 2;
stop_x [0] = WIDTH + 7; // скрывается за экраном на 7 пикселей
stop_y [0] = 0; // неприменимо
}
// снизу вверх
if ((arrow_direction & 0x02) > 0) {
arrow_hue[1] = random8();
arrow_y[1] = 0;
arrow_x[1] = WIDTH / 2;
stop_y [1] = HEIGHT + 7; // скрывается за экраном на 7 пикселей
stop_x [1] = 0; // неприменимо
}
// справа налево
if ((arrow_direction & 0x04) > 0) {
arrow_hue[2] = random8();
arrow_x[2] = WIDTH - 1;
arrow_y[2] = HEIGHT / 2;
stop_x [2] = -7; // скрывается за экраном на 7 пикселей
stop_y [2] = 0; // неприменимо
}
// сверху вниз
if ((arrow_direction & 0x08) > 0) {
arrow_hue[3] = random8();
arrow_y[3] = HEIGHT - 1;
arrow_x[3] = WIDTH / 2;
stop_y [3] = -7; // скрывается за экраном на 7 пикселей
stop_x [3] = 0; // неприменимо
}
}

void arrowSetup_mode2() {
// Слева направо до половины экрана
if ((arrow_direction & 0x01) > 0) {
arrow_hue[0] = random8();
arrow_x[0] = 0;
arrow_y[0] = HEIGHT / 2;
stop_x [0] = WIDTH / 2 - 1; // до центра экрана
stop_y [0] = 0; // неприменимо
}
// снизу вверх до половины экрана
if ((arrow_direction & 0x02) > 0) {
arrow_hue[1] = random8();
arrow_y[1] = 0;
arrow_x[1] = WIDTH / 2;
stop_y [1] = HEIGHT / 2 - 1; // до центра экрана
stop_x [1] = 0; // неприменимо
}
// справа налево до половины экрана
if ((arrow_direction & 0x04) > 0) {
arrow_hue[2] = random8();
arrow_x[2] = WIDTH - 1;
arrow_y[2] = HEIGHT / 2;
stop_x [2] = WIDTH / 2; // до центра экрана
stop_y [2] = 0; // неприменимо
}
// сверху вниз до половины экрана
if ((arrow_direction & 0x08) > 0) {
arrow_hue[3] = random8();
arrow_y[3] = HEIGHT - 1;
arrow_x[3] = WIDTH / 2;
stop_y [3] = HEIGHT / 2; // до центра экрана
stop_x [3] = 0; // неприменимо
}
}

void arrowSetup_mode4() {
// Слева направо
if ((arrow_direction & 0x01) > 0) {
arrow_hue[0] = random8();
arrow_x[0] = 0;
arrow_y[0] = (HEIGHT / 3) * 2;
stop_x [0] = WIDTH + 7; // скрывается за экраном на 7 пикселей
stop_y [0] = 0; // неприменимо
}
// снизу вверх
if ((arrow_direction & 0x02) > 0) {
arrow_hue[1] = random8();
arrow_y[1] = 0;
arrow_x[1] = (WIDTH / 3) * 2;
stop_y [1] = HEIGHT + 7; // скрывается за экраном на 7 пикселей
stop_x [1] = 0; // неприменимо
}
// справа налево
if ((arrow_direction & 0x04) > 0) {
arrow_hue[2] = random8();
arrow_x[2] = WIDTH - 1;
arrow_y[2] = HEIGHT / 3;
stop_x [2] = -7; // скрывается за экраном на 7 пикселей
stop_y [2] = 0; // неприменимо
}
// сверху вниз
if ((arrow_direction & 0x08) > 0) {
arrow_hue[3] = random8();
arrow_y[3] = HEIGHT - 1;
arrow_x[3] = WIDTH / 3;
stop_y [3] = -7; // скрывается за экраном на 7 пикселей
stop_x [3] = 0; // неприменимо
}
}


 

Сотнег

★★★★★★★
15 Янв 2020
4,281
1,475
@Leon111_09, где-то недавно писали, что заработало,
но пришлось подшаманить в настройках каких-то.
 

SlingMaster

★★★✩✩✩✩
22 Апр 2021
220
144
Kharkiv, Ukraine
WiFi Lamp Remote Control version • II
Версия 2.3 | 99 эффектов
Git | Version 2.3

1. Исправлена ошибка в эффекте «Плазменная лампа».
2. Добавлена анимация показывающая состояние лампы ESP Mode
а) зеленая – подключение к роутеру
б) синяя – лампа в режиме точки доступа
в) красный глаз терминатора – не получено время, синий – отключено обращение к ntp
3. Добавлено три новых эффекта
«Цветок Лотоса» (цвет выбирается масштабом | < 10% автосмена цвета)
«Новогодняя Елка» (три в одном выбирается масштабом)
«Побочный Эффект» (два в одном выбирается масштабом)

Video
Индикация ESP Mode для WiFi лампы by Alex Gyver
холодный старт | точка доступа | подклячение к роутеру

Эффект «Цветок Лотоса» для WiFi лампы by Alex Gyver

Эффект «Побочный Эффект» для WiFi лампы by Alex Gyver

Эффект «Новогодняя Елка» для WiFi лампы by Alex Gyver
 

Divin

★★★✩✩✩✩
30 Янв 2021
431
191

@Leon111_09,
Может понадобится конвертор уровней, у меня без него не заработало. На есп 01 памяти 1 мб , не знаю, хватит ли на прошивку и файловую систему.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
148
55
Таганрог
forum.wisecomp.ru
@Divin, не хватает,но я урезаю функционал. Поотключал все,что мне не нужно или без чего можно обойтись. Блинк работает после заливки, а вот в качестве теста заливаю гирлянду и она не работает :(. Т.е. не моргают светодиоды.Вот я и подозреваю что неправильно указываю пин ленты в скетче. С ESP-01 я имею дело первый раз. c ESP8266 и ESP32 я подружился :)
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
148
55
Таганрог
forum.wisecomp.ru
@Сотнег, Спасибо за информацию.Разобрался. Оказывается, я все правильно делал: просто в скетче при выборе пина надо поставить двойку. А не запускался модуль после прошивки потому что у меня вывод rezet был не подтянут к минусу. Там оказывается и rezet и en должны быть притянуты при запуске к земле десятикилоомными резисторами. У меня к вам еще один вопрос,так сказать, "немного посложнее" :). Как известно, у ESP-01 маловато памяти. Если я ставлю в настройках выделение памяти под ОТА 512Кб то выдает ошибку по нехватке памяти: там буквально несколько байт не хватает,чтоб заполнить МК под ноль. Если ставвлю режим "без ОТА"-памяти хватает, но при попытке залить папку data выдает ошибку что нет файлов. А если поставить режим выделения под ОТА 256Кб, то та же картина с папкой data. Не посоветуете как обойти эту проблему?
P.S. Загрузил сейчас скетч с гирляндой от notamesh на 122 эффекта-прекрасно работает :).
 

Mishanya TS

★★★★✩✩✩
11 Дек 2019
358
286
@Mishanya TS,
Попробуйте вместо своего в файле "new_effect" использовать этот код:
// ************************** СТРЕЛКИ *************************
int8_t arrow_x[4], arrow_y[4], stop_x[4], stop_y[4];
uint8_t arrow_direction; // 0x01 - слева направо; 0x02 - снизу вверх; 0х04 - справа налево; 0х08 - сверху вниз
uint8_t arrow_mode, arrow_mode_orig;// 0 - по очереди все варианты
// 1 - по очереди от края до края экрана;
// 2 - одновременно по горизонтали навстречу к ентру, затем одновременно по вертикали навстречу к центру
// 3 - одновременно все к центру
// 4 - по два (горизонталь / вертикаль) все от своего края к противоположному, стрелки смещены от центра на 1/3
// 5 - одновременно все от своего края к противоположному, стрелки смещены от центра на 1/3
bool arrow_complete, arrow_change_mode;
uint8_t arrow_hue[4];
uint8_t arrow_play_mode_count[6]; // Сколько раз проигрывать полностью каждый режим если вариант 0 - текущий счетчик
uint8_t arrow_play_mode_count_orig[6]; // Сколько раз проигрывать полностью каждый режим если вариант 0 - исходные настройки

void arrowsRoutine() {
if (loadingFlag) {
loadingFlag = false;
//modeCode = MC_ARROWS;
FastLED.clear();
arrow_complete = false;
// arrow_mode_orig = (specialTextEffectParam >= 0) ? specialTextEffectParam : getEffectScaleParamValue2(MC_ARROWS);

arrow_mode = (arrow_mode_orig == 0 || arrow_mode_orig > 5) ? random8(1,5) : arrow_mode_orig;
arrow_play_mode_count_orig[0] = 0;
arrow_play_mode_count_orig[1] = 4; // 4 фазы - все стрелки показаны по кругу один раз - переходить к следующему ->
arrow_play_mode_count_orig[2] = 4; // 2 фазы - гориз к центру (1), затем верт к центру (2) - обе фазы повторить по 2 раза -> 4
arrow_play_mode_count_orig[3] = 4; // 1 фаза - все к центру (1) повторить по 4 раза -> 4
arrow_play_mode_count_orig[4] = 4; // 2 фазы - гориз к центру (1), затем верт к центру (2) - обе фазы повторить по 2 раза -> 4
arrow_play_mode_count_orig[5] = 4; // 1 фаза - все сразу (1) повторить по 4 раза -> 4
for (uint8_t i=0; i<6; i++) {
arrow_play_mode_count = arrow_play_mode_count_orig;
}
arrowSetupForMode(arrow_mode, true);
}

//uint8_t effectBrightness;
//effectBrightness = modes[currentMode].Brightness;

// fader(65);
dimAll(160);
CHSV color;

// движение стрелки - cлева направо
if ((arrow_direction & 0x01) > 0) {
color = CHSV(arrow_hue[0], 255, modes[currentMode].Brightness);
for (int8_t x = 0; x <= 4; x++) {
for (int8_t y = 0; y <= x; y++) {
if (arrow_x[0] - x >= 0 && arrow_x[0] - x <= stop_x[0]) {
CHSV clr = (x < 4 || (x == 4 && y < 2)) ? color : CHSV(0,0,0);
drawPixelXY(arrow_x[0] - x, arrow_y[0] - y, clr);
drawPixelXY(arrow_x[0] - x, arrow_y[0] + y, clr);
}
}
}
arrow_x[0]++;
}

// движение стрелки - cнизу вверх
if ((arrow_direction & 0x02) > 0) {
color = CHSV(arrow_hue[1], 255, modes[currentMode].Brightness);
for (int8_t y = 0; y <= 4; y++) {
for (int8_t x = 0; x <= y; x++) {
if (arrow_y[1] - y >= 0 && arrow_y[1] - y <= stop_y[1]) {
CHSV clr = (y < 4 || (y == 4 && x < 2)) ? color : CHSV(0,0,0);
drawPixelXY(arrow_x[1] - x, arrow_y[1] - y, clr);
drawPixelXY(arrow_x[1] + x, arrow_y[1] - y, clr);
}
}
}
arrow_y[1]++;
}

// движение стрелки - cправа налево
if ((arrow_direction & 0x04) > 0) {
color = CHSV(arrow_hue[2], 255, modes[currentMode].Brightness);
for (int8_t x = 0; x <= 4; x++) {
for (int8_t y = 0; y <= x; y++) {
if (arrow_x[2] + x >= stop_x[2] && arrow_x[2] + x < WIDTH) {
CHSV clr = (x < 4 || (x == 4 && y < 2)) ? color : CHSV(0,0,0);
drawPixelXY(arrow_x[2] + x, arrow_y[2] - y, clr);
drawPixelXY(arrow_x[2] + x, arrow_y[2] + y, clr);
}
}
}
arrow_x[2]--;
}

// движение стрелки - cверху вниз
if ((arrow_direction & 0x08) > 0) {
color = CHSV(arrow_hue[3], 255, modes[currentMode].Brightness);
for (int8_t y = 0; y <= 4; y++) {
for (int8_t x = 0; x <= y; x++) {
if (arrow_y[3] + y >= stop_y[3] && arrow_y[3] + y < HEIGHT) {
CHSV clr = (y < 4 || (y == 4 && x < 2)) ? color : CHSV(0,0,0);
drawPixelXY(arrow_x[3] - x, arrow_y[3] + y, clr);
drawPixelXY(arrow_x[3] + x, arrow_y[3] + y, clr);
}
}
}
arrow_y[3]--;
}

// Проверка завершения движения стрелки, переход к следующей фазе или режиму

switch (arrow_mode) {

case 1:
// Последовательно - слева-направо -> снизу вверх -> справа налево -> сверху вниз и далее по циклу
// В каждый сомент времени сктивна только одна стрелка, если она дошла до края - переключиться на следующую и задать ее начальные координаты
arrow_complete = false;
switch (arrow_direction) {
case 1: arrow_complete = arrow_x[0] > stop_x[0]; break;
case 2: arrow_complete = arrow_y[1] > stop_y[1]; break;
case 4: arrow_complete = arrow_x[2] < stop_x[2]; break;
case 8: arrow_complete = arrow_y[3] < stop_y[3]; break;
}

arrow_change_mode = false;
if (arrow_complete) {
arrow_direction = (arrow_direction << 1) & 0x0F;
if (arrow_direction == 0) arrow_direction = 1;
if (arrow_mode_orig == 0) {
arrow_play_mode_count[1]--;
if (arrow_play_mode_count[1] == 0) {
arrow_play_mode_count[1] = arrow_play_mode_count_orig[1];
arrow_mode = random8(1,5);
arrow_change_mode = true;
}
}

arrowSetupForMode(arrow_mode, arrow_change_mode);
}
break;

case 2:
// Одновременно горизонтальные навстречу до половины экрана
// Затем одновременно вертикальные до половины экрана. Далее - повторять
arrow_complete = false;
switch (arrow_direction) {
case 5: arrow_complete = arrow_x[0] > stop_x[0]; break; // Стрелка слева и справа встречаются в центре одновременно - проверять только стрелку слева
case 10: arrow_complete = arrow_y[1] > stop_y[1]; break; // Стрелка снизу и сверху встречаются в центре одновременно - проверять только стрелку снизу
}

arrow_change_mode = false;
if (arrow_complete) {
arrow_direction = arrow_direction == 5 ? 10 : 5;
if (arrow_mode_orig == 0) {
arrow_play_mode_count[2]--;
if (arrow_play_mode_count[2] == 0) {
arrow_play_mode_count[2] = arrow_play_mode_count_orig[2];
arrow_mode = random8(1,5);
arrow_change_mode = true;
}
}

arrowSetupForMode(arrow_mode, arrow_change_mode);
}
break;

case 3:
// Одновременно со всех сторон к центру
// Завершение кадра режима - когда все стрелки собрались в центре.
// Проверять стрелки по самой длинной стороне
if (WIDTH >= HEIGHT)
arrow_complete = arrow_x[0] > stop_x[0];
else
arrow_complete = arrow_y[1] > stop_y[1];

arrow_change_mode = false;
if (arrow_complete) {
if (arrow_mode_orig == 0) {
arrow_play_mode_count[3]--;
if (arrow_play_mode_count[3] == 0) {
arrow_play_mode_count[3] = arrow_play_mode_count_orig[3];
arrow_mode = random8(1,5);
arrow_change_mode = true;
}
}

arrowSetupForMode(arrow_mode, arrow_change_mode);
}
break;

case 4:
// Одновременно слева/справа от края до края со смещением горизонтальной оси на 1/3 высоты, далее
// одновременно снизу/сверху от края до края со смещением вертикальной оси на 1/3 ширины
// Завершение кадра режима - когда все стрелки собрались в центре.
// Проверять стрелки по самой длинной стороне
switch (arrow_direction) {
case 5: arrow_complete = arrow_x[0] > stop_x[0]; break; // Стрелка слева и справа движутся и достигают края одновременно - проверять только стрелку слева
case 10: arrow_complete = arrow_y[1] > stop_y[1]; break; // Стрелка снизу и сверху движутся и достигают края одновременно - проверять только стрелку снизу
}

arrow_change_mode = false;
if (arrow_complete) {
arrow_direction = arrow_direction == 5 ? 10 : 5;
if (arrow_mode_orig == 0) {
arrow_play_mode_count[4]--;
if (arrow_play_mode_count[4] == 0) {
arrow_play_mode_count[4] = arrow_play_mode_count_orig[4];
arrow_mode = random8(1,5);
arrow_change_mode = true;
}
}

arrowSetupForMode(arrow_mode, arrow_change_mode);
}
break;

case 5:
// Одновременно со всех сторон от края до края со смещением горизонтальной оси на 1/3 высоты, далее
// Проверять стрелки по самой длинной стороне
if (WIDTH >= HEIGHT)
arrow_complete = arrow_x[0] > stop_x[0];
else
arrow_complete = arrow_y[1] > stop_y[1];

arrow_change_mode = false;
if (arrow_complete) {
if (arrow_mode_orig == 0) {
arrow_play_mode_count[5]--;
if (arrow_play_mode_count[5] == 0) {
arrow_play_mode_count[5] = arrow_play_mode_count_orig[5];
arrow_mode = random8(1,5);
arrow_change_mode = true;
}
}

arrowSetupForMode(arrow_mode, arrow_change_mode);
}
break;
}

}

void arrowSetupForMode(uint8_t mode, bool change) {
switch (mode) {
case 1:
if (change) arrow_direction = 1;
arrowSetup_mode1(); // От края матрицы к краю, по центру гориз и верт
break;
case 2:
if (change) arrow_direction = 5;
arrowSetup_mode2(); // По центру матрицы (гориз / верт) - ограничение - центр матрицы
break;
case 3:
if (change) arrow_direction = 15;
arrowSetup_mode2(); // как и в режиме 2 - по центру матрицы (гориз / верт) - ограничение - центр матрицы
break;
case 4:
if (change) arrow_direction = 5;
arrowSetup_mode4(); // От края матрицы к краю, верт / гориз
break;
case 5:
if (change) arrow_direction = 15;
arrowSetup_mode4(); // как и в режиме 4 от края матрицы к краю, на 1/3
break;
}
}
void arrowSetup_mode1() {
// Слева направо
if ((arrow_direction & 0x01) > 0) {
arrow_hue[0] = random8();
arrow_x[0] = 0;
arrow_y[0] = HEIGHT / 2;
stop_x [0] = WIDTH + 7; // скрывается за экраном на 7 пикселей
stop_y [0] = 0; // неприменимо
}
// снизу вверх
if ((arrow_direction & 0x02) > 0) {
arrow_hue[1] = random8();
arrow_y[1] = 0;
arrow_x[1] = WIDTH / 2;
stop_y [1] = HEIGHT + 7; // скрывается за экраном на 7 пикселей
stop_x [1] = 0; // неприменимо
}
// справа налево
if ((arrow_direction & 0x04) > 0) {
arrow_hue[2] = random8();
arrow_x[2] = WIDTH - 1;
arrow_y[2] = HEIGHT / 2;
stop_x [2] = -7; // скрывается за экраном на 7 пикселей
stop_y [2] = 0; // неприменимо
}
// сверху вниз
if ((arrow_direction & 0x08) > 0) {
arrow_hue[3] = random8();
arrow_y[3] = HEIGHT - 1;
arrow_x[3] = WIDTH / 2;
stop_y [3] = -7; // скрывается за экраном на 7 пикселей
stop_x [3] = 0; // неприменимо
}
}

void arrowSetup_mode2() {
// Слева направо до половины экрана
if ((arrow_direction & 0x01) > 0) {
arrow_hue[0] = random8();
arrow_x[0] = 0;
arrow_y[0] = HEIGHT / 2;
stop_x [0] = WIDTH / 2 - 1; // до центра экрана
stop_y [0] = 0; // неприменимо
}
// снизу вверх до половины экрана
if ((arrow_direction & 0x02) > 0) {
arrow_hue[1] = random8();
arrow_y[1] = 0;
arrow_x[1] = WIDTH / 2;
stop_y [1] = HEIGHT / 2 - 1; // до центра экрана
stop_x [1] = 0; // неприменимо
}
// справа налево до половины экрана
if ((arrow_direction & 0x04) > 0) {
arrow_hue[2] = random8();
arrow_x[2] = WIDTH - 1;
arrow_y[2] = HEIGHT / 2;
stop_x [2] = WIDTH / 2; // до центра экрана
stop_y [2] = 0; // неприменимо
}
// сверху вниз до половины экрана
if ((arrow_direction & 0x08) > 0) {
arrow_hue[3] = random8();
arrow_y[3] = HEIGHT - 1;
arrow_x[3] = WIDTH / 2;
stop_y [3] = HEIGHT / 2; // до центра экрана
stop_x [3] = 0; // неприменимо
}
}

void arrowSetup_mode4() {
// Слева направо
if ((arrow_direction & 0x01) > 0) {
arrow_hue[0] = random8();
arrow_x[0] = 0;
arrow_y[0] = (HEIGHT / 3) * 2;
stop_x [0] = WIDTH + 7; // скрывается за экраном на 7 пикселей
stop_y [0] = 0; // неприменимо
}
// снизу вверх
if ((arrow_direction & 0x02) > 0) {
arrow_hue[1] = random8();
arrow_y[1] = 0;
arrow_x[1] = (WIDTH / 3) * 2;
stop_y [1] = HEIGHT + 7; // скрывается за экраном на 7 пикселей
stop_x [1] = 0; // неприменимо
}
// справа налево
if ((arrow_direction & 0x04) > 0) {
arrow_hue[2] = random8();
arrow_x[2] = WIDTH - 1;
arrow_y[2] = HEIGHT / 3;
stop_x [2] = -7; // скрывается за экраном на 7 пикселей
stop_y [2] = 0; // неприменимо
}
// сверху вниз
if ((arrow_direction & 0x08) > 0) {
arrow_hue[3] = random8();
arrow_y[3] = HEIGHT - 1;
arrow_x[3] = WIDTH / 3;
stop_y [3] = -7; // скрывается за экраном на 7 пикселей
stop_x [3] = 0; // неприменимо
}
}
Спасибо, заработало, только я одну строчку изменил немного
arrow_play_mode_count = arrow_play_mode_count_orig;
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
4,281
1,475
@Leon111_09,
в шапке верхняя из четырёх версий не имеет веб-интерфейса.
А значит, файловой системы, парсера текстовых файлов и, возможно, более громоздкого веб-сервера.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
148
55
Таганрог
forum.wisecomp.ru
в шапке верхняя из четырёх версий не имеет веб-интерфейса.
Эту версию я знаю-я ее изначально в вемос шил. Позавчера только обновил. Уже новые прошивки протестировал. Потому и хотел в эту платку впихнуть :).