Indholdsfortegnelse:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 trin (med billeder)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 trin (med billeder)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 trin (med billeder)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 trin (med billeder)
Video: Arduino & Neopixel Coke Bottle Party Light 2024, Juli
Anonim
Image
Image

Så min søn Doon får øje på et meget fedt festlys lavet af gamle koksflasker og de stramme indre af Glow Sticks og spørger, om vi ikke kan lave en til hans kommende skoleeksamener er forbi blowout DELAYYY !!! Jeg siger bestemt, men ville du ikke hellere have nogle af de spøjse Adafruit Neopixel -ringe, vi har læst om … Han ser mig tom. Fordi han faktisk ikke ved, hvad jeg taler om, men far har opdaget en mulighed for at lege med de Neopixel -ringe, han har læst om, og vi kender alle en af de 10 bedste grunde til, at nørdede far frembringer, er at have en undskyldning for at lege med fede gadgets, de fortæller, at alle er til deres børn.

Dette er et superenkelt projekt, der ser rigtig godt ud. Vi byggede vores 3 gamle koksflasker, en træplade og en legepladsbeslag - ting liggende i kælderen - kombineret med en Arduino (Leonardo i vores tilfælde, men ethvert Genuino -bord vil klare!) Og tre Neopixel -ringe. Jeg bestilte en 9-LED ring, men endte med en 12-LED ring til samme pris. Hvilket var sødt, men betød en overgang på brøndhullerne-de 12-LED-ringe er 35 mm brede i modsætning til 23 mm. Det skal du bruge:

  • Genuino/Arduino board (Vi brugte en Leonardo, men næsten ethvert board vil gøre)
  • 3 Neopixel -ringe (12 lysdioder hver): få dem fra Adafruit, og støt de fine mennesker
  • 1000 µf 6,3v eller bedre kondensator
  • 300-500 ohm modstand
  • En træplade, eller en firkant af skrot, eller noget du kan sætte neopixel i og sætte koksflaskerne ovenpå
  • En eller anden form for montering til pladen - en legepladsbeslag fungerede godt for os
  • 9v vægvorte
  • 40 mm hulboring
  • Bolte, møtrikker, skiver, afstandsstykker
  • Massiv kernetråd
  • Et loddejern og loddetin
  • Brødbræt
  • Et plastikhus til Arduino. Du kan gå ud og købe en virkelig flot, perfekt passende plastkasse fremstillet af millioner år gammel råolie boret ud af jorden i nogle skrøbelige omgivelser og fremstillet på den anden side af planeten og sendt i en container til et lager i nærheden af dig med alt det havne skæres perfekt ud og får det leveret til din dør af en varevogn, der spytter kuldioxid ud i atmosfæren. Eller du kan gøre, hvad jeg gjorde, og bruge en gammel kasseret plastkasse.. i dette tilfælde en Madagaskar plaster, der ligger rundt i medicinskabet … og bor et par huller i den. Her slutter foredraget. Lad os lave…

Trin 1: Lav basen

Lav basen
Lav basen
Lav basen
Lav basen

Du kan improvisere din base fra det skrammel, du har i din egen kælder, eller endda bare bruge en trækasse eller noget, der vil skjule din elektronik.

Først borede vi tre huller, jævnt fordelt på træpladen, store nok til at Neopixel -ringene kunne sidde i. På billedet er hullerne boret med en spadebor. I sidste ende, på grund af den større størrelse af de 12 LED-ringe, var vi nødt til at bore huller med en borer. Dette betød at gå hele vejen igennem pladen, og i stedet for at klemme ringene pænt ind i deres fint udformede små 2 mm dybe brønde med et centerhul til et pænt trådløb, endte jeg med at sikre ringene med … ahem … Gaffatape hen over bunden af pladen. Døm ikke. Du kan alligevel ikke se bunden af pladen i mit design. Og det er mørkt, når det er tændt. Og desuden - hvad er der galt med gaffatape?

