Përmbajtje:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 hapa (me fotografi)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 hapa (me fotografi)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 hapa (me fotografi)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 hapa (me fotografi)
Video: Arduino & Neopixel Coke Bottle Party Light 2024, Dhjetor
Anonim
Image
Image

Kështu që djali im Doon vëren një dritë feste shumë të lezetshme të bërë nga shishe koka të vjetra dhe pjesët e brendshme të Glow Sticks, dhe pyet nëse mund të bëjmë një për Provimet e tij të ardhshme të Shkollës janë mbi shpërthimin PartAYYY !!! Unë e them me siguri, por a nuk do të kishit më mirë të kishit disa prej atyre Unazave të errëta Adafruit Neopixel për të cilat kemi lexuar… Ai më jep një vështrim bosh. Sepse fakti që ai nuk e di se për çfarë po flas, por babai ka parë një mundësi për të luajtur me ato unaza Neopixel që ai ka lexuar, dhe ne të gjithë e dimë një nga 10 arsyet kryesore që baballarët geek lindin është të kenë një justifikim për të luajtur me vegla të lezetshme që u thonë të gjithëve se janë për fëmijët e tyre.

Ky është një projekt super i thjeshtë që duket vërtet i mrekullueshëm. Ne ndërtuam tonat prej 3 shisheve të vjetra të koksit, një pjatë druri dhe një kllapa për shesh lojërash - gjëra të shtrira përreth në bodrum - të kombinuara me një Arduino (Leonardo në rastin tonë, por çdo bord Genuino do të bëjë!) Dhe tre unaza Neopixel Me Unë porosita një unazë 9-LED, por përfundova me një unazë 12-LED për të njëjtin çmim. E cila ishte e ëmbël, por nënkuptonte një tejkalim në vrimat e puseve-unazat 12-LED janë 35 mm të gjera, në krahasim me 23 mm. Çfarë do t'ju duhet:

  • Bordi Genuino/Arduino (Ne përdorëm një Leonardo, por pothuajse çdo bord do ta bëjë)
  • 3 unaza Neopixel (12 LED secila): merrni ato nga Adafruit dhe mbështesni ata njerëz të mirë
  • Kondensator 1000 μf 6.3v ose më mirë
  • Rezistencë 300-500 Ohm
  • Një pjatë prej druri, ose një shesh druri të plehrave, ose çdo gjë në të cilën mund të vendosni neopixelët dhe ulni shishet e koksit sipër
  • Një formë e montimit për pjatën - një kllapa e këndit të lojërave funksionoi shkëlqyeshëm për ne
  • Lyth muri 9v
  • Gropë vrima 40 mm
  • Bulona, arra, rondele, ndarës
  • Teli me bërthamë të fortë
  • Një hekur bashkues dhe lidhës
  • Breadboard
  • Një kuti plastike për Arduino. Ju mund të dilni dhe të blini një kuti plastike vërtet të bukur, të bërë nga nafta miliona vjeçare e shpuar nga toka në një mjedis të brishtë dhe e prodhuar në anën tjetër të planetit dhe e dërguar në një enë në një magazinë pranë jush me të gjitha portet e prera në një shtrirje të përsosur dhe e dërgojnë atë te dera juaj nga një furgon që hedh dioksid karboni në atmosferë. Ose mund të bëni atë që bëra unë dhe të përdorni një kuti të vjetër plastike të hedhur.. në këtë rast një kuti ndihme në brezin Madagaskar të shtrirë në kabinetin e ilaçeve … dhe të shponi disa vrima në të. Këtu përfundon ligjërata. Le ta bejme…

Hapi 1: Bëni Bazën

Bëni Bazën
Bëni Bazën
Bëni Bazën
Bëni Bazën

Ju mund të improvizoni bazën tuaj nga çfarëdo hedhurinë që keni në bodrumin tuaj, ose madje thjesht të përdorni një kuti druri ose ndonjë gjë që do të fshehë pajisjet tuaja elektronike.

