Съдържание:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 стъпки (със снимки)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 стъпки (със снимки)

Видео: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 стъпки (със снимки)

Видео: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 стъпки (със снимки)
Видео: Arduino & Neopixel Coke Bottle Party Light 2024, Ноември
Anonim
Image
Image

Така че синът ми Дун забелязва много готина светлинка за парти, направена от стари бутилки кока -кола и гъстата вътрешност на Glow Sticks, и пита дали можем да направим такава за предстоящите му училищни изпити, които са над Blowout PartAYYY !!! Казвам със сигурност, но не бихте ли предпочели някои от онези орнаментирани пръстени от Adafruit Neopixel, за които сме чели … Той ме гледа с празен поглед. Защото факт е, че той не знае за какво говоря, но татко е забелязал възможност да си поиграе с онези пръстени от Неопиксел, за които той е чел, и всички знаем една от 10 -те основни причини, поради които таткотата отрепки се размножават е да имат извинение да играете с готини джаджи, които казват, че всеки е за децата си.

Това е супер прост проект, който изглежда наистина страхотно. Изградихме нашите от 3 стари бутилки кокс, дървена чиния и стойка за детска площадка - неща, лежащи в мазето - комбинирани с Arduino (Леонардо в нашия случай, но всяка дъска Genuino ще свърши работа!) И три пръстена Neopixel. Поръчах 9-LED пръстен, но в крайна сметка получих 12-LED пръстен за същата цена. Което беше сладко, но означаваше преобръщане на дупките-12-те LED пръстена са широки 35 мм, за разлика от 23 мм. Какво ще ви трябва:

  • Дъска Genuino/Arduino (Използвахме Leonardo, но почти всяка дъска ще го направи)
  • 3 пръстена Neopixel (по 12 светодиода всеки): вземете ги от Adafruit и подкрепете тези добри хора
  • 1000 µf 6.3v или по -добър кондензатор
  • Резистор 300-500 ома
  • Дървена чиния или квадрат от скрап или нещо, в което можете да поставите неопикселите и да поставите бутилките с кокс на върха
  • Някаква форма на монтаж за чинията - скоба за детска площадка работи чудесно за нас
  • 9v стена брадавици
  • 40 мм отвор за отвори
  • Болтове, гайки, шайби, дистанционни елементи
  • Твърд жичен проводник
  • Поялник и спойка
  • Платка
  • Пластмасов калъф за Arduino. Можете да излезете и да купите наистина хубав идеално прилепнал пластмасов корпус, направен от милион годишен петрол, пробит от земята в някаква крехка среда и произведен от другата страна на планетата и изпратен в контейнер до склад близо до вас с всички пристанищата се изрязват в перфектно подравняване и се доставят до вратата ви с микробус, изхвърлящ въглероден диоксид в атмосферата. Или можете да направите това, което направих аз и да използвате стара изхвърлена пластмасова кутия.. в този случай кутия с помощни ленти от Мадагаскар, лежаща в аптечката … и пробийте няколко дупки в нея. Тук лекцията завършва. Нека НАПРАВИМ…

Стъпка 1: Направете основата

Направете основата
Направете основата
Направете основата
Направете основата

Можете да импровизирате базата си от боклуците, които имате в собственото си мазе, или дори просто да използвате дървена кутия или нещо, което ще скрие вашата електроника.

Първо пробихме три дупки, равномерно разположени върху дървената плоча, достатъчно големи, за да могат да седнат пръстените на Neopixel. На изображението отворите са кладенци, пробити с лопата. В крайна сметка, поради по-големия размер на 12-светодиодните пръстени, трябваше да пробием дупки с накрайник. Това означаваше да минем през цялата плоча и вместо да прибирам добре пръстените в техните фино изработени малки 2 мм дълбоки кладенци с централен отвор за чист проводник, в крайна сметка обезопасих пръстените с … хм … тиксо в долната част на чинията. Не съдете. Така или иначе не можете да видите дъното на чинията в моя дизайн. И когато е включено, е тъмно. И освен това - какво не е наред с тиксо?

