Innehållsförteckning:
- Steg 1: Gör basen
- Steg 2: Förbereda Neopixel -ringarna
- Steg 3: Ledningen
- Steg 4: Koden
- Steg 7: Anslut mikrofonen
Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 steg (med bilder)
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:37
Så min son Doon upptäcker en väldigt cool festljus gjord av gamla koksflaskor och de tröga inre Glow Sticks och frågar om vi kan göra en till hans kommande skolprov är över utblåsning DAGLIGT !!! Jag säger säkert, men skulle du inte hellre ha några av de fiffiga Adafruit Neopixel -ringarna vi har läst om … Han ser mig tom. För faktum är att han inte vet vad jag pratar om, men pappa har upptäckt ett tillfälle att leka med de Neopixel -ringar han har läst om, och vi vet alla att en av de tio främsta anledningarna till att nördpappor odlar är att ha en ursäkt för att leka med coola prylar de säger att alla är för sina barn.
Detta är ett superenkelt projekt som ser riktigt bra ut. Vi byggde våra tre gamla koksflaskor, en träplatta och en lekplatsfäste - grejer som ligger i källaren - kombinerat med en Arduino (Leonardo i vårt fall, men vilken Genuino -bräda som helst!) Och tre Neopixel -ringar. Jag beställde en 9-LED-ring, men slutade med en 12-LED-ring för samma pris. Vilket var sött, men innebar en do-over på brunnhålen-12-LED-ringarna är 35 mm breda, i motsats till 23 mm. Vad du behöver:
- Genuino/Arduino -bräda (Vi använde en Leonardo, men nästan vilken bräda som helst kommer att göra)
- 3 Neopixelringar (12 lysdioder vardera): få dem från Adafruit och stöd de fina människorna
- 1000 µf 6,3v eller bättre kondensator
- 300-500 ohm motstånd
- En träplatta, eller en fyrkant av klippträ, eller något du kan sätta neopixlarna i och sätta koksflaskorna ovanpå
- Någon form av fäste för tallriken - en lekplatsstolpe fungerade bra för oss
- 9v väggvårta
- 40 mm hålborrning
- Bultar, muttrar, brickor, distanser
- Massiv kärntråd
- Ett lödkolv och löd
- Bakbord
- Ett plastfodral till Arduino. Du kan gå ut och köpa riktigt snyggt perfekt passande plastlåda tillverkad av miljoner år gammal petroleum borrad ur marken i någon ömtålig miljö och tillverkad på andra sidan planeten och levererad i en behållare till ett lager nära dig med alla portar skärs ut i perfekt uppriktning och får den levererad till din dörr av en skåpbil som sprider koldioxid i atmosfären. Eller så kan du göra vad jag gjorde och använda en gammal kasserad plastlåda.. i det här fallet en Madagaskar bandlåda som ligger i medicinskåpet … och borra några hål i den. Här avslutar föreläsningen. Låt oss göra…
Steg 1: Gör basen
Du kan improvisera din bas från det skräp du har i din egen källare, eller till och med bara använda en trälåda eller något som döljer din elektronik.
Först borrade vi tre hål, jämnt fördelade på träplattan, tillräckligt stora för att Neopixel -ringarna ska sitta i. På bilden är hålen borrade med en spadeborr. Till slut, på grund av den större storleken på 12-LED-ringarna, var vi tvungna att borra hål med en borr. Detta innebar att gå hela vägen genom plattan, och i stället för att fästa ringarna snyggt i sina fint utformade små 2 mm djupa brunnar med ett mittenhål för en snygg trådkörning hamnade jag med att säkra ringarna med … ahem … Gaffatejp över botten av plattan. Döm inte. Du kan inte se botten av plattan i min design ändå. Och det är mörkt när det är på. Och dessutom - vad är det för fel på gaffatejp?
Jag behövde avstånd mellan plattan och fästet för ett brödbräda på plattans botten och en komponent - kondensatorn och för trådkörningarna som skulle behöva gå från brödbräda till Arduino, som jag planerade att sätta in i konsolen. Så jag satte en uppsättning provisoriska distanser på bultaxlarna för att ge tillräckligt med utrymme - cirka 3 cm, brödbrädans höjd och lite så att du inte krossar ledningarna. Jag använde två träankarskruvar per hörn eftersom de var i rätt höjd och låg i manlådan … den där lådan med lösa skruvar, bultar, spikar, rostiga kedjelänkar, slangkopplingar, gamla mynt, oväntat vassa föremål och alla möjliga sätt av bitar och bobs som magiskt kan spara dig en resa till järnaffären genom att erbjuda, om inte exakt det du behöver, något som kommer att klara sig bra.
Lycklig olycka om lekplatsen som jag hittade i källaren var att det redan hade hål genom plattan. Inget behov av att borra järn! Basen hade fyra bulthål, och vi borrade fyra försänkta hål i träplattan för att matcha.
Vi spraymålade sedan det hela Gothic Black.
Steg 2: Förbereda Neopixel -ringarna
Du måste löda trådar på dina neopixelringar: en Data-In-kabel för dem alla, en Data-Out-kabel för två av dem och ström och jord för varje. Oavsett vilken längd du tror att du behöver, lägg till lite. Du kan alltid klippa bort överflödig tråd, du kan inte sträcka ut en för kort. Och var medveten om varningen från Adafruit:
När du lödtrådar till dessa ringar måste du vara extra vaksam på lödklumpar och kortslutningar. Avståndet mellan komponenterna är mycket tätt! Det är ofta lättast att sätta in tråden framifrån och lödning på baksidan.
Jag önskar att jag läste det innan jag lödde fram. Jag lyckades inte bränna ut någon av mina lysdioder, men jag brände kanten på en på ett sätt som fick mig att svettas tills jag tända den. Hade jag också läst den fina manualen hade jag också läst varningen för att inte sätta ett krokodilklämma på lysdioden. Låt mina nära skeppsvrak vara din fyr.
Neopixel ringer daisy-chain, vilket innebär att du kan styra alla deras lysdioder samtidigt från en Arduino genom att ansluta en kabel från UTAN för en ring till IN på en annan. Varje ring behöver ström och jordledningar också.
Steg 3: Ledningen
Koppla ihop det som i Fritzing ovan-stift 6 på Arduino tar data till den första ringen, Data-out från ringen går till Data-in för nästa, Data-out för den går till Data-in för den senaste ringen. Du behöver inte data-out-kabeln för den sista ringen.
Kapaciteten på 1000 µf går mellan brödbrädans positiva och negativa skenor. Det här locket skyddar ringarna från kraftpikar och rekommenderas av Adafruit NeoPixel Uberguides sektion för bästa praxis. Motståndet på Data in till den första neopixeln rekommenderas också av Adafruit-det är 1K i Fritzing men rekommenderat motstånd är 300-500 ohm.
I min konstruktion körde jag trådarna från Neopixels över baksidan av tallriken till en brödbräda fixerad i mitten. På så sätt behöver du bara köra tre långa ledningar ner i basenheten: ström, jord och data. Jag gjorde dessa trådar superlånga-det finns gott om lagringsutrymme i basen, och det gör det bekvämt att kunna dra ut brädet för omprogrammering.
Steg 4: Koden
"loading =" lat "nämnde att min son ville ha en musikreaktiv version av detta. Tog fram till 18-årsdagen för att komma tillrätta med det, men här är det!
Ytterligare utrustning:
1 enpolig, dubbel kastbrytare 1 automatisk förstärkningsmikrofon (jag använde AdaFruits MAX9184) 1 1uF-100uF kondensator (valfritt värde)
Mikrofonen måste verkligen ha automatisk förstärkningskontroll för att detta ska fungera korrekt. AGC kommer ständigt att prova omgivningsbruset och höja och sänka tröskeln som den anser vara bakgrund, så ditt ljus kommer att reagera på spikar mot den bakgrunden. AdaFruit's mikrofon är lysande: du kan gå från ett tyst rum där ljudet av en enda röst kommer att utlösa det till full-on festläge med ett rum fullt av tonåringar och musik som skräller, och det kommer att ta upp musiken bra. Alternativet, en justerbar förstärkningsmikrofon, har en liten potentiometer på brädet som är omöjligt känslig och rörig. Det krävs inte mycket förändring av omgivande ljud för att göra enheten värdelös: lamporna lyser konstant eller mörkt hela tiden. AGC fungerar som magi.
Jag ville ha alternativet att använda virvlarna eller mönstret, så jag kopplade mittledningen på en switch till VIN och en ledning till pin 4 den andra till pin 8 på Leonardo. Genom att testa dessa stift för HÖG eller LÅG kan vi veta i vilket tillstånd omkopplaren är i och förgrena koden i enlighet därmed.
Steg 7: Anslut mikrofonen
Mata mikrofoningången via den 1-100µF kondensatorn till den analoga stift 0. Om din kondensator är polariserad går utpinnen till den positiva sidan (grön tråd).
Tack till CodeGirlJP för hennes rutin Trinket-Color-by-Sound, som jag anpassade nedan:
// Ljudaktiverade lysdioder med Arduino och NeoPixels
#omfatta
#define MIC_PIN A0 // Mikrofon är ansluten till stift a0 på Leonardo
#define LED_PIN 6 // NeoPixel LED -sträng fäst på stift 6 på Leonardo #define N_PIXELS 36 // antal pixlar i LED -sträng !!!!!! Justera till antalet pixlar i din inställning. Detta är korrekt för 3 Neopixel -ringar !!!!!! #define N 100 // Antal samplar som ska tas varje gång läsproverna kallas #define fadeDelay 5 // fördröjningstid för varje fade -mängd #definiera brusnivå 30 // lutningsnivå för genomsnittligt mikrofonbrus utan ljud
// Initiera NeoPixel -remsan med de definierade värdena ovan:
Adafruit_NeoPixel strip = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
int -prover [N]; // lagring för en provinsamlingsuppsättning
int periodFactor = 0; // hålla reda på antalet ms för periodberäkning int t1 = -1; // lutningstider> 100 detekterade. int T; // period mellan tider skalade till millisekunder int lutning; // lutningen för två samlade data samplingspunkter byte periodChanged = 0; const int SwitchPinMusic = 4; // Pin för switchposition musik-känslighet const int SwitchPinSwirl = 8; // Pin för switchläge Testmönster (virvel) int MusicbuttonState = 0; // På av logikvariabel för musikkänslighet
// Arduino -installationsmetod
void setup () {
strip.begin ();
ledsOff (); fördröjning (500); displayColor (hjul (100)); strip.show (); fördröjning (500); oddWheel (hjul (100)); strip.show (); fördröjning (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Switched, FALLING);
}
// Arduino loop metod
void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // HÖG om omkopplaren är inställd på Musikkänslighet MusicbuttonState = digitalRead (SwitchPinMusic); // HIGH if switch till Testmönster medan (SwirlbuttonState == LOW) {readSamples (); // Kör musiksamplingsrutinen SwirlbuttonState = digitalRead (SwitchPinSwirl); // Kontrollera om omkopplaren har ändrats} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); medan (SwirlbuttonState == HIGH) {Dance (); // Kör swirbuttonState = digitalRead (SwitchPinSwirl); // Kontrollera om omkopplaren har ändrats
}
}
void Dance () {
medan (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 255, 0), 50); // Green SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // Vit RGBW // Skicka en teaterpixeljakt 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); regnbåge (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Läs och bearbeta provdata från Mic void readSamples () {för (int i = 0; i0) {slope = samples - samples [i -1]; } annat {lutning = prover - prover [N -1]; } // Kontrollera om lutningen är större än noiseLevel - ljud som inte upptäcks vid ljudnivå om (abs (lutning)> noiseLevel) {if (lutning <0) {calcPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} annat {ledsOff (); // theaterChaseRainbow (50); } periodFactor += 1; fördröjning (1); }}
ogiltig beräkningsperiod (int i)
{if (t1 == -1) {// t1 har inte ställts in t1 = i; } else {// t1 var inställd så calc period int period = periodFactor*(i - t1); periodChanged = T == period? 0: 1; T = period; //Serial.println(T); // återställ t1 till nytt i -värde t1 = i; periodFactor = 0; }}
uint32_t getColor (int period)
{if (period == -1) returhjul (0); annars om (period> 400) returhjul (5); annars returhjul (karta (-1*period, -400, -1, 50, 255)); }
void fadeOut ()
{för (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); strip.show (); // Uppdatera remsefördröjning (fadeDelay); periodFactor += fadeDelay; }}
void fadeIn ()
{strip.setBrightness (100); strip.show (); // Uppdatera remsa // blekna färgen för (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Uppdatera remsefördröjning (fadeDelay); periodFactor+= fadeDelay; }}
void ledsOff ()
{ tona ut(); för (int i = 0; i
void displayColor (uint32_t färg)
{för (int i = 0; i
void oddWheel (uint32_t färg)
{för (int j = 0; j <256; j ++) {// cykla alla 256 färger i hjulet för (int q = 0; q <3; q ++) {för (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, hjul ((i+j) % 255)); // slå på var tredje pixel} strip.show ();
fördröjning (1);
för (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // stäng av var tredje pixel}}} fadeIn (); }
// Fyll prickarna en efter en med en färg
void colorWipe (uint32_t c, uint8_t wait) {för (uint16_t i = 0; i
void rainbow (uint8_t wait) {
uint16_t i, j;
för (j = 0; j <256; j ++) {för (i = 0; i
// Lite annorlunda, detta gör regnbågen lika fördelad över hela
void rainbowCycle (uint8_t wait) {uint16_t i, j;
för (j = 0; j <256*5; j ++) {// 5 cykler av alla färger på hjulet för (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); fördröjning (vänta); }}
// Krypande lampor i teaterstil.
void theaterChase (uint32_t c, uint8_t wait) {för (int j = 0; j <10; j ++) {// gör 10 cykler med att jaga efter (int q = 0; q <3; q ++) {för (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // slå på var tredje pixel} strip.show ();
fördröjning (vänta);
för (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // stäng av var tredje pixel}}}}
// Krypande lampor i teaterstil med regnbågseffekt
void theaterChaseRainbow (uint8_t wait) {för (int j = 0; j <256; j ++) {// cykla alla 256 färger i hjulet för (int q = 0; q <3; q ++) {för (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, Wheel ((i+j) % 255)); // slå på var tredje pixel} strip.show ();
fördröjning (vänta);
för (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // stäng av var tredje pixel}}}}
// Ange ett värde 0 till 255 för att få ett färgvärde.
// Färgerna är en övergång r - g - b - tillbaka till r. uint32_t Wheel (byte WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) {WheelPos -= 85; returremsa. Färg (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; returremsa. Färg (WheelPos * 3, 255 - WheelPos * 3, 0); }
void Switched () {
strip.show (); readSamples (); }
Innan jag blir slaktad i kommentarerna (kom ihåg Be Nice -policyn !!) insåg jag efter att jag hade laddat upp detta hur slarvig en del av min kod är. Det finns ingen anledning att ständigt testa både Pin 4 och Pin 8 för HIGH. Eftersom omkopplaren är enpolig dubbelkastning kan värdet på den ena härledas från den andra: du behöver bara testa en. Så du kan gå igenom och ta bort varje referens till att läsa och skriva MusicButtonState och helt enkelt köra hela saken mer effektivt genom att testa SwirlButtonState, om du har lågt minne eller utökar med andra rutiner. Men koden ovan fungerar.
Och om någon vill justera dessa ljudrutiner för att inte bara känna av ljudnivåer utan också frekvens och skriva en smidig kod för att glida upp och ner i ljusspektrumet som svar på rörelser längs ljudspektrumet, släpp en länk i kommentarerna till hur du gjorde det.
Njut av!
Rekommenderad:
Neopixel Ws2812 Rainbow LED-glöd med M5stick-C - Köra Rainbow på Neopixel Ws2812 Använda M5stack M5stick C Använda Arduino IDE: 5 steg
Neopixel Ws2812 Rainbow LED-glöd med M5stick-C | Köra Rainbow på Neopixel Ws2812 Använda M5stack M5stick C Använda Arduino IDE: Hej killar i denna instruktioner kommer vi att lära oss hur man använder neopixel ws2812 lysdioder eller ledremsor eller ledmatris eller ledring med m5stack m5stick-C utvecklingsbräda med Arduino IDE och vi kommer att göra ett regnbågsmönster med det
Rainbow Word Clock med en fullständig Rainbow -effekt och mer: 13 steg (med bilder)
Rainbow Word Clock Med Full Rainbow Effect och mer: Mål1) Simple2) Inte dyrt3) Så energieffektivt som möjligt Rainbow Word Clock med full regnbågeffekt.En Smiley på Word Clock.Enkel IR-fjärrkontroll Uppdatera 03-nov-18 LDR för ljusstyrkekontrollen för neopixlarna Uppdatera 01-jan-
Pull the Light - Light Module Using Neopixel & Pull Up Switch: 6 Steg (med bilder)
Dra i ljuset - ljusmodul med hjälp av Neopixel & Pull Up Switch: Funktioner i ljusmodulen Arduino Uno Hardware & kapsling köpt från internet Neopixel & Strömförsörjning lånad från School of Informatics & Produktdesign Ljusmodul som styrs av strömförsörjning Alla funktioner som styrs via
Coke Machine Level Detector - Nu med tal !: 6 steg (med bilder)
Coke Machine Level Detector-Now With Speech !: Detta projekt är en remix av min Coke Machine Can Level detector, (https://www.instructables.com/id/Coke-Machine-Can-Level-Detector/) med nya sensorer , och tillägg av talat ljud! Efter att jag gjort min första nivådetektor lade jag till en piezo -summer till g
Felt & Neopixel Rainbow Crown: 8 steg (med bilder)
Felt & Neopixel Rainbow Crown: I helgen gjorde jag en upplyst, neopixelaktiverad krona för min 3-åriga kusin. Hon verkar alltid ganska tagen med mina upplysta kontraster så jag tänkte att det var dags att hon hade en egen. Det ser ganska coolt ut, och jag skulle vilja indoktrinera han