Официальный сайт компании Arduino по адресу arduino.cc
Ёлочная гирлянда из WS2811 и старый БП от компа
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Скоро очередной новый год. И чтобы ёлка была по волшебному красивой и дарила ощущение праздника и радость - нужна хорошая гирлянда!
Видео работы гирлянды можно посмотреть тут
Вид аппарата на данный момент:
Пару лет назад пришлось справлять этот волшебный праздник (для кого этот праздник не является волшебным/сказочным могут закрыть эту страницу и дальше не читать ;) ) с обычной китайской гирляндой из лампочек накаливания, которые от старости выцвели и светили стрёмным жёлтым цветом. И была найдена зависимость: какая гирлянда - такой и новый год.
Год назад (перед 2016 нг) заказал с китаю гирлянду в 100 диодов с чипами ws2811, Ехала долго, думал не успеет, но мне повезло - гирлянда приехала до нового года. Побыстрому отрыл старый БП от компа ватт на 250, выдрал лишние провода и заменил вспухшие кондёры, почистил естественно и перепаял 80 вентилятор с 12в на 5в чтоб меньше жужжал, предварительно смазав его литолом. Впихал туда нану, кнопочки, крутилочки... Мегает! ))
Ёлка у меня искуственная но высокая и пышная, прикинул по вышине - 25 диодов получилось в самый раз, поэтому кирлянда была распилина на 4 куска по 25 диодов. (позже я добавил ещё 4 таких куска, но об этом позже)
Одна крутилка регулирует яркость гирлянды, вторая скорость еффектов, третья будет менять скорость смены цвета в радуге, ну или ещё чего на неё повешать - незнаю.
Кнопка из 3х задействована одна. Она переключает эффекты и записывает в ЕЕПРОМ, для того, чтобы при включении показывался ранее выбраный эффект. На две другие пока думаю чего навешать. можно например ночной режим - яркость на минимум, скорость на минимум, эффект радуга. Или можно определённые, самые любимые эффекты на них повешать.
Из эффектов пока 6 штук из библтотеки FastLED и ещё несколько самопальных :) В том числе "снегопад"
Зачем запихал в такую большую коробку? Потому что старых БП от компа у меня много :) . И сейчас будут подключаться 100 диодов (4 обрезка по 25шт) это на полной яркости белого цвета почти 6А, К следующему новому году наверно добавлю ещё 4 таких обрезка, будет уже 12А. Тот БП что я использовал выдаёт 18А по 5в линии, тоесть ещё запас на 4 обрезка по 25 диодов останется.
А теперь как я туда чего запихивал, высверливал и протачивал...
Нашёл свободное место, подальше от высокочастотных и силовых узлов (разъём 220 не в счет :) )
К тому же будет доступ к USB разъёму.
Для органов управления так же найдено место, подальше от всего опасного...
Сверлить тонкую жестянку, так чтобы было аккуратно - неочень получается (позже принаровился - подставляя разделочную доску)
Паяем выходы, те что пойдут на гирлянды. Для безопасности делаем это через резистор. Советуют 470ом, но у меня были в наличии на 330, сойдёт...
Распаял кнопки и переменники. Кнопки замыкают на массу и используется внутренняя подтяжка к плюсу, поэтому лишних резисторов не ставим. Все переменники подключены одним концом на массу, другим все в кучу, кондёрами (100мкф и 0.1мкф) на массу и через 200 ом резистор (ну вдруг там чего замкнёт) на +5в. Ползунки переменников идут в ардуино.
Подаём питание... И поскольку очень много говорят про всякие там помехи, фильтры - поставил пару кондёров (100мкф и 0.1мкф) Не потому что я чегото там просчитал, а просто у меня есть кондёры только 100мкф и 0.1мкф :D
Всё паялось обычным 40вт паялом, без всякого заземления со вставленой в панель ардуиной и как ни странно, всё работает :)
Был написан скетч по быстрому на базе библиотеки FastLED и весело отпразднован новый год. После чего, гирлянда вместе с ёлкой были упрятаны в коробку и отправлены в дальний угол ожидать следующего нового года.
И вот "на горизонте" обозначился очередной 2017 новый год. заказана и уже доставлена ещё одна гирлянда из 100 диодов с чипами WS2811 (правда у другого продавца. у предыдущего в наличии их не оказалось). Досталась прошлогодняя гирлянда и работы продолжились...
Было решено заменить самопальные разъёмы на нормальные типа "Джек". Был так же докуплен провод и термоусадка.
Выбрано место, куда бы эти 8 джеков влезли - единственным местом оказалось пространство над высоковольтной частью блока питания. Боимся, но делаем...
Готово! Теперь надо паять к ним провода...
В прошлом году гирлянд было 4, распаял на 6, но в задумке было 8, поэтому допаиваем недостающие 2 провода с резисторами.
И припаиваем это всё к джекам, не забывая надевать термоусадки (я на плюс забыл одеть)...
Вычитал также что надо конденсатор ближе к гирляндам поставить, под руку попался 1000мкф х 25в. Паяю его прямо к джекам.
Чтоб провода не лезли к вентелятору и высоковольтной части БП - фиксирую их бумажным скотчем и для верности - клеющим пистолетом.
Собираем корпус
Припаивал провода метра по полтора от джека до куска гирлянды, закрывая все стыки термоусадкой
Чтоб было за что вешать гирлянду на ёлку (или ещё куда нибудь) из больших концелярских скрепок сделал крючки, а из оставшихся проводов-хвостиков сделал петельки, куда и вставил скрепки
Подошло время для скетча... Первая версия была переработана, инициализация лент была запихана в массив, вызов эффектов был переделан под использование этого массива, что дало возможность делать горизонтальные эффекты. Сделал 1-2 эффекта простых (между лентами) и после нескольких дней обдумывания изобретён эффект "снегопад". Если бы вместо гирлянд были ленты с высокой плотностью диодов, то эффект можно было назвать "капающие сосульки", а на гирлянде только "снегопад" :) Для меня версия скетча "v2 рабочая", вам нужно егорассматривать как "преальфа" :)
Библиотеку FastLED качаем здесь
#include <EEPROM.h> #include "FastLED.h" const int bright_rezistor_pin = A7; // Резистор регулировки яркости (10к) const int rainbowspeed_rezistor_pin = A6; // Резистор регулировки скорости смены цвета в радуге (10к) const int fps_rezistor_pin = A5; // Общая скорость эффектов (кадров в секунду) (10к) const int btn_changeeffect_pin = 2; // Кнопка смены эффектов const int btn_2_pin = 3; // Резерв const int btn_3_pin = 4; // Резерв int bright_rezistor = 400; // Стартовое значение резистора яркости int fps_rezistor = 400; // Стартовое значение резистора скорости еффектов (fps) int btn_changeeffect_flag = 0; int btn_changeeffect_state = HIGH; int last_btn_changeeffect_state = HIGH; long last_btn_changeeffect_debounce_time = 0; const int debounceDelay = 80; byte current_effect = 0; const int eeprom_addr = 4; int pos1 = 0; int color_x = 0; FASTLED_USING_NAMESPACE #if FASTLED_VERSION < 3001000 #error "Requires FastLED 3.1 or later; check github for latest code." #endif #define DATA_PIN_1 5 // Определяем пин для ленты #1 #define DATA_PIN_2 6 // Определяем пин для ленты #2 #define DATA_PIN_3 7 // Определяем пин для ленты #3 #define DATA_PIN_4 8 // Определяем пин для ленты #4 #define DATA_PIN_5 9 // Определяем пин для ленты #5 #define DATA_PIN_6 10 // Определяем пин для ленты #6 #define DATA_PIN_7 11 // Определяем пин для ленты #7 #define DATA_PIN_8 12 // Определяем пин для ленты #8 #define LED_TYPE WS2811 #define COLOR_ORDER RGB #define NUM_LEDS 25 #define NUM_STRIPS 8 CRGB leds[NUM_STRIPS][NUM_LEDS]; #define BRIGHTNESS 150 // Стартовое значение яркости #define FRAMES_PER_SECOND 1 // Стартовое значение скорости эффектов void setup() { Serial.begin(9600); // Для отладки pinMode(bright_rezistor_pin, INPUT); pinMode(rainbowspeed_rezistor_pin, INPUT); pinMode(fps_rezistor_pin, INPUT); pinMode(btn_changeeffect_pin, INPUT); digitalWrite(btn_changeeffect_pin, HIGH); // Используем встроенную верхнюю подтяжку pinMode(btn_2_pin, INPUT); digitalWrite(btn_2_pin, HIGH); // Используем встроенную верхнюю подтяжку pinMode(btn_3_pin, INPUT); digitalWrite(btn_3_pin, HIGH); // Используем встроенную верхнюю подтяжку delay(1000); // 3 second delay for recovery // tell FastLED about the LED strip configuration FastLED.addLeds<LED_TYPE,DATA_PIN_1,COLOR_ORDER>(leds[0], NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.addLeds<LED_TYPE,DATA_PIN_2,COLOR_ORDER>(leds[1], NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.addLeds<LED_TYPE,DATA_PIN_3,COLOR_ORDER>(leds[2], NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.addLeds<LED_TYPE,DATA_PIN_4,COLOR_ORDER>(leds[3], NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.addLeds<LED_TYPE,DATA_PIN_5,COLOR_ORDER>(leds[4], NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.addLeds<LED_TYPE,DATA_PIN_6,COLOR_ORDER>(leds[5], NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.addLeds<LED_TYPE,DATA_PIN_7,COLOR_ORDER>(leds[6], NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.addLeds<LED_TYPE,DATA_PIN_8,COLOR_ORDER>(leds[7], NUM_LEDS).setCorrection(TypicalLEDStrip); // set master brightness control FastLED.setBrightness(BRIGHTNESS); current_effect = EEPROM.read(eeprom_addr); } // List of patterns to cycle through. Each is defined as a separate function below. typedef void (*SimplePatternList[])(); SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm, horizont_2, snow_2 }; uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current uint8_t gHue = 0; // rotating "base color" used by many of the patterns void loop() { bright_rezistor = map(analogRead(bright_rezistor_pin), 0, 985 ,10 ,255); fps_rezistor = map(analogRead(fps_rezistor_pin), 0, 985 ,5 ,255); // Городим жуткую защиту от дребезга для кнопки переключения эффектов... int btn_changeeffect_reading = digitalRead(btn_changeeffect_pin); if(btn_changeeffect_reading != last_btn_changeeffect_state){ last_btn_changeeffect_debounce_time = millis(); } if((millis() - last_btn_changeeffect_debounce_time) > debounceDelay) { if(btn_changeeffect_reading != btn_changeeffect_state) { btn_changeeffect_state = btn_changeeffect_reading; if(btn_changeeffect_state == LOW && btn_changeeffect_flag == 0){ // Если кнопка нажата... current_effect ++; // Увиличиваем номер эффекта EEPROM.write(eeprom_addr, current_effect); // Записываем номер эффекта в ЭСППЗУ btn_changeeffect_flag = 1; if(current_effect > 9){ // Если номер эффекта превышает существующее current_effect = 0; // то отсчет начинается с нуля } } if(btn_changeeffect_state == HIGH && btn_changeeffect_flag == 1){ btn_changeeffect_flag = 0; } } } last_btn_changeeffect_state = btn_changeeffect_reading; FastLED.setBrightness(bright_rezistor); //Serial.println(current_effect); //delay(1); if(current_effect == 0){ EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically gPatterns[gCurrentPatternNumber](); } if(current_effect == 1){ rainbow(); } if(current_effect == 2){ rainbowWithGlitter(); } if(current_effect == 3){ confetti(); } if(current_effect == 4){ sinelon(); } if(current_effect == 5){ juggle(); } if(current_effect == 6){ bpm(); } if(current_effect == 7){ horizont_2(); } if(current_effect == 8){ snow_1(); } if(current_effect == 9){ snow_2(); } // send the 'leds' array out to the actual LED strip FastLED.show(); // insert a delay to keep the framerate modest FastLED.delay(1000/fps_rezistor); // do some periodic updates EVERY_N_MILLISECONDS( 1 ) { gHue++; } // slowly cycle the "base color" through the rainbow } #define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) void nextPattern() { // add one to the current pattern number, and wrap around at the end gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns); } void rainbow(){ // FastLED's built-in rainbow generator for(int i=0; i < NUM_STRIPS; i++){ fill_rainbow( leds[i], NUM_LEDS, gHue, 7); } } void rainbowWithGlitter(){ // built-in FastLED rainbow, plus some random sparkly glitter rainbow(); addGlitter(80); } void addGlitter( fract8 chanceOfGlitter){ if( random8() < chanceOfGlitter) { for(int i=0; i < NUM_STRIPS; i++){ leds[i][ random16(NUM_LEDS) ] += CRGB::White; } } } void confetti(){ // random colored speckles that blink in and fade smoothly for(int i=0; i < NUM_STRIPS; i++){ fadeToBlackBy( leds[i], NUM_LEDS, 10); } int pos = random16(NUM_LEDS); for(int i=0; i < NUM_STRIPS; i++){ leds[i][pos] += CHSV( gHue + random8(64), 200, 255); } } void sinelon(){ // a colored dot sweeping back and forth, with fading trails for(int i=0; i < NUM_STRIPS; i++){ fadeToBlackBy( leds[i], NUM_LEDS, 20); } int pos = beatsin16(13,0,NUM_LEDS); for(int i=0; i < NUM_STRIPS; i++){ leds[i][pos] += CHSV( gHue, 255, 192); } } void bpm(){ // colored stripes pulsing at a defined Beats-Per-Minute (BPM) uint8_t BeatsPerMinute = 62; CRGBPalette16 palette = PartyColors_p; uint8_t beat = beatsin8( BeatsPerMinute, 64, 255); for( int ii = 0; ii < NUM_LEDS; ii++) { //9948 for(int i=0; i < NUM_STRIPS; i++){ leds[i][ii] = ColorFromPalette(palette, gHue+(ii*2), beat-gHue+(ii*10)); } } } void juggle(){ // eight colored dots, weaving in and out of sync with each other for(int i=0; i < NUM_STRIPS; i++){ fadeToBlackBy( leds[i], NUM_LEDS, 20); } byte dothue = 0; for( int ii = 0; ii < 8; ii++) { for(int i=0; i < NUM_STRIPS; i++){ leds[i][beatsin16(ii+7,0,NUM_LEDS)] |= CHSV(dothue, 200, 255); } dothue += 32; } } void horizont_2(){ for(int i=0; i < NUM_STRIPS; i++){ fadeToBlackBy( leds[i], NUM_LEDS, 100); } if(pos1 > NUM_STRIPS-1) {pos1 = 0; color_x = color_x+1;} if(color_x > 3) color_x = 0; CRGB color[] = {CRGB(255, 0, 0), CRGB(0, 255, 0), CRGB(0, 0, 255), CRGB(255, 255, 255), CRGB(255, 0, 255), CRGB(0, 255, 255), CRGB(255, 255, 0), CRGB(255, 150, 150)}; for (int i=0; i <= NUM_LEDS-1; i++){ leds[pos1][i] = color[color_x]; } pos1 = pos1+1; } void horizont_3(){ for(int i=0; i < NUM_STRIPS; i++){ fadeToBlackBy( leds[i], NUM_LEDS, 100); } if(pos1 > NUM_STRIPS-1) pos1 = 0; for (int i=0; i <= NUM_LEDS-1; i++){ leds[pos1][i] = CHSV( gHue, 255, 192); } pos1 = pos1+1; } void snow_1(){ if(pos1 > NUM_LEDS*2-1) pos1 = 0; for(int i=0; i < NUM_STRIPS; i++){ fadeToBlackBy( leds[i], NUM_LEDS, 50); } for(int i=0; i < NUM_STRIPS; i++){ leds[i][NUM_LEDS-pos1/2-1] = CRGB(255, 255, 255); } pos1 = pos1+1; } struct snow_line{ // объявляем структуру для ленты снега byte pos; long end_time; int start_delay; } type; snow_line snow_2_vars[NUM_STRIPS]; void snow_2(){ for(int i=0; i < NUM_STRIPS; i++){ fadeToBlackBy( leds[i], NUM_LEDS, 40); } for(byte i=0; i < NUM_STRIPS; i++){ if(snow_2_vars[i].pos > NUM_LEDS*2-1){ // Если дошли до конца ленты то... snow_2_vars[i].pos = 0; // Сбрасываем позицию на ноль snow_2_vars[i].end_time = millis(); // Записываем время окончания эффекта } if(snow_2_vars[i].pos == 0){ // Если задана нулевая позиция - значит начало, то... snow_2_vars[i].start_delay = random(10, 3000); // Генерируем врменную задержку запуска эффекта (до 3х секунд) } if(millis() > snow_2_vars[i].end_time+snow_2_vars[i].start_delay){ // Если вышла задержка перед запуском эффекта, запускаем... leds[i][NUM_LEDS-snow_2_vars[i].pos/2-1] = CRGB(255, 255, 200); snow_2_vars[i].pos++; } } }
Если чего в голову до нового года придёт и время будет - код подчищу, может эффект какой добавлю. Если нет - и так сойдёт.
Если не считать скетч, то остаётся обклеить БП винилом или покрасить в более ёлочно-новогодние цвета, прикрыть дыру, где торчит ардуина и готово.
Если кто будет чикать гирлянду как я пополам - у гирлянды есть вход и выход. Тоесть есть разница куда подавать сигнал. Нельзя просто взять и перевернуть гирлянду.
Питается всё от 5 вольт. Слышал про 12 вольтовые подобные гирлянды, но сам не видел, может врут :)
Ещё пару слов о железе и библиотеке: Новая версия библиотеки умеет работать с ESP8266, учитывая что сервис RemoteXY сейчас стал бесплатным до 5 элементов (кто незнает что это такое - погуглите) то вполне можно было бы спаять и на ней, управляя со смартфона, но там я нашёл только 7 GPIO с которыми работает библиотека, а мне нужно было 8. В принципе гирлянду можно было не разрезать, управлять по одному проводу всеми 200 диодами, но нужно было бы чтото решать с питанием (если зажеч эту гирлянду со 100 диодами белым и на полной яркости, подать с одной стороны 5в, то до последнего светодиода дойдёт только 2.5в) Да и управлять неразрывной гирляндой лично для меня было бы значительно путанней :)
Начинал я описывать гирлянду в этой ветке но решил сделать отдельной темой. Если кто умеет затирать сообщения - там можно удалить :)
может эффект какой добавлю
На восьми параллельных гирляндах можно бегущую строку написась ("С Новым годом!" например).
https://yadi.sk/i/KjPlzioNjskYL
В моей гирлянде всего 25 диодов на полосу и расстояние между ними 7см, к тому же висеть будут на ёлке, получается трапеция, даже треугольник. Бегущая строка в таком виде будет выглядеть не так симпатично :) Хотя написать число 2017 я всё же попробую, когда на ёлку повешаю.
Посмотрите еще https://github.com/nicoyn/YALO-PureArduino
и https://github.com/atuline/FastLED-Demos
Я делал грилянду на елку в итоге в ней сейчас: два эфекта светомузыки и прикрутил туда 10-ок спецэфектов без участия микрофона.
Алгоритмы скопированы из выше приведеных ссылок, адаптировал немного их, что бы сдружить друг с другом (упровление всем осуществляется через потенциометр).
Больше всего мне нравится YALO.
Если интересно, покажу свой скетч. Только это мой первый проект доведеный до конца, поэтому не думаю, что он представляет что-то ценое из себя.
Хорошая гирлянда получилась. Побольше интересных эфектов бы, будет класс! Где то видел такой, называется "салют", например горит вся гирлянда жолтым цветом и втечении 3-5 секунд угосает примерно на 50% затем с низу к макушке летят например красного цвета как у тебя эфект "снегопад" только не вниз , а к верху. на макушке первый ряд мигает часто 3 раза и по ряду падает в низ наполнением как заполнится вся елка красным цветом она угасает на 50% и все заново.
Попрубуй на елке выглядело красиво .
прислали и мне гирлянду к жалко новый год кончился.
залил я код в ардуино, а гирянды не горя т воооще
позвольте спросить, Focus, я не подключал резисторы и кнопки к ардуино поэтому у меня нечего не мигает ???
залил я код в ардуино, а гирянды не горя т воооще
Примеры из библиотеки FastLED пробывали?
Еще важно какой стороной грилянду цепляете к контролеру, попробуйте поменять.
кнопку смены эффектов надо хотябы 1 раз нажать, да и в процессе эксплуатации при включении иногда бывает не стартует пока на кнопку смены эффектов не нажмёш. видимо с еепрома читает чтото левое иногда.
На счёт перевернуть - если наоборот подать, да ещё без резистора, ws2811 выживет?
А так да, на примерах библиотеки FastLED надо попробовать, работает ли вообще гирлянда, ws2811 там?
На счёт перевернуть - если наоборот подать, да ещё без резистора, ws2811 выживет?
Теорию не знаю, но у меня выжила. Я вначале собирал по схеме найденой в интернете без резистров и подключил грилянду не той стороной (там же стороны не различимы), она просто не зажглась. Схема была с mysku.ru, там же в комментарии прочитал что если перепутать сторону грильянды, тогда она не горит.
да библиотеку конечно подключаю
заливаю код от http://www.getchip.net/posts/117-12-ti-kanalnyjj-meteor-na-svetodiodnykh-lentakh-ws2812b-arduino/ метеора все гирлянды мегают как положено только ваш код не мигает
прислали и мне гирлянду к жалко новый год кончился.
залил я код в ардуино, а гирянды не горя т воооще
позвольте спросить, Focus, я не подключал резисторы и кнопки к ардуино поэтому у меня нечего не мигает ???
я имел ввиду переменные резисторы на 10 кОм. а на упровляющий контакт гирлянд я прицепил 470 Ом на каждую
да библиотеку конечно подключаю
по вашей ссылке WS2812b, код немного отличается от WS2811 (строка 038). У вас какой чип в грилянде?
[/quote]
Примеры из библиотеки FastLED пробывали?
[/quote]
сейчас попробывал пример из библиотеки FastLED пример ColorPalette РАБОТАЕТ
да библиотеку конечно подключаю
заливаю код от http://www.getchip.net/posts/117-12-ti-kanalnyjj-meteor-na-svetodiodnykh-lentakh-ws2812b-arduino/ метеора все гирлянды мегают как положено только ваш код не мигает
Ну тогда надо кнопку эффектов понажимать или прописать номер эффекта в скетче
вместо current_effect = EEPROM.read(eeprom_addr);
прописать current_effect = 1; например
вместо
bright_rezistor = map(analogRead(bright_rezistor_pin), 0, 985 ,10 ,255);
fps_rezistor = map(analogRead(fps_rezistor_pin), 0, 985 ,5 ,255);
прописать:
bright_rezistor = 255;
fps_rezistor = 100;
это яркость и скорость.
И да - какой чип у ленты?
[/quote]
У вас какой чип в грилянде?
[/quote]
не знаю вот такую покупл проводками соединил https://ru.aliexpress.com/item/100x-WS2812B-LED-With-Heatsink-10mm-3mm-DC5V-5050-SMD-RGB-WS2811-IC-Built-in/32378187271.html?spm=2114.13010608.0.0.9JmtAY
заменяйте это #define LED_TYPE WS2811
на это #define LED_TYPE WS2812B
хотя не понятно что там за чип вроде как 2812B, а вроде как обычный ргб диод, а под ним 2811
В примере из библиотеки FastLED какой чип ставили? такой же и тут ставте. Ну и раз нет резисторов и кнопок - то замены сделайте, которые я выше привёл.
спасибо большое , что ответили на мой вопрос
все что посоветовали попробую и отпишусь чуть попозже
уроки застовляют учить
УРА заработало УРА УРА !!!!!!!!!!!!!!!!!!!!!!!!!!
СПАСИБО ОГРОМНОЕ, ЧТО МОГЛИ НАСТРОИТЬ КОД
я заменил, как ВЫ посоветовали, 75 строчку
current_effect = EEPROM.read(eeprom_addr); на
current_effect = 0;
и все заработало ОГРОМНОЕ СПАСИБО !!!
я придумал новый эфект, но вставить его в код не получаетя, помогите .
точне если я стираю ниже void horizont_3() и вставляю свой эфект то все работае.
и напишите какие строчки поменяли желательно с коментариями.
и еще один вопрос
вот еще эффект получился из вашего неплохой void circular() { for (int i = 0; i < NUM_STRIPS; i++) { fadeToBlackBy( leds[i], NUM_LEDS, 100); } if (pos1 > NUM_LEDS - 1) { pos1 = 0; color_x = color_x + 1; } if (color_x > 3) color_x = 0; CRGB color[] = {CRGB(255, 0, 0), CRGB(0, 255, 0), CRGB(0, 0, 255), CRGB(255, 255, 255), CRGB(255, 0, 255), CRGB(0, 255, 255), CRGB(255, 255, 0), CRGB(255, 150, 150) }; for (int i = 0; i <= NUM_STRIPS - 1; i++) { leds[i][pos1] = color[color_x]; delay(60); FastLED.show(); } pos1 = pos1 + 1; }
Чтоб добавить эффект:
1. добавляем свой эффект гденибудь внизу
void
circular() {...}
2. найти
и поменять 9 на 10 (ну или 11 или 12, в зависимости сколько у вас эффектов)
3. найти этот код
И добавить туда свой эффект (эффекты)
Вроде ничего не забыл.
Да, затухание. меняя цифру - затухать будет за меньшее количество "кадров" или за большее. Как расчитать? Методом тыка! :D Ну я лично так делал )
окЕЙ воткнул за мигали !!!!!!!!! Спасибо большое!!
про затухание примерно так и думал.
сейчас делаю другой эффект нужен счетчик который досчила бы до 8 и обнулился
и снова считал как в бейсике я нашeл For i=0 To 8 Step 1 а ардуине не найду
подскажите
mmm... Basic, Spectrum - ностальгия ))
Дык вот выше, где я про затухание писал и есть цикл
про циклы читат тут
ну ни как нехотят светики бежать в сторону правильно
посмотрите пожалуста опытным глазом, где ошибка, куда копать, в какую сторону глядеть???
Может так: void Zuid_West(. (. ) :D
А по делу...
Цикл всего эффекта не должен выполняться за одно выполнение функции, за одно выполнение функции должен рисоваться всего 1 кадр. Следующее выполнение функции должно рисовать следующий кадр и т.д.
переменную pos1 я использовал типа как глобальную, тоесть видную за функцией и внутри функции и хранил в ней чтото типа номера кадра и обнулял в основном только когда цикл эффекта закончился и нужно начинать заного.
У вас помоему функция за раз зажигает диоды и при следующих обращениях к функции зажигает теже самые диоды, тоесть вообще ничего не мигает, загорелось и горит.
И delay() в функции эффекта использовать нельзя, для этого (вне функции эффекта) есть FastLED.delay(1000/fps_rezistor); Если без резистора, то просто указывается FastLED.delay(700) например.
это что то вообще страшное, даже не скомпилируется наверно. в отдельном скетче опробуйте свои цыклы с выводом в сериал например.
вот например первый цикл что делает: будет крутиться, пока pos1 не станет больше NUM_STRIPS - 1.
к самой pos1 мы ничего не добавляем не убавляем, а только записываем в неё ноль в теле цикла, значит pos1 никогда не станет больше NUM_STRIPS - 1
тут я показал пример цикла for http://arduino.ru/forum/proekty/elochnaya-girlyanda-iz-ws2811-i-staryi-bp-ot-kompa#comment-256417
там задаётся +1 к переменной цикла.
Даже если бы у вас с циклами было всё в порядке и в теле цикла мы бы не обнуляли pos1,х и у всё равно ничего бы путногоне вышло, потому что цикл пробежал и после него в переменной останется только последнее значение.... и т.д.
Короче весь этот код это одна большая ошибка. пробуйте циклы в отдельном скетче, без всяких светодиодов и библиотек, выводите в сериал значения переменных и т.д.
а почему вы взяли за основу именно эту библидтеку
в этой Adafruit_NeoPixel красивее эффекты
Что то мне в ней не понравилось. Толи весит много и не остаётся места для фантазии :) Толи конфликтует с RemoteXY, толи ещё чего - не помню.
Угу. Удаленное уаравление тяжело совмещать с ws281х, особенно на длинных лентах. Цикл вывода в ленту нельзя прерывать, а сигнал может прийти в любой момент, и его пропускать тоже нельзя. Приходится изголятся.
Удаленное уаравление тяжело совмещать с ws281х, особенно на длинных лентах.
Для вывода на ленту с 500 диодами требуется 15 мс. С кнопками при этом управление получается, а вот сигналы с пультов могут быть пропущены.
Именно так. Даже для 30 диодов на ленте уже проблема. У ИК длителность бита порядка 1мсек. Я делаю так - как можна чаще мониторю состояние приемника, и если обнаружу активность - забиваю на ленту и принимаю ИК. Работает, но есть забавное побочное - при нажатии на чужом пульте, например ТВ, лента замирает на мгновение, прислушмвается не к ей ли это :)
если я на один выход ардуино повешу все 8 лент это плохо , он сгорит?
нет, но эффекты все надо будет переделывать, совсем переделывать )
я имел ввиду код в ардуино записать который привел выше с этой библиотекой Adafruit_NeoPixel
значит ничего страшного с pin 6 неслучится?
Мне понравился ваш скетч приведенный для примера!Подскажите как его закольцевать чтобы он повторялся бесконечно(я в программировнии не силен только учусь)
Добрый день, а моно на основе Вашего проекта сделать просто гирлянду одну нв 100-300 светодиодов типа гирлянды ws2812 в наличии имею 4 гирлянды по 50 штук светодиодов в гирлянде на гибких проводах тип гирлянды приведён ниже
Светодиодный WS 2812B чип модуль 50 шт./лот предварительно спаяны WS2812B радиатор 5 В 5050 RGB WS2811 IC встроенный IC и 12 см подключения провода адресный
попробовал запустить от пи№5 на ардуино уно- пошла работа и изменил некоторые значения
извиняюсь за такое самовольство, но просто решил попробовать и надеюсь на Вашу помощь...
Привет форумчане.
Не буду выкидывать весь код, но вопрос по эффектам такой:
Переключение происходит так
switch(var){ // var меняется по нажатию кнопки
case 1: LED1(); break;
...
}
сам эффект такой
void LED1() // последовательное заполнение цветом всей ленты и затем выключение в обратном порядке
{
for(int i = 0; i < LED_NUM; i++) // NUM_LED кол-во пикселей в ленте
{
pixel.setPixelColor(i, 250, 0, 0);
pixel.show();
}
for(int i = LED_NUM; i < 0; i--)
{
pixel.setPixelColor(i, 0, 0, 0);
pixel.show();
}
}
так вот переключение эффекта на следующий работает только по окончании предыдущего т.е. пока функция LED1() не дойдет до конца (все диоды выкл) var не увеличивается.
Тут же в теме прочитал что за одно выполнение цикла эффекта должен рисоваться один кадр. Вроде так и происходит.
Дайте совет в какую сторону курить?