Së pari ne shpuam tre vrima, të vendosura në mënyrë të barabartë në pllakën prej druri, mjaft të mëdha sa të ulen unazat Neopixel. Në imazh vrimat janë puse të shpuara me një stërvitje me lopatë. Në fund, për shkak të madhësisë më të madhe të unazave 12-LED, na u desh të shponim vrima me një gropë më të madhe. Kjo do të thoshte të kaloja deri në pjatë, dhe në vend që të mbërtheja unazat bukur në puset e tyre të punuara mirë 2 mm të thellë me një vrimë qendrore për një tel të pastër, përfundova duke siguruar unazat me… ahem… Shirit ngjitës në pjesën e poshtme të pjatës. Mos gjykoni. Ju nuk mund ta shihni pjesën e poshtme të pjatës në modelin tim gjithsesi. Dhe është errësirë kur është ndezur. Dhe përveç kësaj - çfarë nuk shkon me shirit ngjitës?

Më duhej hapësirë midis pjatës dhe kllapës për një dërrasë buke në pjesën e poshtme të pjatës dhe një përbërës - kondensatorin, dhe për telat që do të duhej të kalonin nga dërrasa e bukës në Arduino, të cilën kam planifikuar ta vendos brenda kllapës. Kështu që unë vendos një grup ndarësish të improvizuar në boshtet e bulonave për të dhënë hapësirë të mjaftueshme - rreth 3 cm, lartësia e dërrasës së bukës dhe pak, në mënyrë që të mos shtypni instalimet elektrike. Kam përdorur dy bulona spirancë prej druri për cep, sepse ato ishin në lartësinë e duhur dhe të shtrirë në sirtarin e burrit … atë kuti me vida të lira, bulona, gozhdë, lidhëse zinxhirësh të ndryshkur, lidhëse të zorrës, monedha të vjetra, objekte papritur të mprehta dhe të gjitha mënyrat copa dhe bobs që mund t'ju kursejnë në mënyrë magjike një udhëtim në dyqanin e pajisjeve duke ofruar, nëse jo gjënë e saktë që ju nevojitet, diçka që do të bëjë mirë.

Aksident i lumtur për postin e sheshit të lojërave që gjeta në bodrum ishte se kishte vrima që kalonin nëpër pjatë tashmë. Nuk ka nevojë të shponi hekur! Baza kishte katër vrima rrufe në qiell, dhe ne shpuam katër vrima kundër mbytjes në pllakën prej druri që të përputheshin.

Më pas e lyam të gjithë sendin me ngjyrë të zezë gotike.

Hapi 2: Përgatitja e Unazave Neopixel

Përgatitja e Unazave Neopixel
Përgatitja e Unazave Neopixel

Ju do të duhet të lidhni telat mbi unazat tuaja neopixel: një tel Data-In për të gjithë ata, një tela Data-Out për dy prej tyre, dhe fuqi dhe tokëzim për secilën. Çfarëdo gjatësi që mendoni se keni nevojë, shtoni pak. Ju gjithmonë mund të ndërprisni tela të tepërt, nuk mund të zgjasni një tela shumë të shkurtër. Dhe jini të vetëdijshëm për paralajmërimin nga Adafruit:

Kur lidhni telat në këto unaza, duhet të jeni shumë vigjilentë për blloqet e lidhjes dhe qarqet e shkurtra. Distanca midis përbërësve është shumë e ngushtë! Shpesh është më e lehtë për të futur tela nga përpara dhe ngjitur në anën e pasme.

Do të doja ta lexoja atë para se të bashkohesha në pjesën e përparme. Arrita të mos digj asnjë nga LED -et e mia, por përvëlova skajin e njërit në një mënyrë që më bëri të djersitem derisa e ndeza. Gjithashtu, po të kisha lexuar manualin e shkëlqyer do të kisha lexuar gjithashtu paralajmërimin për të mos vendosur një kapëse aligatori në LED. Le të jenë mbytjet e mia pranë anijes fari juaj.

Unazat neopixel zinxhir margaritar, që do të thotë që ju mund të kontrolloni të gjitha LED-të e tyre njëkohësisht nga një Arduino duke lidhur një tel nga OUT të një unaze në IN të një tjetri. Çdo unazë ka nevojë për tela të rrymës dhe tokëzimit gjithashtu.

Hapi 3: Instalimet

Instalimet elektrike
Instalimet elektrike

