Матрица 8*32 ws2812b
- Войдите на сайт для отправки комментариев
Ср, 03/08/2022 - 19:07
Тренируюсь с матрицей, примеры библиотеки "неопиксель матрикс" не заработали - матрица не светит :)
Стал писать функции сам, три нарисовал, фантазия иссякла. Не могу корректно массивы цифр перевести в PROGMEM, пробовал на семёрке, какая то кракозябра рисуется. Как это подправить?
Раз ino.
// Подключаем библиотеку Adafruit NeoPixel. #include <Adafruit_NeoPixel.h> // Указываем, какое количество пикселей у нашей ленты. #define LED_COUNT 256 // Указываем, к какому порту подключен вход ленты DIN. #define LED_PIN 6 Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой. int k=10;//яркость свечения пикселя из 0 до 255 ступеней int t=75;//единица длительности переключений в мс void setup() { strip.begin(); pusto_ (); } ///////////////////////////////////////////////////// void loop() { for(int i=0;i<85;i++){ pusto_ (); zifra_(i,0,1);zifra_(i-5,1,2);zifra_(i-10,2,3);zifra_(i-15,3,4);zifra_(i-20,4,5);zifra_(i-25,5,6); zifra_(i-30,6,7);zifra_(i-35,7,1); zifra_(i-40,8,2);zifra_(i-45,9,3); strip.show(); delay(t); } } //////////////////////////////////////////////////////
Два ino.
////////////////////////////////////////////////////// //пиксель заданного цвета по координатам void pixel_(byte x,byte y,byte color){ if(x<32&&y<8&&color<8){ if(x%2==0){ strip.setPixelColor(y+x*8, strip.Color(k*(color%2),k*((color%4)/2),k*((color%8)/4))); // } else {strip.setPixelColor(7-y+x*8, strip.Color(k*(color%2),k*((color%4)/2),k*((color%8)/4)));} } } ///////////////////////////////////////////////////// //стереть данные в буфере void pusto_ (){ for(int i=0;i<LED_COUNT;i++){ strip.setPixelColor(i, strip.Color(0,0,0)); // } } ///////////////////////////////////////////////////// //цифра заданного цвета по координате Х ( 5*8 пикселей) void zifra_(int X,byte zif, byte COLOR){ // if(zif==0){ byte zifra_0[8]={B01110, B10001, B10001, B10001, B10001, B10001, B10001, B01110}; for(byte st_1=0;st_1<8;st_1++){ for(byte st_2=0;st_2<5;st_2++){ pixel_(X-st_2,7-st_1,COLOR*bitRead(zifra_0[st_1],4-st_2)); }}} // if(zif==1){ byte zifra_1[8]={B00100, B01100, B10100, B00100, B00100, B00100, B00100, B01110}; for(byte st_1=0;st_1<8;st_1++){ for(byte st_2=0;st_2<5;st_2++){ pixel_(X-st_2,7-st_1,COLOR*bitRead(zifra_1[st_1],4-st_2)); }}} // if(zif==2){ byte zifra_2[8]={B01110, B10001, B00001, B00001, B01110, B10000, B10000, B11111}; for(byte st_1=0;st_1<8;st_1++){ for(byte st_2=0;st_2<5;st_2++){ pixel_(X-st_2,7-st_1,COLOR*bitRead(zifra_2[st_1],4-st_2)); }}} // if(zif==3){ byte zifra_3[8]={B11111, B10010, B00100, B01110, B00001, B00001, B10001, B01110}; for(byte st_1=0;st_1<8;st_1++){ for(byte st_2=0;st_2<5;st_2++){ pixel_(X-st_2,7-st_1,COLOR*bitRead(zifra_3[st_1],4-st_2)); }}} // if(zif==4){ byte zifra_4[8]={B00010, B00110, B01010, B10010, B10010, B11111, B00010, B00010}; for(byte st_1=0;st_1<8;st_1++){ for(byte st_2=0;st_2<5;st_2++){ pixel_(X-st_2,7-st_1,COLOR*bitRead(zifra_4[st_1],4-st_2)); }}} // if(zif==5){ byte zifra_5[8]={B11111, B10000, B10000, B11110, B00001, B00001, B10001, B01110}; for(byte st_1=0;st_1<8;st_1++){ for(byte st_2=0;st_2<5;st_2++){ pixel_(X-st_2,7-st_1,COLOR*bitRead(zifra_5[st_1],4-st_2)); }}} // if(zif==6){ byte zifra_6[8]={B01110, B10001, B10000, B01110, B10001, B10001, B10001, B01110}; for(byte st_1=0;st_1<8;st_1++){ for(byte st_2=0;st_2<5;st_2++){ pixel_(X-st_2,7-st_1,COLOR*bitRead(zifra_6[st_1],4-st_2)); }}} // if(zif==7){ byte zifra_7[8]={B11111, B00001, B00001, B00010, B00100, B01000, B10000, B10000}; for(byte st_1=0;st_1<8;st_1++){ for(byte st_2=0;st_2<5;st_2++){ pixel_(X-st_2,7-st_1,COLOR*bitRead(zifra_7[st_1],4-st_2)); }}} // if(zif==8){ byte zifra_8[8]={B01110, B10001, B10001, B01110, B10001, B10001, B10001, B01110}; for(byte st_1=0;st_1<8;st_1++){ for(byte st_2=0;st_2<5;st_2++){ pixel_(X-st_2,7-st_1,COLOR*bitRead(zifra_8[st_1],4-st_2)); }}} // if(zif==9){ byte zifra_9[8]={B01110, B10001, B10001, B10001, B01110, B00001, B10001, B01110}; for(byte st_1=0;st_1<8;st_1++){ for(byte st_2=0;st_2<5;st_2++){ pixel_(X-st_2,7-st_1,COLOR*bitRead(zifra_9[st_1],4-st_2)); }}} // } /////////////////////////////////////////////////////
Для одноцветной матрицы примерно так:
Вывод примерно так
setColumn - это условно, у меня метод другой, но суть такая, цифры рисуются по столбцам битовой маской: 0 - пиксель отключен, 1 - пиксель светится.
Вот как тут еще цвет пикселя задать - тут думать нужно )))
UPD: хотя чего там думать, в массиве вместо байта - массив CRGB
Стал писать функции сам
Это самое лучшее, что Вы могли сделать. Продолжайте и через некоторое время у Вас будут проблемы "что сделать", а проблем "как сделать" не будет.
Продолжайте и через некоторое время у Вас будут проблемы "что сделать", а проблем "как сделать" не будет.
и это грустно... наоборот - веселее
Вывод примерно так...
Вот и я в том же духе пробовал, так фрагмент работает и 7 рисуется:
а так выходит китайский иероглиф и 7 "отсиметриченная" тоже проглядывается в нём:
Непонятно где я обманываюсь.
Непонятно где я обманываюсь.
Если PROGMEM, то константа ))
Продолжайте и через некоторое время у Вас будут проблемы "что сделать", а проблем "как сделать" не будет.
и это грустно... наоборот - веселее
Нет, это скучно, когда понимаешь что практически любая алгоритмическачкая задача решаема.
Мне кажется сам PROGMEM в таком расположении массива не работает.
Потому что такой вариант 7 рисовать не должен, а он её рисует.
Да, не работает.
Пришлось переделать к более привычному виду:
А если
Не может такого быть, чтобы у всех работало, а у тебя нет ))
Да, вот в таком написании заработало.
Запустилась таки "матрица-неопиксель". И голову теперь можно не напрягать :)
Здесь как мне кажется наиболее простое и удобное решение:
http://arduino-kid.ru/blog/adresnaya-lenta-ws2812b-beguschaya-stroka-upr...
Круто!:)
Нашёл интересный авторский алгоритм огня:
https://labdata.ru/article/algoritm-ognja-dlja-adresnyh-svetodiodnyh-matric
Имитация очень правдоподобная и имеет много настроек - можно исходный скетч развить в тему пламени, например, камина. Но я попробовал сделать его фоновым для бегущей строки. Если матовый экран от пикселей удалить на 5-10 мм вообще блеск.
PS Почему теперь нельзя вставить гифку больше 1 Мб?
Нет случайно ни у кого подобных алгоритмов водопада, восхода или заката :)
:)
Долго думал чего у Гайвера, а соответственно и у остального мира нет, и понял - генератора пиксельного орнамента на симметрии четверти:
Если с генерацией всё ясно, то с анимацией не очень. Орнамент можно двигать влево-вправо (что я и сделал), калейдоскопить - вращая четверть (думаю, что сделаю). А ещё что можно изобрести?
солярные знаки можно вращать (посолонь и противосолонь)
ЗЫ я застал время когда такие пиротехнические эффекты еще строили
:)
Долго думал чего у Гайвера, а соответственно и у остального мира нет, и понял - генератора пиксельного орнамента
у гайвера есть все
:)
Эпично!, красиво.
Это около 16 матриц 8*32. Уно, нано не смогёт. Но явно не генератор орнамента, а картинки. А у Гайвера... я с этим сравнивал:
https://alexgyver.ru/gyvermatrixos-guide/
раздел "эффекты и режимы"
красота то какая...
Это около 16 матриц 8*32.
это одна 64х64
А что за тип?, уно-нано-(библиотеки) тянут (есть)? :)
А что за тип?, уно-нано-(библиотеки) тянут (есть)? :)
так это те же матрицы, что я вам показывал когда вы разные шкалы рисовали на ОЛЕД дисплее, помните?
https://arduino.ru/forum/proekty/imitatsiya-razlichnykh-shkal-na-displee...
Библиотека (поддерживает стм32 блюпилы и блекпилы)
А про орнаменты найдите мою статейку на гайверофоруме (ник такой же как тут) - я там рассказываю как рисовал эту заставку с птицами для часов (сообщение 18). Дал бы ссылку, да у меня с работы Гайвер закрыт
... когда вы разные шкалы рисовали на ОЛЕД дисплее, помните?
Вспомнил, там же у меня было 128*64 :)
Вспомнил, там же у меня было 128*64 :)
у меня их много разных, от 32х16 до 128х64
Библиотека (поддерживает стм32 блюпилы и блекпилы)
Не понял, а чё ... за коней топим?
Не понял, а чё ... за коней топим?
ой ее.... попал :)
теперь поздно оправдываться что картинко не мое :)
Узорю дальше, сделал зеркальные отражения, ещё в природе есть поворот на 90гр., вопрос: а ещё что то есть?
Не понял, а чё ... за коней топим?
Последняя игра чемпионата СССР, которую смотрел на стадионе.
Холодные сырые деревянные лавки, польский плащ болотного цвета на тощем студенте, на голове дурацкая "тирольская" шляпа. В заднем кармане джинсов 20 чеков Внашпосылторга и 7р. с мелочью, а в карманчике рубашки повестка в армию, которую только-что вручили. Домой только завтра, предкам сообщать. Настроение прескверное, а тут еще мясо запыленщиков ипет.
В армию осенью не взяли, перебор, ушел весной 1984. А вернулся - под "Шахтером" радиорынок, синклеры, память, логика 155ая на разлив..