Имах нужда от хлабина между плочата и скобата за макет в долната част на плочата и един компонент - кондензатора и за проводниците, които ще трябва да преминат от макет до Arduino, който планирах да поставя вътре в скобата. Затова сложих набор от импровизирани дистанционни елементи на болтовете, за да дам достатъчно свободно пространство - около 3 см, височината на дъската и малко, за да не смачкате окабеляването. Използвах два дървени анкерни болта на ъгъл, защото те бяха с правилната височина и лежаха наоколо в чекмеджето на човека … тази кутия с разхлабени винтове, болтове, пирони, ръждясали верижни връзки, съединители за маркучи, стари монети, неочаквано остри предмети и всякакви други на битове и бобове, които по магически начин могат да ви спестят пътуване до магазина за хардуер, като предлагат, ако не и точно това, от което се нуждаете, нещо, което ще се справи добре.

Щастлив инцидент около стълба на детската площадка, който намерих в мазето, беше, че вече имаше дупки, преминаващи през чинията. Няма нужда да пробивате желязо! Основата имаше четири отвора за болтове и пробихме четири дупки, затопени в дървената плоча, за да съвпадат.

След това напръскахме цялото нещо в готическо черно.

Стъпка 2: Подготовка на пръстените Neopixel

Подготовка на пръстените Neopixel
Подготовка на пръстените Neopixel

Ще трябва да запоите проводници към неопикселовите си пръстени: проводник за вход за всички тях, проводник за изход за данни за два от тях и захранване и заземяване за всеки. Каквато и дължина да смятате, че ви трябва, добавете малко. Винаги можете да отрежете излишната жица, не можете да опънете твърде къса. И имайте предвид предупреждението от Adafruit:

Когато запоявате проводници към тези пръстени, трябва да сте особено бдителни за запояването на петна и къси съединения. Разстоянието между компонентите е много ограничено! Често е най -лесно да поставите проводника отпред и да спойкате отзад.

Иска ми се да съм го прочел, преди да запоя отпред. Успях да не изгоря нито един от светодиодите ми, но изгорих ръба на един по начин, който ме накара да се изпотя, докато не го включа. Освен това, ако бях прочел доброто ръководство, щях да прочета и предупреждението да не поставям алигаторен клип върху светодиода. Нека близките ми корабокрушения да бъдат вашият фар.

Neopixel пръстени маргаритка, което означава, че можете да контролирате всичките им светодиоди едновременно от Arduino, като свържете проводник от OUT на един пръстен към IN на друг. Всеки пръстен също се нуждае от захранване и заземяващи проводници.

Стъпка 3: Окабеляване

Окабеляването
Окабеляването

Свържете го, както е описано по-горе-Пин 6 на Arduino отвежда данните към първия пръстен, Изходът от този пръстен отива към Data-in на следващия, Data-out от този отива към Въвеждане на данни за последното позвъняване. Нямате нужда от проводника за извеждане на данни на последния пръстен.

Капацитетът от 1000 µf преминава между положителните и отрицателните релси на макета. Тази капачка предпазва пръстените от скокове на захранването и се препоръчва от секцията за най-добри практики на Adafruit NeoPixel Uberguide. Резисторът на данните в първия неопиксел също се препоръчва от Adafruit-това е 1K във Fritzing, но препоръчителното съпротивление е 300-500 ома.

В моята конструкция прекарах проводниците от Neopixels през задната част на плочата до макет, фиксиран в центъра. По този начин трябва да прекарате само три дълги проводника надолу към базовото устройство: захранване, заземяване и данни. Направих тези проводници супер дълги-има много място за съхранение в основата и това прави удобно да можете да издърпате дъската за препрограмиране.

Стъпка 4: Кодът

"loading =" мързелив "спомена, че синът ми искаше музикално реагираща версия на това. До 18-ия си рожден ден трябваше да го заобиколя, но ето го!

Допълнително оборудване:

1 Еднополюсен, Двоен превключвател 1 Автоматичен микрофон за контрол на усилването (използвах MAX9184 на AdaFruit) 1 1uF-100uF кондензатор (всяка стойност)