Jeg havde brug for afstand mellem pladen og beslaget til et brødbræt i bunden af pladen og en komponent - kondensatoren og til de trådløb, der skulle gå fra brødbrættet til Arduino, som jeg planlagde at lægge inde i beslaget. Så jeg lagde et sæt provisoriske afstandsstykker på boltakslerne til at give nok afstand - ca. 3 cm, brødbræddernes højde og lidt, så du ikke knuser ledningerne. Jeg brugte to træankerbolte pr. Hjørne, fordi de var i den rigtige højde og lå rundt i mandeskuffen … den æske med løse skruer, bolte, søm, rustne kædeled, slangekoblinger, gamle mønter, uventet skarpe genstande og alle mulige former af bits og bobs, der på magisk vis kan spare dig for en tur til isenkræmmeren ved at tilbyde, hvis ikke den nøjagtige ting du har brug for, noget der vil klare sig fint.

Glad ulykke om legepladsposten, jeg fandt i kælderen, var, at den allerede havde huller, der løb gennem pladen. Ingen grund til at bore jern! Basen havde fire bolthuller, og vi borede fire modsænkede huller i træpladen for at matche.

Vi sprøjtede derefter det hele gotisk sort.

Trin 2: Forberedelse af Neopixel -ringe

Forberedelse af Neopixel -ringe
Forberedelse af Neopixel -ringe

Du skal lodde ledninger på dine neopixelringe: en Data-In-ledning til dem alle, en Data-Out-ledning til to af dem og strøm og jord for hver. Uanset hvilken længde du synes, du har brug for, skal du tilføje nogle. Du kan altid afskære overskydende ledning, du kan ikke strække en, der er for kort. Og vær opmærksom på advarslen fra Adafruit:

Når du lodder ledninger til disse ringe, skal du være ekstra opmærksom på loddeklatter og kortslutninger. Afstanden mellem komponenter er meget stram! Det er ofte lettest at indsætte tråden forfra og lodde på bagsiden.

Jeg ville ønske, at jeg læste det, før jeg lodde foran. Det lykkedes mig ikke at brænde nogen af mine lysdioder ud, men jeg svidte kanten af en på en måde, der fik mig til at svede, indtil jeg tændte den. Havde jeg også læst den fine manual, ville jeg også have læst advarslen om ikke at sætte et alligatorklip på LED'en. Lad mine nærskibsvrag være dit fyrtårn.

Neopixel ringer daisy-chain, hvilket betyder, at du kan styre alle deres lysdioder samtidigt fra en Arduino ved at forbinde en ledning fra OUT på en ring til IN på en anden. Hver ring har også brug for strøm og jordledninger.

Trin 3: Ledningerne

Ledningerne
Ledningerne

Tråd det op som i Fritzing ovenfor-pin 6 i Arduino tager dataene til den første ring, Data-out fra den ring går til Data-in for den næste, Data-out af den ene går til den Data-in for den sidste ring. Du behøver ikke data-out-ledningen til den sidste ring.

Kapaciteten på 1000 µf går mellem de positive og negative skinner på brødbrættet. Denne hætte beskytter ringene mod strømspidser og anbefales af Adafruit NeoPixel Uberguides sektion om bedste praksis. Modstanden på Data ind til det første neopixel anbefales også af Adafruit-det er 1K i Fritzing, men anbefalet modstand er 300-500 ohm.

I min konstruktion løb jeg ledningerne fra Neopixels hen over bagsiden af tallerkenen til et brødbræt fastgjort i midten. På den måde behøver du kun at køre tre lange ledninger ned i baseenheden: strøm, jord og data. Jeg lavede disse ledninger superlange-der er masser af lagerplads i basen, og det gør det praktisk at kunne trække brættet ud til omprogrammering.

Trin 4: Koden

"loading =" doven "nævnte min søn ønskede en musikreaktiv version af dette. Tog til hans 18 års fødselsdag for at komme rundt til det, men her er det!

Yderligere udstyr:

1 enkeltpolet, dobbeltkastkontakt1 Automatisk forstærkningskontrolmikrofon (jeg brugte AdaFruit's MAX9184) 1 1uF-100uF kondensator (enhver værdi)

Mikrofonen skal virkelig have automatisk forstærkningskontrol for at dette kan fungere korrekt. AGC vil konstant prøve den omgivende støj og hæve og sænke tærsklen, som den betragter som baggrund, så dit lys vil reagere på pigge mod den baggrund. AdaFruit's mikrofon er genial: du kan gå fra et stille rum, hvor lyden af en enkelt stemme vil udløse den til fuld-on-festtilstand med et værelse fuld af teenagere og musik, der brager, og det vil tage musikens takt bare bøde. Alternativet, en justerbar forstærkningsmikrofon, har et lille potentiometer på tavlen, som er umuligt sart og besværligt. Det kræver ikke meget ændring i den omgivende lyd for at gøre enheden ubrugelig: lyser konstant eller mørkt konstant. AGC fungerer som magi.

Jeg ville have muligheden for at bruge hvirveltestmønsteret eller musikken, så jeg tilsluttede midterledningen på en switch til VIN og den ene ledning til pin 4 den anden til pin 8 på Leonardo. Ved at teste disse stifter for HIGH eller LOW kan vi vide, hvilken tilstand kontakten er i, og forgreningskode i overensstemmelse hermed.

Trin 7: Tilslut mikrofonen

Tilslutning af mikrofonen
Tilslutning af mikrofonen

Tilfør mikrofonindgangen via den 1-100µF kondensator til den analoge ben 0. Hvis din kondensator er polariseret, går udpinden til den positive side (grøn ledning).

Tak til CodeGirlJP for hendes Trinket-Color-by-Sound rutine, som jeg tilpassede herunder:

// Lydaktiverede lysdioder med Arduino og NeoPixels

#omfatte

#define MIC_PIN A0 // Mikrofon er fastgjort til pin a0 på Leonardo

#define LED_PIN 6 // NeoPixel LED -streng fastgjort til pin 6 på Leonardo #define N_PIXELS 36 // antal pixels i LED -streng !!!!!! Juster til antallet af pixels i din opsætning. Dette er korrekt for 3 Neopixel ringe !!!!!! #define N 100 // Antal prøver der skal tages hver gang læsning Prøver kaldes #define fadeDelay 5 // forsinkelsestid for hver fade mængde #definer støj Niveau 30 // hældningsniveau for gennemsnitlig mikrofonstøj uden lyd

// Initialiser NeoPixel -strimlen med de definerede værdier ovenfor:

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

int prøver [N]; // opbevaring til et prøvesamlingssæt

int periodFactor = 0; // holde styr på antallet af ms til periodeberegning int t1 = -1; // Hældningstider> 100 registreret. int T; // periode mellem tider skaleret til millisekunder int hældning; // hældningen af to indsamlede datasamplingspunkter byte periodChanged = 0; const int SwitchPinMusic = 4; // Pin til switch position musik-følsomhed const int SwitchPinSwirl = 8; // Pin til kontaktposition Testmønster (hvirvel) int MusicbuttonState = 0; // On off logic variabel for musikfølsomhed

// Arduino opsætningsmetode

ugyldig opsætning () {

strip.begin ();

ledsOff (); forsinkelse (500); displayColor (hjul (100)); strip.show (); forsinkelse (500); oddWheel (hjul (100)); strip.show (); forsinkelse (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Switched, FALLING);

}

// Arduino loop metode

void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // HIGH hvis switch er indstillet til Music sensitive MusicbuttonState = digitalRead (SwitchPinMusic); // HIGH if switch sat til Test mønster mens (SwirlbuttonState == LOW) {readSamples (); // Kør musikken sampling rutine SwirlbuttonState = digitalRead (SwitchPinSwirl); // Kontroller, om kontakten blev ændret} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); mens (SwirlbuttonState == HIGH) {Dance (); // Kør swirly testmønsterrutinen SwirlbuttonState = digitalRead (SwitchPinSwirl); // Kontroller, om kontakten blev ændret

}

}

void Dance () {

mens (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 255, 0), 50); // Grøn SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // Hvid RGBW // Send en teater -pixeljagt i… SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (127, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); regnbue (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }}} // Læs og behandl prøvedata fra Mic void readSamples () {for (int i = 0; i0) {slope = samples - samples [i -1]; } ellers {hældning = prøver - prøver [N -1]; } // Kontroller, om hældning er større end noiseLevel - lyd, der ikke er registreret ved støjniveau, hvis (abs (hældning)> noiseLevel) {if (hældning <0) {calcPeriod (i); hvis (periodChanged == 1) {displayColor (getColor (T)); }}} andet {ledsOff (); // theaterChaseRainbow (50); } periodFactor += 1; forsinkelse (1); }}

