светодиодное пано\ светодиодная матрица
- Войдите на сайт для отправки комментариев
Пнд, 12/12/2016 - 12:52
Приветствую уважаемые знатоки! загнался идеей создать квадратную матрицу из RGB светодиодов, накрыть матовым стеклом её и повесить на стену, типа интерактивная картина своеобразная, погуглил реализацию но нашел только темы с отдельным управлением одним диодом. Итак вопрос! возможно ли реализовать на ардуинке управление матрицей из 100 светодиодов? и самое главное что бы каждый диод мог отдельно управляться и я мог создавать любые световые эффекты
если это возможно я был бы рад любым советам по реализации
погуглил реализацию но нашел только темы с отдельным управлением одним диодом.
Странно Вы как-то гуглили. Материалов про RGB матрицы завались. В том числе и на данном форуме. Например, и ещё с десяток если поискать..
Итак вопрос! возможно ли реализовать на ардуинке управление матрицей из 100 светодиодов? и самое главное что бы каждый диод мог отдельно управляться и я мог создавать любые световые эффекты
Можно. В том примере, на который я дал ссылку - 64 светодиода. Точно также можно сделать и из ста.
большое спасибо за помощь, вероятно я криво искал и запросы "подключение rgb светодиодов к arduino" не совсем верны для моей идеи
Да, не за что. Смотрите.
Там я правда делал исключительно демонстрацию работы матрицы, поэтому код сделан в лоб без каких-либо оптимизиаций. Но каждый диодик управляется независимо, как Вы хотели, и есть функции сложения цветов (когда одна волна на другую набегает). Для старта Вам подойдёт, а там разберётесь и оптимизируете.
В данном форуме есть несколько тем про светодиоды WS2811 или WS2812 (или ленты с ними) - их можно до 500 спокойно подключить (и управлять ими по одному пину).
большое спасибо! Ваш комментарий идеально подходит для моей задумки, на мой взгляд лента гораздо проще матрицы, а главное, как мне кажется, дешевле
лента гораздо проще матрицы
Если умеете её готовить, то да.
как мне кажется, дешевле
А вот это ХЗ.
И ещё, если ленту паять самому, то конечно "паяем как хотим", а если покупать готовую, то обращайте внимание на количество светодиодов на метр, а то бывает, что они довольно редко стоят. Также обращайте внимание на отзывы и ищите хорошего поставщика, т.к. часто халтурщики плохо делают теплоотвод. И последнее, сам не нарывался, но тут на форуме много писали - чтобы она служила долго и безпроблемно, сразу делайте двойной запас по току, т.е. подавайте на неё ток вдвое меньше, чем заявлено, т.к. светодиоды они туда пихают нонэймовые и от положенного тока они часто выходят из строя (как в китайских светодиодных лампах - китайцы делают их на меньший ток и тогда служат нормально).
спасибо за совет)
Здравствуйте. Подскажите как оптимизировать код:
Мне не нравится идея выполнять условия каждые N циклов, но зато не использую delay
#include <SPI.h> enum { reg = 8 }; int q=16; int t=0; int a=0; void setup() { SPI.begin(); pinMode(reg, OUTPUT); Serial.begin(9600); } static uint8_t digit[96] = { 0x01,0xE0, 0x02,0xEE, 0x04,0xEE, 0x08,0xEE, 0x10,0xEE, 0x20,0xEE, 0x40,0xEE, 0x80,0xE0, //Ноль 0x01,0xEF, 0x02,0xEF, 0x04,0xEF, 0x08,0xEF, 0x10,0xEF, 0x20,0xEF, 0x40,0xEF, 0x80,0xEF, //Один 0x01,0xE0, 0x02,0xEF, 0x04,0xEF, 0x08,0xE0, 0x10,0xE0, 0x20,0xFE, 0x40,0xFE, 0x80,0xE0, //Два 0x01,0xE0, 0x02,0xEF, 0x04,0xEF, 0x08,0xE0, 0x10,0xE0, 0x20,0xEF, 0x40,0xEF, 0x80,0xE0, //Три 0x01,0xEE, 0x02,0xEE, 0x04,0xEE, 0x08,0xE0, 0x10,0xE0, 0x20,0xEF, 0x40,0xEF, 0x80,0xEF, //Четыре 0x01,0xE0, 0x02,0xFE, 0x04,0xFE, 0x08,0xE0, 0x10,0xE0, 0x20,0xEF, 0x40,0xEF, 0x80,0xE0, //Пять }; void loop() { a=a+1; switch (a) { case 1:q=16; t=0; break;//1 кадр case 10000:q=q+16; t=t+16; break;//2 кадр case 20000:q=q+16; t=t+16; break;//3 кадр case 30000:q=q+16; t=t+16; break;//4 кадр case 40000:q=q+16; t=t+16; break;//5 кадр case 50000:q=q+16; t=t+16; break;//6 кадр case 60000:a=0;break;//В начало анимации } for (int i=t;i<q;i+=2){ digitalWrite(reg, LOW); SPI.transfer(digit[i+1]); SPI.transfer(digit[i]); digitalWrite(reg, HIGH); } }Здравствуйте. Подскажите как оптимизировать код:
Мне не нравится идея выполнять условия каждые N циклов, но зато не использую delay
Можно избавится от переменной q.
#include <SPI.h> enum { reg = 8 }; int t = 0; int a = 0; void setup() { SPI.begin(); pinMode(reg, OUTPUT); Serial.begin(9600); } static uint8_t digit[96] = { 0x01, 0xE0, 0x02, 0xEE, 0x04, 0xEE, 0x08, 0xEE, 0x10, 0xEE, 0x20, 0xEE, 0x40, 0xEE, 0x80, 0xE0, //Ноль 0x01, 0xEF, 0x02, 0xEF, 0x04, 0xEF, 0x08, 0xEF, 0x10, 0xEF, 0x20, 0xEF, 0x40, 0xEF, 0x80, 0xEF, //Один 0x01, 0xE0, 0x02, 0xEF, 0x04, 0xEF, 0x08, 0xE0, 0x10, 0xE0, 0x20, 0xFE, 0x40, 0xFE, 0x80, 0xE0, //Два 0x01, 0xE0, 0x02, 0xEF, 0x04, 0xEF, 0x08, 0xE0, 0x10, 0xE0, 0x20, 0xEF, 0x40, 0xEF, 0x80, 0xE0, //Три 0x01, 0xEE, 0x02, 0xEE, 0x04, 0xEE, 0x08, 0xE0, 0x10, 0xE0, 0x20, 0xEF, 0x40, 0xEF, 0x80, 0xEF, //Четыре 0x01, 0xE0, 0x02, 0xFE, 0x04, 0xFE, 0x08, 0xE0, 0x10, 0xE0, 0x20, 0xEF, 0x40, 0xEF, 0x80, 0xE0, //Пять }; void loop() { a = a + 1; switch (a) { case 1: t = 0; break; //1 кадр case 10000: t = t + 16; break; //2 кадр case 20000: t = t + 16; break; //3 кадр case 30000: t = t + 16; break; //4 кадр case 40000: t = t + 16; break; //5 кадр case 50000: t = t + 16; break; //6 кадр case 60000: a = 0; break; //В начало анимации } for (int i = 0; i < 16; i += 2) { digitalWrite(reg, LOW); SPI.transfer(digit[i + 1 + t]); SPI.transfer(digit[i + t]); digitalWrite(reg, HIGH); } }На работоспособность не проверялось.
Добрый день,
Мне не нравится идея выполнять условия каждые N циклов,
Вот этого текста я не понял. Где у Вас там что делается каждые N циклов, Вы бы поподробнее рассказали.
Зато, глянул на код ... давайте вместе посмотрим ... Переменная a у Вас описана как int. Стало быть она не бывает больше, чем 32767, а Вы в строках 80-82 чего от неё ожидаете?
но зато не использую delay
Само по себе это не говорит ни о чём. Использование или не использование того или иного инструмента обуславливается потребностями программы. Вот Вы не используете делэй, но при этом крутитесь в собственном цикле, т.е. процессорное время для других дел Вы всё равно не освободили. Так зачем было городить огород?
Добрый день
Вот этого текста я не понял. Где у Вас там что делается каждые N циклов, Вы бы поподробнее рассказали.
Зато, глянул на код ... давайте вместе посмотрим ... Переменная a у Вас описана как int. Стало быть она не бывает больше, чем 32767, а Вы в строках 80-82 чего от неё ожидаете?
Вот Вы не используете делэй, но при этом крутитесь в собственном цикле, т.е. процессорное время для других дел Вы всё равно не освободили. Так зачем было городить огород?
Цикл - это я имела ввиду a=a+1;....60000....
Ещё хотела спросить почему switch (в моем коде) после 40 000 притормаживает иногда. Про int не знала. Спасибо.
А я думала что таким образом освобождаю процессор.
Какое решение Вы посоветуете?
Этот код управляет светодиодной марицей 8*8 через два HC595
Так потому и притормаживает. 32 тысячи он съел, а потом ему надо пройти отрицательные значения.
Решения советовать незваозможно, не зная задачи целиком. Если Вашей программе нечего делать между переключениями режимов (т.е. она не оправшивает никаких датчиков, кнопок и т.п.), то ставьте delay и не парьтесь.
Если же есть есть чем заняться, то делайте переключения через миллис или прерывания таймера, как Вам проще и легче.
Спасибо. Оставлю одну ардуинку чисто для рисования на матрице, а к ней организую доступ.
#include <SPI.h> #define _STCPpin 8 int shift,str,kadr,timer,timerPrev=0; static uint8_t smail[16] = { 0xC3,0xBD,0x5A,0x7E,0x5A,0x66,0xBD,0xC3, 0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E }; static uint8_t stroka[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//строки void setup() { SPI.begin(); pinMode(_STCPpin, OUTPUT); } void loop(){ timer = millis(); if (timer-timerPrev>1000){ kadr=kadr+8; if (kadr>sizeof(smail)-8){kadr=0;} timerPrev=timer; } for (int i=kadr;i<kadr+8;i++){ digitalWrite(_STCPpin, LOW); SPI.transfer(smail[i]);//столбец SPI.transfer(stroka[str]);//строка digitalWrite(_STCPpin, HIGH); str++; if (str>7){str=0;} } }вместо вот этого
if(str>7){str=0;}добрые луди пишутьstr &= 0x7;вместо вот этого
if(str>7){str=0;}добрые луди пишутьstr &= 0x7;Не разбирался в коде ТС, но эти два выражения в общем случае не одно и тоже
вместо вот этого
if(str>7){str=0;}добрые луди пишуть
str &= 0x7;Работает, спасибо.