Микрофонът наистина трябва да има автоматичен контрол на усилването, за да работи правилно. AGC непрекъснато ще взема проби от околния шум и ще повишава и намалява прага, който счита за фон, така че светлината ви ще реагира на скокове на този фон. Микрофонът на AdaFruit е брилянтен: можете да преминете от безшумна стая, в която звукът от един глас ще го задейства, до пълноценен парти режим с стая, пълна с тийнейджъри и музика, която ще прозвучи, и тя ще поеме ритъма на музиката просто глоба. Алтернативата, регулируем усилващ микрофон, има малък потенциометър на дъската, който е невъзможно деликатен и неподходящ. Не е необходима много промяна в околния звук, за да направи устройството безполезно: светлините светват постоянно или постоянно се затъмняват. AGC работи като магия.

Исках опцията да използвам вихровия тест или музика, затова свързах централния проводник на превключвател към VIN и единия проводник към щифт 4, другият към щифт 8 на Леонардо. Като тестваме тези пинове за ВИСОКИ или НИСКИ можем да разберем в какво състояние е превключвателят и съответно код на клон.

Стъпка 7: Свържете микрофона

Окабеляване на микрофона
Окабеляване на микрофона

Подайте входа за микрофон чрез този 1-100µF кондензатор в аналогов извод 0. Ако вашият кондензатор е поляризиран, изходният извод отива към положителната страна (зелен проводник).

Благодарение на CodeGirlJP за нейната рутина Trinket-Color-by-Sound, която адаптирах по-долу:

// Звуково активирани светодиоди с Arduino и NeoPixels

#включва

#define MIC_PIN A0 // Микрофонът е прикрепен към щифт a0 на Leonardo

#define LED_PIN 6 // NeoPixel LED нишка, прикрепена към пин 6 на Leonardo #define N_PIXELS 36 // брой пиксели в LED нишка !!!!!! Настройте се към броя пиксели във вашата настройка. Това е правилно за 3 пръстена Neopixel !!!!!! #define N 100 // Брой проби, които трябва да се вземат всеки път при четене Samples се нарича #define fadeDelay 5 // време на забавяне за всяка сума на избледняване #define noiseLevel 30 // ниво на наклона на среден микрофон без шум

// Инициализираме лентата NeoPixel с дефинираните стойности по -горе:

Adafruit_NeoPixel strip = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int проби [N]; // място за съхранение на пробен набор от колекции

int periodFactor = 0; // следим броя на ms за изчисляване на периода int t1 = -1; // открити времена на наклон> 100. int T; // период между времената, мащабирани до милисекунди int slope; // наклонът на две събрани данни от примерни точки байт periodChanged = 0; const int SwitchPinMusic = 4; // ПИН за позиция на превключвател чувствителност към музика const int SwitchPinSwirl = 8; // ПИН за позиция на превключвателя Тестов модел (завихряне) int MusicbuttonState = 0; // Включена изключена логическа променлива за чувствителност към музиката

// Метод за настройка на Arduino

void setup () {

strip.begin ();

ledsOff (); забавяне (500); displayColor (Колело (100)); strip.show (); забавяне (500); oddWheel (Колело (100)); strip.show (); забавяне (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Switched, FALLING);

}

// Метод на цикъла на Arduino

void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // ВИСОК, ако превключвателят е настроен на Музикална чувствителност MusicbuttonState = digitalRead (SwitchPinMusic); // ВИСОК, ако превключвателят е зададен на Тестов модел while (SwirlbuttonState == LOW) {readSamples (); // Изпълняваме рутинната семплиране на музика SwirlbuttonState = digitalRead (SwitchPinSwirl); // Проверете дали превключвателят е променен} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) {Dance (); // Изпълняваме рутинната рутинна тестова схема SwirlbuttonState = digitalRead (SwitchPinSwirl); // Проверете дали превключвателят е сменен

}

}