Lidhni atë si në Fritzing më lart-kunja 6 e Arduino i merr të dhënat në unazën e parë, Data-out nga ajo unazë shkon në Data-in e tjetrës, Data-out e asaj shkon në Të dhëna për unazën e fundit. Nuk keni nevojë për telin e daljes së të dhënave të unazës përfundimtare.

Kapaciteti 1000 μf shkon midis shinave pozitive dhe negative të dërrasës së bukës. Ky kapak mbron unazat nga goditjet e energjisë dhe rekomandohet nga seksioni i praktikave më të mira të Adafruit NeoPixel Uberguide. Rezistenca në të dhënat në neopixelin e parë rekomandohet gjithashtu nga Adafruit-është 1K në Fritzing por rezistenca e rekomanduar është 300-500 Ohm.

Në ndërtimin tim, i kalova telat nga Neopixels në pjesën e pasme të pjatës në një dërrasë buke të fiksuar në qendër. Në atë mënyrë ju duhet vetëm të kaloni tre tela të gjatë në njësinë bazë: fuqia, toka dhe të dhënat. I bëra këto tela shumë të gjatë-ka shumë hapësirë për ruajtje në bazë, dhe e bën të përshtatshme të jesh në gjendje të tërheqësh tabelën për riprogramim.

Hapi 4: Kodi

"loading =" dembel "e përmendur djali im donte një version muzikor të këtij versioni. Mori ditëlindjen e tij të 18-të për ta arritur atë, por ja ku është!

Pajisje shtesë:

1 Çelës i vetëm, Çelës i hedhjes së dyfishtë 1 Mikrofon automatik i kontrollit të fitimit (kam përdorur MAX9184 të AdaFruit's) 1 kondensator 1uF-100uF (Çdo vlerë)

Mikrofoni vërtet duhet të ketë Kontroll Automatik të Fitimit që kjo të funksionojë siç duhet. AGC do të mostrojë vazhdimisht zhurmën e ambientit dhe do të ngrejë dhe ulë pragun që ai e konsideron si sfond, kështu që drita juaj do t'i përgjigjet goditjeve në atë sfond. Mikrofoni i AdaFruit është i shkëlqyeshëm: mund të shkosh nga një dhomë e heshtur në të cilën tingulli i një zëri të vetëm do ta çojë atë në modalitetin e festës me një dhomë plot me adoleshentë dhe muzikë që bërtet dhe do të marrë ritmin e muzikës vetëm mirë Alternativa, një mikrofon i rregullueshëm, ka një potenciometër të vogël në tabelë i cili është jashtëzakonisht delikat dhe i çuditshëm. Nuk kërkon shumë ndryshime në tingullin e ambientit për ta bërë njësinë të padobishme: dritat ndizen vazhdimisht ose errësohen vazhdimisht. AGC punon si magji.

Doja opsionin për të përdorur modelin e testit të vorbullave ose muzikën, kështu që vendosa lidhësin qendror të një kalimi në VIN dhe një prizë në pin 4 tjetrën në pin 8 të Leonardo. Duke i testuar ato kunjat për LART HIGH ose TOW UL mund të dimë se në cilën gjendje ndodhet ndërprerësi dhe kodin e degës në përputhje me rrethanat.

Hapi 7: Instalimi i mikrofonit

Instalimi i mikrofonit
Instalimi i mikrofonit

Futeni hyrjen e mikrofonit, nëpërmjet atij kondensatori 1-100µF, në kunjin analoge 0. Nëse kondensatori juaj është i polarizuar, kunja e daljes shkon në anën pozitive (tela jeshile).

Faleminderit CodeGirlJP për rutinën e saj Trinket-Color-by-Sound, të cilën e përshtata më poshtë:

// LED të aktivizuara me zë me Arduino dhe NeoPixels

#përfshi

#define MIC_PIN A0 // Mikrofoni është i bashkangjitur në kunjin a0 në Leonardo

#përcaktoni LED_PIN 6 // Fijet e NeoPixel LED të bashkangjitura në pin 6 në Leonardo #define N_PIXELS 36 // numri i pikseleve në fillesën LED !!!!!! Përshtateni me numrin e pikselave në konfigurimin tuaj. Kjo është e saktë për 3 unaza Neopixel !!!!!! #define N 100 // Numri i mostrave që duhen marrë sa herë që lexohenMoshat quhen #define zbeh Vonesa 5 // koha e vonesës për çdo sasi zbehjeje #përcakto zhurmënNiveli 30 // niveli i pjerrësisë së zhurmës mesatare të mikrofonit pa zë

// Filloni shiritin NeoPixel me vlerat e përcaktuara më sipër:

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

mostrat int [N]; // ruajtje për një grup grumbullimi mostër

int periodFaktor = 0; // mbani shënime numrin e ms për llogaritjen e periudhës int t1 = -1; // kohët e pjerrësisë> 100 të zbuluara. int T; // periudha midis kohëve të shkallëzuara në milisekonda në shpatin int; // pjerrësia e dy pikave të mostrës së të dhënave të mbledhura të periudhës së bajtitChanged = 0; const int SwitchPinMusic = 4; // Pin për pozicionin e ndërrimit të ndjeshmërisë muzikore const int SwitchPinSwirl = 8; // Pin për pozicionin e ndërrimit Modeli i testimit (rrotullimi) int MusicbuttonState = 0; // Ndryshore logjike e fikur për ndjeshmërinë ndaj muzikës

// Metoda e konfigurimit të Arduino

void setup () {

strip.filloj ();

ledsOff (); vonesë (500); displayColor (Rrota (100)); shirit.shfaq (); vonesë (500); oddWheel (Rrota (100)); shirit.shfaq (); vonesë (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Ndërprerë, Rënie);

}

// Metoda e lakut Arduino

void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // HIGH nëse kaloni në ndjeshmërinë e muzikës MusicbuttonState = digitalRead (SwitchPinMusic); // HIGH nëse kaloni vendosur në Test model while (SwirlbuttonState == LOW) {readSamples (); // Drejtoni rutinën e marrjes së mostrave të muzikës SwirlbuttonState = digitalRead (SwitchPinSwirl); // Kontrolloni nëse ndërruesi është ndryshuar} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); ndërsa (SwirlbuttonState == LART) {Vallëzo (); // Drejtoni rutinën e modelit të provës swirly SwirlbuttonState = digitalRead (SwitchPinSwirl); // Kontrolloni nëse ndërruesi është ndryshuar

}

}

vallëzim i pavlefshëm () {

ndërsa (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (shirit. Ngjyra (0, 255, 0), 50); // Green SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (shirit. Ngjyra (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // White RGBW // Dërgo një ndjekje pixel teatri në… SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (shirit. Ngjyra (127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (shirit. Ngjyra (127, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (shirit. Ngjyra (0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); ylber (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Lexoni dhe përpunoni të dhënat e mostrës nga Mic void readSamples () {për (int i = 0; i0) {shpat = mostra - mostra [i -1]; } else {pjerrësia = mostrat - mostrat [N -1]; } // Kontrolloni nëse Pjerrësia është më e madhe se zhurmaLevel - tingulli që nuk është në nivelin e zhurmës zbulohet nëse (abs (pjerrësia)> zhurmaLevel) {if (pjerrësia <0) {llogarisPeriudha (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} else {ledsOff (); // theaterChaseRainbow (50); } periodFaktor += 1; vonesa (1); }}

llogaritja e pavlefshme Periudha (int i)

{nëse (t1 == -1) {// t1 nuk është vendosur t1 = i; } else {// t1 u vendos kështu calc period int period = periodFactor*(i - t1); periudhëNdryshuar = T == periudhë? 0: 1; T = perioda; //Serial.println(T); // rivendos t1 në vlerën e re i1 t1 = i; periodFaktor = 0; }}

uint32_t getColor (periudha int)

{if (period == -1) Wheel return (0); përndryshe nëse (periudha> 400) rrota e kthimit (5); tjetër Rrota e kthimit (harta (periudha -1*, -400, -1, 50, 255)); }

void fadeOut ()

{për (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); shirit.shfaq (); // Përditëso vonesën e shiritit (fadeDelay); periodFaktor += zbehjeVonesë; }}

void fadeIn ()

{strip.setBrightness (100); shirit.shfaq (); // Shiriti i azhurnimit // zbeh ngjyrën në për (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Përditëso vonesën e shiritit (fadeDelay); periodFaktor+= zbehjeVonesë; }}

void ledsOff ()

{ shuhem(); për (int i = 0; i

ekran i pavlefshëm Ngjyra (ngjyra uint32_t)

{për (int i = 0; i

void oddWheel (ngjyra uint32_t)

{për (int j = 0; j <256; j ++) {// ciklo të gjitha 256 ngjyrat në timon për (int q = 0; q <3; q ++) {për (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, Rrota ((i+j) % 255)); // ndizni çdo piksel të tretë në} strip.show ();

vonesa (1);

për (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // fik çdo piksel të tretë}}} fadeIn (); }

// Plotësoni pikat njëra pas tjetrës me një ngjyrë

ngjyra e pavlefshme Fshij (uint32_t c, uint8_t pres) {për (uint16_t i = 0; i

ylber i pavlefshëm (uint8_t prit) {

uint16_t i, j;

për (j = 0; j <256; j ++) {për (i = 0; i

// Pak më ndryshe, kjo e bën ylberin të shpërndarë në mënyrë të barabartë në të gjithë

void rainbowCycle (uint8_t prisni) {uint16_t i, j;

për (j = 0; j <256*5; j ++) {// 5 cikle të të gjitha ngjyrave në timon për (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.shfaq (); vonesë (pritje); }}

// Dritat zvarritëse të stilit të teatrit.

void theaterChase (uint32_t c, uint8_t prisni) {për (int j = 0; j <10; j ++) {// bëni 10 cikle ndjekjeje për (int q = 0; q <3; q ++) {për (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // ndizni çdo piksel të tretë në} strip.show ();

vonesë (pritje);

për (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // fik çdo piksel të tretë}}}}

// Dritat zvarritëse të stilit teatror me efekt ylberi

void theaterChaseRainbow (uint8_t prisni) {për (int j = 0; j <256; j ++) {// ciklo të gjitha 256 ngjyrat në timon për (int q = 0; q <3; q ++) {për (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, Rrota ((i+j) % 255)); // ndizni çdo piksel të tretë në} strip.show ();

vonesë (pritje);

për (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // fik çdo piksel të tretë}}}}

// Fut një vlerë 0 deri në 255 për të marrë një vlerë ngjyrash.

// Ngjyrat janë një kalim r - g - b - përsëri në r. uint32_t Rrota (byte WheelPos) {WheelPos = 255 - WheelPos; nëse (WheelPos <85) {shiriti i kthimit. Color (255 - WheelPos * 3, 0, WheelPos * 3); } nëse (WheelPos <170) {WheelPos -= 85; shiriti i kthimit. Ngjyra (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; shiriti i kthimit. Ngjyra (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Kaloi () {

shirit.shfaq (); Mostrat e leximit (); }

Para se të vritem në komentet (mbani mend politikën Be Nice !!) E kuptova pasi e kisha ngarkuar këtë se sa të ngathët janë disa nga kodet e mia. Nuk ka nevojë të testoni vazhdimisht si Pin 4 ashtu edhe Pin 8 për HIGH. Meqenëse ndërprerësi është hedhje e dyfishtë me një pol, vlera e njërës mund të nxirret nga tjetra: ju duhet vetëm të provoni njërën. Kështu që ju mund të kaloni dhe hiqni çdo referencë për leximin dhe shkrimin e MusicButtonState dhe thjesht të ekzekutoni të gjithë gjënë në mënyrë më efikase duke testuar SwirlButtonState, nëse keni pak memorie ose jeni duke u zgjeruar me rutina të tjera. Por kodi i mësipërm funksionon.

Dhe nëse dikush dëshiron të ndryshojë ato rutina audio për të kuptuar jo vetëm nivelet e zhurmës, por edhe frekuencën, dhe të shkruajë një kod të qetë për të rrëshqitur lart e poshtë spektrin e dritës në përgjigje të lëvizjeve përgjatë spektrit audio, lini një lidhje në komentet për si e ke bere

Shijoni!

Recommended: