Для отдельного индикатора
#define sm 32 // количество светодиодов в индикаторе
// матрица первого индикатора
byte seg[8][4]={{19,20,27,28},{18,21,26,29},{17,22,25,30},{16,23,24,31},{3,4,11,12},{2,5,10,13},{1,6,9,14},{0,7,8,15}};
//для индикатора N ID светодиода равно seg[Y][X]+(N*sm)
// матрица для все дисплея
byte seg[8][16]={{19,20,27,28,51,52,59,60,83,84,91,92,115,116,123,124}
,{18,21,26,29,50,53,58,61,82,85,90,93,114,117,122,125}
,{17,22,25,30,48,54,57,62,81,86,89,94,113,118,121,126}
,{16,23,24,31,48,55,56,63,80,87,88,95,112,119,120,128}
,{3 ,4 ,11,12,35,36,43,44,67,68,75,76,99,100,107,108}
,{2 ,5 ,10,13,34,37,42,45,66,69,74,77,98,101,106,109}
,{1 ,6 ,9 ,14,33,38,41,46,65,70,73,78,97,102,105,110}
,{0 ,7 ,8 ,15,32,39,40,47,64,71,72,79,96,103,104,111}
};
{B0100111,B1001001,B1001001,B0110001}
byte num[23][4]={{B01111110,B01000010,B01111110,B00000000}, //0
{B01000100,B01111110,B01000000,B00000000}, //1
{B01100100,B01010010,B01001100,B00000000}, //2
{B01000010,B01001010,B01111110,B00000000}, //3
{B00111000,B00100100,B01111110,B00000000}, //4
{B01001110,B01001010,B01111010,B00000000}, //5
{B01111110,B01001010,B01111010,B00000000}, //6
{B01100010,B00010010,B00001110,B00000000}, //7
{B01111110,B01001010,B01111110,B00000000}, //8
{B01001110,B01001010,B01111110,B00000000}, //9
{B00001000,B00011100,B00001000,B00000000}, //+
{B00001000,B00001000,B00001000,B00000000}, //-
{B01111110,B00000010,B01111110,B00000000},//П
{B01111110,B01001010,B01110100,B00000000}, //В
{B01111110,B01000010,B01100110,B00000000}, //С
{B00011110,B00010000,B01111110,B00000000}, //Ч
{B01111100,B00010000,B01111100,B00000000},//н
{B00000100,B01111100,B00000100,B00000000},//т
{B01111100,B00010100,B00011100,B00000000},//р
{B01111100,B01010100,B01100100,B00000000},//б
{B01111100,B01000100,B01101100,B00000000},//с
{B00000000,B00001110,B00001010,B00001110},// градусы
{B00000000,B00000000,B00000000,B00000000}// пустота
};
#define matx 16
#define maty 8
void ShowSumbol(byte id, int x, int y, byte r, byte g, byte b,byte black)
// id индекс символа в таблице символов
//x,y координаты левого нижнего угла
//r,g,b цвет
//black выключить или нет неиспользуемые пиксели 1 выключать
{
for (int xi=0; xi<segx;xi++)
{
for (int yj=0; yj<segy;yj++)
{
if (bitRead(num[id][xi],yj)==1)
{
if ((y+yj)<maty && (x+xi)<matx)
{
if (((x+xi)>=0)&&((y+yj)>=0)) strip.setPixelColor(seg[y+yj][x+xi],strip.Color(r,g,b));
}
}
if (bitRead(num[id][xi],yj)==0)
{
if (black==1) strip.setPixelColor(seg[y+yj][x+xi],strip.Color(0,0,0));
}
}
}
}
#include <fix_fft.h>
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define count_led 128 // количество светодиодов
Adafruit_NeoPixel strip = Adafruit_NeoPixel(count_led, PIN, NEO_GRB + NEO_KHZ800); //first number change does distance between colors
byte seg[8][16]={{0 ,7 ,8 ,15,32,39,40,47,64,71,72,79,96,103,104,111}
,{1 ,6 ,9 ,14,33,38,41,46,65,70,73,78,97,102,105,110}
,{2 ,5 ,10,13,34,37,42,45,66,69,74,77,98,101,106,109}
,{3 ,4 ,11,12,35,36,43,44,67,68,75,76,99,100,107,108}
,{16,23,24,31,48,55,56,63,80,87,88,95,112,119,120,128}
,{17,22,25,30,48,54,57,62,81,86,89,94,113,118,121,126}
,{18,21,26,29,50,53,58,61,82,85,90,93,114,117,122,125}
,{19,20,27,28,51,52,59,60,83,84,91,92,115,116,123,124}
};
const int AUDIOPIN=A0;
char im[128], data[128], lastpass[64];
char data_a[16];
char data_d[16];
int i=0, val, vd=0;
char x=17, y=8;
int maxValue=30;
void setup() {
analogReference(DEFAULT);
for (int z=0; z<64; z++) {lastpass[z]=80;};
strip.begin();
strip.show();
}
void loop() {
for (i=0; i < 128; i++){
val = analogRead(AUDIOPIN);
data[i] = val;
im[i] = 0;
}
fix_fft(data,im,7,0);
for (i=0; i< 64;i++){
data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);
}
for (i=1; i<x; i++) {
data_a[i] = data[i*4] + data[i*4 + 1] + data[i*4 + 2] + data[i*4 + 3];
if(data_a[i]>maxValue)
{
data_a[i]=maxValue;
}
data_a[i] = map(data_a[i], 0, maxValue, 0, y);
for (int j=0; j<y;j++)
{
if (data_a[i]<j)
{
strip.setPixelColor(seg[j][i-1],strip.Color(0,0,0));
}else
{
strip.setPixelColor(seg[j][i-1],strip.Color(map(j, 0, y, 0, 255),20,map(i, 0, x, 0, 255)));
}
}
}
strip.show();
delay(15);
}
+23 |
1638
52
|
+150 |
3475
43
|
+45 |
2398
83
|
На моей практике около 500 диодов Arduino Nano едва заметна задержка(библиотека fastled), на ESP8266 не заметна.
Зачем было изобретать велосипед?
Надо только проверить как у нее с кириллицей.
А даже если бы знал раньше что есть такая библиотека то скорее всего попытался бы написать сам, основной профит был пощупать как оно работает, а не вкинуть одной строкой то что написал кто-то другой.
Если бы чуть лучше знал ASM то и протокол попытался бы реализовать сам вообще без библиотеки. :)
learn.adafruit.com/adafruit-gfx-graphics-library?view=all
Действительно, NeoMatrix выводит текст
Но при попытке изменить шрифт упираемся в размерность матрицы.
Создаём шрифт 3х5 и выводим его в любую точку матрицы.
Ясное дело, что шрифт высотой 20 пикселей не влезет на матрицу размером 16 пикселей, например. Но при чём здесь библиотека?
Лучшая цена 2 ~ 1000 шт. IC apa106 F8 8 мм/f5 5 мм круглые RGB полном Цвет Neo Pixel arduino матовый светодиодные Чип (как WS2812B) 5 В
https://aliexpress.com/item/item/10-1000Pcs-RGB-Full-Color-IC-Built-IN-APA106-F8-8mm-F5-5mm-Neo-pixel-Arduino/32704656076.html
Надо будет попробовать, хотя цена :(
Да и цена — 158$ за 1000 штук. То есть табло в 32х32 и шагом 6 мм (будем очень большими оптимистами) обойдётся баксов в 200. Готовая панелька 32х32 с шагом 6 мм обойдётся с доставкой в 20$.
Сам такую гирлянду на ёлку вешал на новый год :)
www.led-color.com/upload/201604/APA102-2020%20SMD%20LED.pdf
Тот же функционал, но корпус 2ммх2мм.
Бонусом — несущая частота встроенного шим более 20кГц, что делает их намного приятнее для глаза в плане мерцания, если сравнивать с WS2812
Главное, не берите SKxxxx — поганенькие клоны…
Да и тут плюсы тоже есть, хотя цена их перекрывает.
koticik
а цветные варианты — не менее требовательны?
ружья должны вроде умещаться
хотя как-то на ардуино.ру я заспорил с одним парнем… по его словам оптимизация как таковая — изначально не верный подход к выбранному оборудованию и что проще перейти на более производительный камень, чем заниматься вычесыванием кода.
Единственно о чем еще с времен института приучили думать это о размерности переменных, типа не брать Инт там где хватит Байт и так далее ибо сменить тип переменной бывает очень грустно и больно. Хотя и боролись мы с нашим преподом по программированию на предмет это в ваше время 640 килобайт было, а мы уже скоро до гига дорастем зачем ее экономить то :)
без PROGMEM
Скетч использует 5 446 байт (17%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 518 байт (25%) динамической памяти, оставляя 1 530 байт для локальных переменных. Максимум: 2 048 байт.
c PROGMEM
Скетч использует 5 446 байт (17%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 390 байт (19%) динамической памяти, оставляя 1 658 байт для локальных переменных. Максимум: 2 048 байт.
Выигрыш есть и он не маленький, Но это только компиляция, как оно при исполнении будет не проверял :)
Это особенность светодиода.
Этот диод нормально работает на статических основных цветах и на белом цвете, а вот на быстрой заливке промежуточным цветом иногда не включается или включается но другим цветом. Я пытался выяснить почему так но так и не смог, но дело явно не в коде.
Пробовал и без резистора и без кондеров ничего не меняется. Диод то показывает то нет иногда помогает если выключенным светикам давать цвет не 0,0,0 а скажем 5,5,5 они все равно не горят но тогда этот может проснуться, но в зависимости от интенсивности картинки может опять не пахать.
При этом как видно его такая работа совсем не мешает работать другим и что немаловажно не сбивает порядок включения других диодов (сбойный стоит по-моему номером 30) а всего их 128, то есть за себя данные он успешно транслирует, а вот сам почему то ведет себя немного неадеквато.
А, «проблемный» не в начале цепочки? Переставьте диод или кластер целиком в другую позицию для контроля.
Пытался менять местами еще когда только собирал и делал первые тесты, результат тот же потому и решил что это аппаратный глюк конкретного пикселя.
А скетч буков выложу но только вечером.
char data_a[16];
char x=17
for (i=1; i<x; i++) {
data_a[i] =
У вас i щелкает от 1 до 16. А элементы массива data_a имеют номера от 0 до 15. Соответственно — вы пишете уже в ячейку памяти за границей массива.
Это вот только то, что просто бросается в глаза. Ну и код надо чистить и чистить, конечно.
В первом столбце без фильтров на входе идет постоянный шум и он просто не гаснет даже в тишине поэтому матрица была пересчитана на 17 столбцов, а потом при выводе seg[j][i-1]
Номер столбца массива и номер столбца дисплея смещались на единицу. А вот о том что стоило бы увеличить размер массива я как то не подумал :)
То что код надо чистит тут я даже спорить не буду и чистить и оптимизировать но дело в другом.
Щелкает 6 светодиод 4 столбца, и это вряд ли связано конкретно с этой ошибкой. Он щелкает даже на стандартных тестах библиотеки на градиенте.
но она считается давно устранённой:
fastled.io/
Для подобных поделок она даже поудобнее.
имеенно так я вчера и воспринял вашу проблему
сейчас гадаю — почему?))
(разве что интерференция «первом»-«один» на LighTning; видео никогда не смотрю)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.