ARDUINO Огненый светильник на Digispark

Kort

✩✩✩✩✩✩✩
31 Янв 2019
23
6
Приветствую сообщество. Разрешите присоеденится.

Вообщем решил я повторить проект со светильником ну и видимо спалил ардуинку, ну это не суть. Вообщем подумал а почему проект требующий 1 выход на ленту и 1 на кнопку требует ардуино когда можно поставить Digispark??

Ну вот тут и начались проблемы. Во первых не подходит библиотека FastLED она слишком тяжелая и жрет место. Заменил на NeoPixel но как оказалось(что не удивительно) она достаточно сильно отличается в синтаксисе и все перестало работать от слова совсем. Пришлось адаптировать эффекты, огонь пришлось заменить, не смог я осилить его логику.
Вообщем выкладываю рабочий код с эффектами под NeoPixel и работающий на Digispark с обычной кнопкой пока что. Но ради чего я сюда зашел писать топик? У меня проблема. Я не пойму принцип работы кнопки от Гайвера. Вернее как оно должно работать понятно но в некоторых эффектах не получается переключиться. Находясь в контейнере эффекта видимо кнопка не фиксирует нажатие в итоге чтоб выпрыгнуть из режима нужно попасть в момент перехода. На некоторых эффектах почти незаметно, на некоторых вообще труба. Не могу разобраться где баг и как сделать так чтоб нажатие работало четко.

Хорошо если кто то разберется, а Гайвер если сюда забегаешь можешь прилизать код и забрать, будет под NeoPixel светильничек. Можно забрать эффект огня который в скетче тоже неплохой вариант. Сильно не пинайте я не "суровый" программер, практически это первый проект.
 

Вложения

  • Лойс +1
Реакции: Palurit

Kort

✩✩✩✩✩✩✩
31 Янв 2019
23
6
Вот к примеру нашел и адоптировал "хуевил" под неопиксель....из этого эффекта кнопкой вообще не выйти...вроде не мертвое зацикливание...


C++:
void rainbow(uint8_t wait) {

  uint16_t i, j;

  for(j=0; j<256; j+=3) {
    for(i=0; i<NUM_LEDS; i++) {
      strip.setPixelColor(i, Wheel((i*1+j) & 255));
          strip.show();
          delay(wait);
    }
  }
}

uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } 
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } 
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}
 

Kort

✩✩✩✩✩✩✩
31 Янв 2019
23
6
Круто, не скажу что я прям долго старался. Но огонек что-то мне показался слишком сложным. Решил отложить на потом :)

Меня вот вопрос с кнопкой больше задевает. Ну это наверное не только к Digispark вопрос. Тут просто сама проблема программирования и опроса нажатия. Я понимаю что опрос нажатия в теле программы, а эффекты написаны в "контейнерах" и пока видимо из него не выпрыгнет кнопка не сработает. Но даже если кнопку нажал и сидишь ждешь конца эффекта все равно не переключиться. Походу пока эффект пройдет контролер уже забыл и забил на кнопку :) Ну или в контейнере просто тупо нажатие не регистрируется. Пробовал команду опроса кнопки помещать в контейнеры что-то не дало результата.

З.Ы. А скетч с огоньком на Digispark поделишься? Он на библиотеке NeoPixel?
 

Kort

✩✩✩✩✩✩✩
31 Янв 2019
23
6
Блин реально сложно...что блин там происходит o_O

Вот что показалось странным. В конце описания эффекта присутствуют вот такие строки.

C++:
uint8_t random8() {
  return random(0, 255);
}

uint8_t random8(uint8_t max) {
  return random(0, max);
}

uint8_t random8(uint8_t min, uint8_t max) {
  return random(min, max);
}
Мне кажется или это одно и тоже записанное как то по разному, это попытки адоптации? Может надо оставить один вариант?
 

Александр Симонов

★★★✩✩✩✩
2 Авг 2018
525
135
Мне кажется или это одно и тоже записанное как то по разному, это попытки адоптации? Может надо оставить один вариант?
Это называется перегрузка функций: http://cppstudio.com/post/406/
И кстати я как раз смотрел, что можно подчистить в коде, и убрал их полностью. Скетч в своем сообщении выше обновил.
 

Александр Симонов

★★★✩✩✩✩
2 Авг 2018
525
135
Да, ещё один момент. Эффект пламени здесь немного переработанный по сравнению с тем, что был в оригинале, для того, чтобы он плавно выглядел на скорости 50 кадров/с. у Гайвера в лампе эффекты считаются с частотой 16 к/с. А так как "физика" частиц пламени, скажем так, кратна кол-ву пикселей (за один шаг частицы пламени поднимаются вверх на один пиксель), утроение частоты кадров утраивает и "скорость горения", от чего эффект пламени теряется.

Поэтому я утроил количество моделируемых частиц пламени и подогнал коэффициенты COOLING и SPARKING, чтобы пламя/искры по-прежнему поднимались на всю высоту. А соответственно при отрисовке пикселей я беру по три частицы пламени, усредняю их температуру, и уже по средней выбираю цвет из паллитры.
 
Последнее редактирование:

Kort

✩✩✩✩✩✩✩
31 Янв 2019
23
6
А кстати по поводу эффекта пламени. Может замутить 2 вараинта цветов. Один вот красно/ораньжевый, а другой вариант сине/голубой я думаю должно быть неплохо смотреться голубое пламя.

З.Ы. По поводу кода. Для дигитпарка очень важно убирать все и вся :) я даже переменные не нужные менял с int на byte чтоб меньше места ели :ROFLMAO: Да но действительно огонь пока для меня сложно понять.
 

Kort

✩✩✩✩✩✩✩
31 Янв 2019
23
6
Так в чем проблема? Может кто обьяснить по поводу кнопки?
Почему сранный код тупо туда сюда не дает выйди по нажатию кнопки. Попадаешь в этот эфект и все там остаешься. Другие эфекты нормально тотже огонь, светлячек и т.п а в этом и в радуге зависалово.

C++:
void test() {

// Включаем все светодиоды.

  for (byte i = 0; i < NUM_LEDS; i++)
  {
    strip.setPixelColor(i, 255, 0, 0); // Красный цвет.
    strip.show(); // Передаем цвета ленте.
    delay(100); // Ждем 100 мс.
  }
// Выключаем все светодиоды.
  for (byte i = NUM_LEDS; i >0; i--)
  {
    strip.setPixelColor(i, strip.Color(0, 0, 0)); // Черный цвет, т.е. выключено.
    strip.show(); // Передаем цвета ленте.
    delay(100); // Ждем 100 мс.
  }
}
 

Александр Симонов

★★★✩✩✩✩
2 Авг 2018
525
135
Так в чем проблема? Может кто обьяснить по поводу кнопки?
Почему сранный код тупо туда сюда не дает выйди по нажатию кнопки. Попадаешь в этот эфект и все там остаешься. Другие эфекты нормально тотже огонь, светлячек и т.п а в этом и в радуге зависалово.
ГайверКнопка не по прерыванию работает, поэтому она не может прервать эту функцию. Все остальные режимы сделаны так, чтобы функция отрисовывала один кадр за раз, соответственно между отрисовками кадров вызывается обработчик кнопки.
 

Kort

✩✩✩✩✩✩✩
31 Янв 2019
23
6
Я понимаю, но почему при завершении эффекта она все равно не срабатывает. Эффект же не бесконечный все равно из него выходит раз за цикл. Ну и вопрос как тогда сделать так чтоб срабатывало? Можно какой то код закидывать внутрь эффекта например чтоб выпрыгивать из него? пробовал break return что то каряво работает.
 

Александр Симонов

★★★✩✩✩✩
2 Авг 2018
525
135
но почему при завершении эффекта она все равно не срабатывает
Вставляй отладочные вывод, изучай. Отладка кода обычно занимает больше, чем написание.
А чтоб срабатывало, надо сделать чтобы функция test() отрисовывала один кадр эффекта, а не весь цикл.
 

Kort

✩✩✩✩✩✩✩
31 Янв 2019
23
6
Пришли ардуинки, собрал я обещанный ночник залив скетс Алекса. Но тема с дигитспарком мне интересна, еще 4м ленты и 4 дигитспарка валяеться. Так что надо дружить с кнопкой шаманить/вырезать эффекты. Если все функции кнопки накинуть, как в большом проекте эффектов реально придется оставлять 2-3 тупо места не будет.

З.Ы. Кстати из эффектов у Гайвера мне больше всего понравилась радуга медленно ползущая сверху вниз. А вот огонь у Гайвера мне показался какой то быстрый что ли...не натурально. Надо его замедлять как то, чтоб плавнее горел.

З,Ы.Ы А из чего сделал ты сделал такую высокую колбу? Очень достойно выглядит. И матовость хорошая.
 

Александр Симонов

★★★✩✩✩✩
2 Авг 2018
525
135
З,Ы.Ы А из чего сделал ты сделал такую высокую колбу? Очень достойно выглядит. И матовость хорошая.
Это бобина из под рулона цветной клейкой пленки (точнее половина бобины). Знакомые рекламщики подогнали.