Идеи есть, лент пока нету, как приедут буду пробовать.
Нет.
Да.
Нужна , только руки кривые, самому не осилить
Идеи есть, лент пока нету, как приедут буду пробовать.
А ты откуда ленту заказал? Если уже заказал и если не секрет
Я видел эти ленты на aliexpress по 20$ за метр, но доставка больше 100$
Либо по ссылке в предыдущих сообщениях с adafruit но там с контроллером LPD8806 без ШИМ.
Пока приемлемых цен на комплект ленты с доставкой к сожалению не нашел
Я еще не заказал, тоже в поиске
Я гдето вычитал что LPD8806 имеет ШИМ 7 бит на цвет
Извиняюсь, дезинформировал.
По ссылке на adafruit используется контроллер LPD8806, он со встроенным ШИМ. Спутал по описанию в статье на cxem.net про светодиоды с контроллером LPD6803, который не имеет ШИМ, и про который в статье также написано будьте внимательны что возможен такой вариант при приобретении.
Сорри за невнимательность
Вот что у меня получилось с DIP корпусами. Изначально делал под односторонний текстолит с перемычками, потом нашёл кусок двухсторонний и кое что допилил.
размеры получились высота90 ширина 170(примерно)
п.с. строго не судите первый раз делал.
в планах сегодня: разведу хлорное железо, фотки выложу.
кстати как его с водой бодяжить какие пропорции? железо безводное.
и исходник с картинками в одном архиве
Desktop.rar
Последний раз редактировалось asuz; 28.11.2011 в 01:22.
появилась проблема не могу переделать скей для 42ух зон
работает всё равно 30 а остальные не хотят.
делаю вот так
Всё что жирным я поменял каналов было 30 сделал 42 и внизу было числа 6 сделал 8(чисто эксперементально)Код://нужно нужно заменить 60 на по возможности меньшее значение. //Начиная с какого-то значения, программу начнет не по-деццки глючить. //Нужно выбрать значение процентов на 10 больше, чем пороговое. Чем меньше значение, тем выше частота мигания светодиодов. #define TCNT2_Const 256-15 //256-8 #define BrightnessSize 42 //число каналов unsigned long blank=0; //таймер простоя uint8_t volatile PWM_Counter=0; uint8_t color[BrightnessSize]; int mode = 0; //Текущий цвет int currentColorR = 0; int currentColorG = 0; int currentColorB = 0; //новый цвет int nextColorR = 0; int nextColorG = 0; int nextColorB = 0; int R,G,B,switchTime; void setup() { pinMode(10, OUTPUT); //SS SPI вывод для управления защелкой pinMode(11, OUTPUT); // SPI DATA pinMode(13, OUTPUT); // SPI Clock digitalWrite(10,LOW); digitalWrite(11,LOW); digitalWrite(13,LOW); SPSR = (1<<SPI2X); // SPI set clock rate fck/2 SPCR = (1<<SPE)|(1<<MSTR); // Enable SPI, Master for (int i=0;i<BrightnessSize;i++) //обнулить массив { color[i]=0; } Serial.begin(115200); TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2 TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика TCCR2B |= (1<<CS22); //установка предделителя 64 ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора TCNT2 = TCNT2_Const; // 16000000/256/100/64=8 tcnt2=256-8=248. TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2. sei(); } void loop() { if (Serial.available() >= BrightnessSize) { if (Serial.read() == 255) //проверка прификса { for (int i = 0; i < BrightnessSize; i++) { color[i] = Serial.read(); // прочитать данные о цветах из порта в массив } blank=0; mode = 0; } } else { if (mode==0) { if(blank>50000) { blank=0; mode =1; for (byte i = 0; i < BrightnessSize; i++) color[i] = 0; } blank++; } if (mode == 1) { if(currentColorR==nextColorR && currentColorG==nextColorG && currentColorB==nextColorB) { //Генерируем новый цвет, исключая похожий на белый, иначе генерируем еще раз do { nextColorR = random(256); nextColorG = random(256); nextColorB = random(256); } while(abs(nextColorR-nextColorG)<50 && abs(nextColorR-nextColorB)<50); //Время перехода switchTime = random(10,50); //Случайно отключаем один из каналов //1,2,3 - красный, зеленый, синий соответственно. switch(random(1,9)) { case 1: nextColorR = 0; break; case 2: nextColorG = 0; break; case 3: nextColorB = 0; break; case 4: nextColorB = 0; nextColorR = 0; break; case 5: nextColorB = 0; nextColorG = 0; break; case 6: nextColorR = 0; nextColorG = 0; } } //Выясняем на каком канале увеличивать яркость, а на каком уменьшать if(nextColorR>currentColorR) R=1; else R=-1; if(nextColorG>currentColorG) G=1; else G=-1; if(nextColorB>currentColorB) B=1; else B=-1; //Переходим к нужному цвету if(currentColorR!=nextColorR){ currentColorR+=R; } if(currentColorG!=nextColorG){ currentColorG+=G; } if(currentColorB!=nextColorB){ currentColorB+=B; } for (int i=0;i<BrightnessSize;i=i+3) { color[i]=currentColorR; color[i+1]=currentColorG; color[i+2]=currentColorB; } delay(switchTime); } } } SIGNAL(TIMER2_OVF_vect) { uint8_t PWM_Counter_v=PWM_Counter; // поскольку PWM_Counter объявлена как valotile, обращение к ней - всегда обращение в память. Поэтому создаем локальную копию, она будет храниться в регистре. TCNT2 = TCNT2_Const; uint8_t i = 0; uint8_t byte_shift; uint8_t nbit; // делаем переменную для хранения сдвинутого бита, чтобы у компилятора не возникало желания каждый раз в цикле сдвигать 1 на bt бит влево byte_shift = 0; for (uint8_t bt=0; bt<8; bt++) { byte_shift = byte_shift<<1; if(color[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit i++; } SPDR = byte_shift; //отправляем в шину SPI //************************************** byte_shift = 0; for (uint8_t bt=0; bt<8; bt++) { byte_shift = byte_shift<<1; if(color[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit i++; } SPDR = byte_shift; //отправляем в шину SPI //************************************** //************************************** byte_shift = 0; for (uint8_t bt=0; bt<8; bt++) { byte_shift = byte_shift<<1; if(color[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit i++; } SPDR = byte_shift; //отправляем в шину SPI //************************************** byte_shift = 0; for (uint8_t bt=0; bt<8; bt++) { byte_shift = byte_shift<<1; if(color[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit i++; } SPDR = byte_shift; //отправляем в шину SPI //************************************** byte_shift = 0; for (uint8_t bt=0; bt<8; bt++) { byte_shift = byte_shift<<1; if(color[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit i++; } SPDR = byte_shift; //отправляем в шину SPI //************************************** PORTB |= (1<<PIN2); //формируем положительный импульс защелки PWM_Counter++; while(!(SPSR & (1<<SPIF))); // Ожидание завершения передачи данных PORTB &= ~(1<<PIN2); }
Первые 4 регистра работают нормально а 5 и 6 путают выводы. работать вроде работает но на разьёмах ерунда.
п.с. в печатке ошибка!!! как запущу всё целиком выложу подробный отчёт.
Последний раз редактировалось asuz; 28.11.2011 в 16:44.
В ранее упоминаемой мной программе появилась поддержка Ardulight.
Программа позволяет выставлять требуемое количество зон.
Если кому будет интересно, пишите!
PS Раз хоть кому-то интересно, то выкладываю
PSS Для работы с Ardulight не забудьте cнять галку "Посылать данные только при обновлении цвета" на вкладке "Отладка".
Последний раз редактировалось Eraser; 03.12.2011 в 12:42.
Спасибо :-)
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)