ugyldig beregningsperiode (int i)

{hvis (t1 == -1) {// t1 ikke er blevet indstillet t1 = i; } else {// t1 blev indstillet, så calc period int period = periodFactor*(i - t1); periodChanged = T == periode? 0: 1; T = periode; //Serial.println(T); // nulstil t1 til ny i -værdi t1 = i; periodFactor = 0; }}

uint32_t getColor (int periode)

{hvis (periode == -1) returhjul (0); ellers hvis (periode> 400) returhjul (5); ellers returhjul (kort (-1*periode, -400, -1, 50, 255)); }

void fadeOut ()

{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); strip.show (); // Opdater strimmelforsinkelse (fadeDelay); periodFactor += fadeDelay; }}

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Opdater strimmel // fade farve ind for (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Opdater strimmelforsinkelse (fadeDelay); periodFactor+= fadeDelay; }}

void ledsOff ()

{ svinde bort(); for (int i = 0; i

void displayColor (uint32_t farve)

{for (int i = 0; i

void oddWheel (uint32_t farve)

{for (int j = 0; j <256; j ++) {// cyklus alle 256 farver i hjulet for (int q = 0; q <3; q ++) {for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, hjul ((i+j) % 255)); // slå hver tredje pixel til} strip.show ();

forsinkelse (1);

for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // sluk for hver tredje pixel}}} fadeIn (); }

// Fyld prikkerne efter hinanden med en farve

void colorWipe (uint32_t c, uint8_t wait) {for (uint16_t i = 0; i

ugyldig regnbue (uint8_t vent) {

uint16_t i, j;

for (j = 0; j <256; j ++) {for (i = 0; i

// Lidt anderledes, dette gør regnbuen ligeligt fordelt overalt

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

for (j = 0; j <256*5; j ++) {// 5 cykler af alle farver på hjulet for (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); forsinkelse (vent); }}

// Krybelys i teaterstil.

void theaterChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// gør 10 cykler med jagt efter (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // slå hver tredje pixel til} strip.show ();

forsinkelse (vent);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // sluk for hver tredje pixel}}}}

// Krybelys i teaterstil med regnbueeffekt

void theaterChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// cyklér alle 256 farver i hjulet for (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, Wheel ((i+j) % 255)); // slå hver tredje pixel til} strip.show ();

forsinkelse (vent);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // sluk for hver tredje pixel}}}}

// Indtast en værdi 0 til 255 for at få en farveværdi.

// Farverne er en overgang r - g - b - tilbage til r. uint32_t Wheel (byte WheelPos) {WheelPos = 255 - WheelPos; hvis (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } hvis (WheelPos <170) {WheelPos -= 85; returstrimmel. Farve (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; returstrimmel. Farve (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched () {

strip.show (); readSamples (); }

Inden jeg bliver slagtet i kommentarerne (husk Be Nice -politikken !!) indså jeg, efter at jeg havde uploadet dette, hvor sjusket noget af min kode er. Der er ingen grund til konstant at teste både Pin 4 og Pin 8 for HIGH. Da kontakten er enkeltpolet dobbeltkast, kan værdien af det ene udledes af den anden: du behøver kun at teste det ene. Så du kunne gå igennem og fjerne enhver henvisning til at læse og skrive MusicButtonState og simpelthen køre det hele mere effektivt ved at teste SwirlButtonState, hvis du mangler hukommelse eller udvider andre rutiner. Men koden ovenfor virker.

Og hvis nogen ønsker at finjustere disse lydrutiner til ikke kun at fornemme støjniveauet, men også frekvensen og skrive en glat kode for at glide op og ned af lysspektret som reaktion på bevægelser langs lydspektret, så slip et link i kommentarerne til hvordan du gjorde det.

God fornøjelse!

Anbefalede: