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

WiFi лампа-будильник. Обсуждение приложения от KOTEYKA
Обсуждение приложения для лампы от KOTEYKA

ЗДЕСЬ ОБСУЖДАЕТСЯ ТОЛЬКО РАБОТА ПРИЛОЖЕНИЯ FireLamp

Альтернатива приложению LedLamp от Gunner47
Делалось под прошивку от Gunner47, но работает и с некоторыми другими

Правила темы:
Прежде, чем задать вопрос, пройдитесь по теме, возможно ответ на него уже есть.
Поищите ответ на свой вопрос в шапке темы.
Если отвечаете кому-то, не цитируйте всё сообщение. Цитируйте только строку или часть строки, на которую будет Ваш ответ.
Если Вы считаете ваше сообщение важным и его нужно поднять в шапку, пишите мне в личку с пометкой "Сообщение в шапку"


ЕСЛИ У КОГО-ТО ЭЛЕМЕНТЫ ПРИЛОЖЕНИЯ НЕ ВМЕЩАЮТСЯ В ЭКРАН, ПРОСЬБА ОТПРАВЛЯТЬ СКРИН ЭТОГО ЭКРАНА
С УКАЗАНИЕМ РАЗРЕШЕНИЯ ВАШЕГО ТЕЛЕФОНА


ПО ВОПРОСАМ РАБОТЫ ПРОШИВОК ИДЕМ В ЭТУ ТЕМУ

ПОСЛЕДНЯЯ ВЕРСИЯ 3.2.3 от 01.06.2021 (последние изменения ниже, последние в списке)
Изменения не всегда пополняются!!!


1. Текст для бегущей строки сохраняется в памяти телефона.
2. Сетка для рисования оптимизирована под разные разрешения.
3. Реализована возможность сохранения различных конфигураций настроек (до пяти) в файлы
4. Добавлена кнопка "СБРОСИТЬ WIFI" в настройках соединения. Для тех, кто хочет перенести лампу в другую сеть, но не имеет физической кнопки или она отключена в константах.
5. Реализована функция авто обновления приложения. При запуске проверяется наличие новой версии. Если есть обновление, то предлагает обновить.
6. Исправлена выгрузка настроек эффектов в лампу и выводится информация об изменениях при авто проверке обновлений.
7. Проверка обновлений теперь только раз в сутки при первом запуске.
8. Добавлены виброотклики при переключении эффектов и при поиске лампы (если лампа найдена)
9. Меню приложения сделано боковым.
10. Эффект "Смена цвета" - сделана более медленная смена цветов
11. Исправлен вылет приложения если количество эффектов в лампе больше, чем в приложении
12. Настройки приложения и Настройки эффектов теперь в разных меню
13. Добавлен переключатель "Использовать вибро"
14. Таймер увеличен до 3-х часов
15. При выходе из режима рисования любым способом (кроме сворачивания) рисование отключается
16. Добавлена возможность изменения толщины, цвета и размера регуляторов (пока только круглых)
17. Меняются цвета прямых регуляторов
18. Добавлен интерфейс НЕОН (свечение элементов)
19. Выводит имя лампы при поиске
20. Добавлен украинский язык

Screenshot_2020-04-03-11-56-48-594_com.koteyka.superfirelamp.jpg Screenshot_2020-04-03-11-56-54-959_com.koteyka.superfirelamp.jpg Screenshot_2020-04-03-11-57-01-294_com.koteyka.superfirelamp.jpg Screenshot_2020-04-03-11-57-37-620_com.koteyka.superfirelamp.jpg Screenshot_2020-04-03-11-57-47-615_com.koteyka.superfirelamp.jpg Screenshot_2020-04-03-11-57-57-603_com.koteyka.superfirelamp.jpg
Screenshot_2020-04-03-11-58-24-170_com.koteyka.superfirelamp.jpg Screenshot_2020-04-03-11-58-41-901_com.koteyka.superfirelamp.jpg Screenshot_2020-04-03-11-59-01-773_com.koteyka.superfirelamp.jpg Screenshot_2020-04-03-11-59-35-546_com.koteyka.superfirelamp.jpg Screenshot_2020-04-03-11-59-48-707_com.koteyka.superfirelamp.jpg Screenshot_2020-04-03-11-59-56-989_com.koteyka.superfirelamp.jpg
НОВЫЙ (МНОГОЯЗЫЧНЫЙ) САЙТ С ПРИЛОЖЕНИЕМ И ПРОШИВКОЙ
На новом сайте в разделе ЗАГРУЗКИ все ссылки.
Старый сайт пока функционирует, но все обновления будут уже на новом

ГЕНЕРАТОР ТЕКСТОВОГО ФАЙЛА НАСТРОЕК ЭФФЕКТОВ для просмотра примера введите kk@kk.kk и нажмите загрузить
 
Изменено:

Комментарии

Koteyka 🐱

★★★★★★✩
Команда форума
27 Окт 2019
932
539
51
Днепр, Украина
firelamp.pp.ua
Конфетти,100,1,1,255,0
Огонь,100,1,1,255,1
Водопад,100,1,1,255,1
Радуга горизонтальная,100,1,1,50,0
Радуга вертикальная,100,1,1,50,0
Радуга диагональная,100,1,1,50,0
Смена цвета,1,10,1,1,0
Безумие 3D,1,100,100,1,0
Облака 3D,1,100,100,1,0
Лава 3D,1,100,100,1,0
Плазма 3D,1,100,100,1,0
Радуга 3D,1,100,100,1,0
Павлин 3D,1,100,100,1,0
Зебра 3D,1,100,100,1,0
Лес 3D,1,100,100,1,0
Океан 3D,1,100,100,1,0
Цвет,70,70,1,255,1
Снегопад,100,1,1,100,0
Метель,100,1,100,1,0
Звездопад,100,1,100,1,0
Матрица,100,1,1,100,0
Светлячки,100,1,1,40,0
Светлячки со шлейфом,100,1,1,100,0
Пейнтбол,100,1,1,100,0
Блуждающий кубик,100,1,1,255,0
Аквариум,255,1,1,255,1
Пульс,100,1,1,100,0
Комета,100,1,1,100,2
Белый свет,100,1,1,100,0
Прыгающие мячики,100,1,1,16,0
Бегущая строка,100,1,1,255,1

Где через запятую: Имя эффекта, макс. скорость, мин. скорость, макс. масштаб, мин. масштаб, вывод кольца градиента на масштабе (0-Нет 1-ДА 2-ДЛЯ КОМЕТЫ)
C++:
// ================ РЕЕСТР ДОСТУПНЫХ ЭФФЕКТОВ ===================
// ==== ДЛЯ ПЕРЕДАЧИ В ПРИЛОЖЕНИЯ С ПОДДЕРЖКОЙ ЭТОЙ ФУНКЦИИ =====
// формат записи:
//"Название эффекта,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,100,1,0;") +                       // EFF_SNOWSTORM         (18U)
String("Звездопад,100,1,100,1,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,40,0;") +                     // EFF_LIGHTERS          (21U)
String("Светлячки со шлейфом,100,1,1,100,0;") +         // EFF_LIGHTER_TRACES    (22U)
String("Пейнтбол,100,1,1,100,0;") +                     // EFF_PAINTBALL         (23U)
String("Блуждающий кубик,100,1,1,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("Белый свет,100,1,1,100,0;") +                   // EFF_WHITE_COLOR       (28U)
String("Прыгающие мячики,100,1,1,16,0;") +              // EFF_BALS              (29U)
String("Бегущая строка,100,1,1,255,1;") +               // EFF_PAINTBALL         (30U)
String(+ "\n");
 
Изменено:
  • Лойс +1
Реакции: stepko

Сотнег

★★★★★★★
15 Янв 2020
2,884
1,105
1. Почему в прошивке нет поддержки сохранения настроек эффектов в файл.
2. Как бегущая строка должна работать? Пятикратное нажатие кнопки?! Из приложения никак?
3. Почему "рисование" сделано не дополнительным эффектом, а через костыль?
 

Сотнег

★★★★★★★
15 Янв 2020
2,884
1,105
Рекомендую сворачивать строки парсинга параметров для сообщений от приложения.
Вместо:
C-like:
    else if (!strncmp_P(inputBuffer, PSTR("LIST1"), 5))     // Список эффектов 1
    {
        ...
    }
    else if (!strncmp_P(inputBuffer, PSTR("LIST2"), 5))     // Список эффектов 2
    {
        ...
    }
    else if (!strncmp_P(inputBuffer, PSTR("LIST3"), 5))     // Список эффектов 3
    {
        ...
    }
делать:
C-like:
    else if (!strncmp_P(inputBuffer, PSTR("LIST"), 4))     // Список эффектов
    {
       memcpy(buff, &inputBuffer[4], strlen(inputBuffer));  // взять подстроку, начиная с символа 5
       switch (atoi(buff))
         {
           case 1U:{
              {
                     ...
              }
           case 2U:
              {
                     ...
              }
           case 2U:
              {
                     ...
              }
    }

То же самое для рисования
C-like:
    else if (!strncmp_P(inputBuffer, PSTR("DRW"), 3)) {
    }
    else if (!strncmp_P(inputBuffer, PSTR("CLR"), 3)) {
    }
    else if (!strncmp_P(inputBuffer, PSTR("COL"), 3)) {
    }
    else if (!strncmp_P(inputBuffer, PSTR("DRAWOFF"), 7)) {
    }
    else if (!strncmp_P(inputBuffer, PSTR("DRAWON"), 6)) {
    }
стоит сворачивать в
C-like:
    else if (!strncmp_P(inputBuffer, PSTR("DRAW"), 5))     // Команды рисования
...
           case 1U: // рисуем
              {

           case 2U: // стираем
              {

           case 2U: // выбираем цвет
              {
Парсинг и так уже выглядит довольно тормозным из-за перебора различных вариантов строк.
 
Изменено:

Koteyka 🐱

★★★★★★✩
Команда форума
27 Окт 2019
932
539
51
Днепр, Украина
firelamp.pp.ua
Почему в прошивке нет поддержки сохранения настроек эффектов в файл.
В прошивке? А куда она файл будет девать?
Из приложения никак?
Последний эффект, если в моей прошивке
Почему "рисование" сделано не дополнительным эффектом, а через костыль?
Что значит через костыль? Отдельным пунктом в меню. Рисование это не эффект

Парсинг и так уже выглядит довольно тормозным из-за перебора различных вариантов строк.
Я делал по аналогии с остальными. Писал бы с нуля, писал бы по своему.
А Case это то же самое условие если. По времени обработки, если не изменяет память, даже больше, чем у ЕСЛИ, т.к. в него уже заложено условие иначе если. Просто код компактнее.
Знаю точно, что < и > быстрее отрабатывают, чем == и !=
 

Сотнег

★★★★★★★
15 Янв 2020
2,884
1,105
В прошивке? А куда она файл будет девать?
В прошивке в парсинге нет обработчика для "SET". Чтобы в приложении можно было из файла настройки взять.

Последний эффект, если в моей прошивке
Я пока не понимаю, в какой момент строка отправляется из приложения в лампу.
Кнопки "отправить" не видно на экране.

А Case это то же самое условие если. По времени обработки, если не изменяет память, даже больше, чем у ЕСЛИ, т.к. в него уже заложено условие иначе если. Просто код компактнее.
Суть в том, что если строка не содержит "LIST", то это проверяется за 1 раз,
а не за три "LIST1" -> "LIST2" -> "LIST3".
 

Koteyka 🐱

★★★★★★✩
Команда форума
27 Окт 2019
932
539
51
Днепр, Украина
firelamp.pp.ua
В прошивке в парсинге нет обработчика для "SET"
Точно. С этим тупонул. Не перенес в твою прошивку. Исправлю.
Хотя и приложение еще не передает их
Я пока не понимаю, в какой момент строка отправляется из приложения в лампу.
При нажатии кнопки НАЗАД

то это проверяется за 1 раз,
На языке кода программирования визуально да. Но при компиляции в машинный код не так. Просто условия иначе если уже заложены в конструкцию switch case и после компиляции действуют одинаково, если не медленнее. Не помню точно медленнее ли, но ни как не быстрее
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
2,884
1,105
условия иначе если уже заложены в конструкцию switch case и после компиляции действуют одинаково, если не медленнее
До switch case выполнение кода не дойдёт, если в запросе от приложения нет "LIST".
А его там нет в 99,99% случаев.
Так что нет смысла каждый раз проверять "LIST1" -> "LIST2" -> "LIST3".

Точно. С этим тупонул. Не перенес в твою прошивку. Исправлю.
Тогда заодно избавьтесь от буфера.
А то я уже проверил - 15-17 эффектов в одну строку только влезет, а так - больше:
C-like:
    else if (!strncmp_P(inputBuffer, PSTR("LIST"), 4)) // передача списка эффектов по запросу от приложения (если поддерживается приложением)
    {
       memcpy(buff, &inputBuffer[4], strlen(inputBuffer));  // взять подстроку, состоящую последних символов строки inputBuffer, начиная с символа 5
       switch (atoi(buff))
         {
           case 1U:
           {
             Udp.write(efList_1.c_str());
             Udp.write("\0");
             break;
           }
           case 2U:
           {
             Udp.write(efList_2.c_str());
             Udp.write("\0");
             break;
           }
           case 3U:
           {
             Udp.write(efList_3.c_str());
             Udp.write("\0");
             break;
           }
         }
    }

Хотя и приложение еще не передает их
Можно мне тогда предложить более эффективный шаблон запросов?
C-like:
    else if (!strncmp_P(inputBuffer, PSTR("SETS"), 4)) // передача настроек эффектов по запросу от приложения (если поддерживается приложением)
    {
       memcpy(buff, &inputBuffer[4], strlen(inputBuffer));  //  inputBuffer, начиная с символа 5
       switch (atoi(buff))
         {
           case 1U: // SET
           {
             memcpy(buff, &inputBuffer[5], strlen(inputBuffer));   // inputBuffer, начиная с символа 6
             int eff = getValue(buff, ';', 0).toInt();
             int brg = getValue(buff, ';', 1).toInt();
             int spd = getValue(buff, ';', 2).toInt();
             int sca = getValue(buff, ';', 3).toInt();
             modes[eff].Brightness = brg;
             modes[eff].Speed = spd;
             modes[eff].Scale = sca;

             break;
           }
           case 2U: // REA
           {
             String OutString;
             char replyPacket[MAX_UDP_BUFFER_SIZE];
             for (int i = 0; i < MODE_AMOUNT; i++){
             uint8_t brightness = modes[i].Brightness;
             uint8_t speed = modes[i].Speed;
             uint8_t scale = modes[i].Scale; 
             OutString = String(i) + ";" +  String(modes[i].Brightness) + ";" + String(modes[i].Speed) + ";" + String(modes[i].Scale) + "\n";
             OutString.toCharArray(replyPacket, MAX_UDP_BUFFER_SIZE);
             Udp.write(replyPacket);

             break;
           }
         }
    }
 
  • Лойс +1
Реакции: Shaitan

Koteyka 🐱

★★★★★★✩
Команда форума
27 Окт 2019
932
539
51
Днепр, Украина
firelamp.pp.ua
@Сотнег, У тебя ошибка в коде
C++:
case 2U: // REA
           {
             String OutString;
             char replyPacket[MAX_UDP_BUFFER_SIZE];
             for (int i = 0; i < MODE_AMOUNT; i++){
             uint8_t brightness = modes[i].Brightness;
             uint8_t speed = modes[i].Speed;
             uint8_t scale = modes[i].Scale;
             OutString = String(i) + ";" +  String(modes[i].Brightness) + ";" + String(modes[i].Speed) + ";" + String(modes[i].Scale) + "\n";
             OutString.toCharArray(replyPacket, MAX_UDP_BUFFER_SIZE);
             Udp.write(replyPacket);

             break;
           }
         }
В этом случае передача прервется после первого цикла.
Нужно break; опустить за закрывающую скобку for
 
  • Лойс +1
Реакции: Сотнег

Koteyka 🐱

★★★★★★✩
Команда форума
27 Окт 2019
932
539
51
Днепр, Украина
firelamp.pp.ua
А вообще, чисто теоретически, есть возможность в бегущую строку автоматом вписывать текущее время из смартфона ?
Есть. А нужно? Время и так показывается
 

Сотнег

★★★★★★★
15 Янв 2020
2,884
1,105
@Koteyka, я не тестировал, потому что в приложении пока не поддерживается.
Имел в виду, что точно так же, как LIST, завернуть все команды сохранения/чтения настроек в один IF.
Чтобы не парсить постоянно строку на каждый из вариантов команды.
 

EGORka

★✩✩✩✩✩✩
15 Мар 2020
83
28
Хотелось бы, не всегда есть возможность подключить лампу к роутеру. А в режиме точки доступа ни будильники не работают , ни время бегущей строкой не вывести. Так то в принципе и все время и будильники завязаны на выход в интернет. а связи с интернетом через роутер нет. Поэтому мне кажется способ брать время со смартфона был бы не лишним. Хотя я не программер, может и это невозможно.
 

Koteyka 🐱

★★★★★★✩
Команда форума
27 Окт 2019
932
539
51
Днепр, Украина
firelamp.pp.ua
А в режиме точки доступа ни будильники не работают , ни время бегущей строкой не вывести.
Там все эти методы привязаны к библиотеке работы со временем из интервента.
То, что я передам время из приложения, вас не спасет. Нужно многое менять в прошивке
 

Palpalych

★★★★★✩✩
24 Дек 2019
720
385
Охренеть! Поставил последнюю версию. А как бегущий текст оказался на экране?
Я свою прошивку даже не адаптировал под эту фичу!

UPD: да, работает текст. Видимо давно подключил эту фичу, забыл про это, а сейчас оказалось что работает.
 
Изменено:

sanyanovik

✩✩✩✩✩✩✩
25 Мар 2019
16
0
Климовск
Добрый день. Поставил Вашу прошивку 1.5. У меня матрица 15 на 26. Эффект "Комета " Работает только 15 на 15.... Все остальные работают правильно.
 

Pavelts

★★★✩✩✩✩
4 Апр 2020
386
118
@Koteyka,

Гуд, ура будет обновляться.
Добавьте в приложение тактильную отдачу на переключение эффектов :)
 

Palpalych

★★★★★✩✩
24 Дек 2019
720
385
Подключил рисовалку к своей прошивке. + разные фишечки приделал :D
Вопрос к автору - а матрица только стандартная 16х16?

Еще момент. Телефон не засыпает когда долго лежит с активным приложением.
 

Palpalych

★★★★★✩✩
24 Дек 2019
720
385
Добрый день. Поставил Вашу прошивку 1.5. У меня матрица 15 на 26. Эффект "Комета " Работает только 15 на 15.... Все остальные работают правильно.
По комете: там голова кометы смещается вроде как бы на квадратную величину, а размытие должно происходить по всему диапазону матрицы. Хорошо, посмотрю еще на этот факт.

UPD. Я менял несколько раз этот эффект, в последней редакции вроде как по всей матрице колыхается. Мне нужно знать какая их комет? Есть радужная комета, а есть авторская от одного немца. Я за свою могу говорить.