void Dance () {

while (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 255, 0), 50); // Зелен SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // Бял RGBW // Изпращане на кинематографско преследване в… SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (strip. Color (127, 127, 127), 50); // Бял SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (strip. Color (127, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); театърChase (strip. Color (0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); дъга (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); театърЧейзДъга (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Четене и обработка на примерни данни от Mic void readSamples () {for (int i = 0; i0) {slope = sample - проби [i -1]; } else {наклон = проби - проби [N -1]; } // Проверете дали наклонът е по -голям от noiseLevel - звук, който не е на ниво шум, открит, ако (abs (наклон)> noiseLevel) {if (наклон <0) {CalcuPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} else {ledsOff (); // театърChaseRainbow (50); } periodFactor += 1; забавяне (1); }}

void изчислява Период (int i)

{if (t1 == -1) {// t1 не е зададен t1 = i; } else {// t1 беше зададен така calc period int period = periodFactor*(i - t1); periodChanged = T == период? 0: 1; Т = период; //Serial.println(T); // нулиране на t1 на нова стойност i t1 = i; periodFactor = 0; }}

uint32_t getColor (int период)

{if (период == -1) връщане на колелото (0); иначе if (период> 400) връщане на колелото (5); else връщане на колелото (карта (-1*точка, -400, -1, 50, 255)); }

void fadeOut ()

{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); strip.show (); // Актуализиране на забавяне на лентата (fadeDelay); periodFactor += fadeDelay; }}

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Актуализиране на лентата // избледняване на цвета за for (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Актуализиране на забавяне на лентата (fadeDelay); periodFactor+= fadeDelay; }}

void ledsOff ()

{ отминава(); за (int i = 0; i

void displayColor (uint32_t цвят)

{for (int i = 0; i

void oddWheel (uint32_t цвят)

{for (int j = 0; j <256; j ++) {// цикъл на всички 256 цвята в колелото за (int q = 0; q <3; q ++) {for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, колело ((i+j) % 255)); // включваме всеки трети пиксел} strip.show ();

забавяне (1);

за (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // изключваме всеки трети пиксел}}} fadeIn (); }

// Попълнете точките една след друга с цвят

void colorWipe (uint32_t c, uint8_t чакане) {for (uint16_t i = 0; i

void rainbow (uint8_t wait) {

uint16_t i, j;

за (j = 0; j <256; j ++) {за (i = 0; i

// Малко по -различно, това прави дъгата равномерно разпределена навсякъде

void rainbowCycle (uint8_t чакане) {uint16_t i, j;

за (j = 0; j <256*5; j ++) {// 5 цикъла на всички цветове на колелото за (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); забавяне (изчакване); }}

// Лазене в театрален стил.

void theatreChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// направете 10 цикъла на преследване за (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // включваме всеки трети пиксел} strip.show ();

забавяне (изчакване);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // изключваме всеки трети пиксел}}}}

// Лазене в стил театър с ефект на дъга

void theatreChaseRainbow (uint8_t чакане) {for (int j = 0; j <256; j ++) {// цикъл на всички 256 цвята в колелото за (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, колело ((i+j) % 255)); // включваме всеки трети пиксел} strip.show ();

забавяне (изчакване);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // изключваме всеки трети пиксел}}}}

// Въведете стойност от 0 до 255, за да получите стойност на цвета.

// Цветовете са преход r - g - b - обратно към r. uint32_t Wheel (байт WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) {WheelPos -= 85; обратна лента. Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; обратна лента. Цвет (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched () {

strip.show (); readSamples (); }

Преди да бъда заклан в коментарите (помнете политиката Be Nice !!) разбрах, след като качих това колко небрежен е някои от кода ми. Няма нужда постоянно да тествате и Pin 4, и Pin 8 за HIGH. Тъй като превключвателят е еднополюсен двойно хвърляне, стойността на единия може да се изведе от другия: трябва само да тествате един. Така че можете да преминете през и да премахнете всяка препратка към четене и писане на MusicButtonState и просто да изпълните всичко по -ефективно, като тествате SwirlButtonState, ако нямате достатъчно памет или разширявате с други процедури. Но горният код работи.

И ако някой иска да коригира тези аудио процедури, за да усети не само нивата на шум, но и честотата, и да напише някакъв плавен код, който да плъзга нагоре и надолу светлинния спектър в отговор на движения по аудио спектъра, пуснете връзка в коментарите до как го направи.

Наслади се!

Препоръчано: