Inhaltsverzeichnis:

Arduino & Neopixel Cola Bottle Rainbow Party Light - Gunook
Arduino & Neopixel Cola Bottle Rainbow Party Light - Gunook

Video: Arduino & Neopixel Cola Bottle Rainbow Party Light - Gunook

Video: Arduino & Neopixel Cola Bottle Rainbow Party Light - Gunook
Video: Arduino & Neopixel Coke Bottle Party Light 2024, November
Anonim
Image
Image

Also entdeckt mein Sohn Doon ein sehr cooles Partylicht aus alten Cola-Flaschen und den klebrigen Innereien von Glow Sticks und fragt, ob wir eines für seine bevorstehenden Schulprüfungen Are Over Blowout PartAYYY machen können!!! Ich sage sicher, aber würden Sie nicht lieber ein paar dieser schicken Adafrucht-Neopixel-Ringe haben, über die wir gelesen haben … Er starrt mich ausdruckslos an. Denn Tatsache ist, dass er nicht weiß, wovon ich rede, aber Dad hat eine Gelegenheit entdeckt, mit diesen Neopixel-Ringen zu spielen, von denen er gelesen hat, und wir alle wissen, dass einer der 10 wichtigsten Gründe, warum Geek-Väter sich fortpflanzen, darin besteht, einen zu haben Entschuldigung, mit coolen Geräten zu spielen, von denen jeder sagt, dass sie für ihre Kinder sind.

Dies ist ein supereinfaches Projekt, das wirklich toll aussieht. Wir bauten unsere aus 3 alten Cola-Flaschen, einer Holzplatte und einer Spielplatzpfostenhalterung - Sachen, die im Keller herumlagen - kombiniert mit einem Arduino (in unserem Fall Leonardo, aber jedes Genuino-Board reicht!) und drei Neopixel-Ringen. Ich bestellte einen 9-LED-Ring, landete aber bei einem 12-LED-Ring zum gleichen Preis. Was süß war, aber eine Überarbeitung der Brunnenlöcher bedeutete – die 12-LED-Ringe sind 35 mm breit, im Gegensatz zu 23 mm. Was du brauchen wirst:

  • Genuino/Arduino-Board (Wir haben ein Leonardo verwendet, aber fast jedes Board wird es tun)
  • 3 Neopixel-Ringe (jeweils 12 LEDs): Hol sie dir von Adafruit und unterstütze diese feinen Leute
  • 1000 µf 6,3 V oder besser Kondensator
  • 300-500 Ohm Widerstand
  • Eine Holzplatte oder ein Stück Altholz oder irgendetwas, in das Sie die Neopixel setzen und die Cola-Flaschen darauf stellen können
  • Irgendeine Form der Halterung für die Platte - eine Spielplatzpfostenhalterung hat bei uns hervorragend funktioniert
  • 9v Wandwarze
  • 40mm Lochbohrer
  • Schrauben, Muttern, Unterlegscheiben, Distanzstücke
  • Vollkerndraht
  • Ein Lötkolben und Lot
  • Steckbrett
  • Ein Plastikgehäuse für den Arduino. Sie können wirklich schöne, perfekt passende Kunststoffkoffer kaufen, die aus Millionen Jahre altem Erdöl hergestellt wurden, das in einer fragilen Umgebung aus dem Boden gebohrt und auf der anderen Seite des Planeten hergestellt und in einem Container mit all dem in ein Lager in Ihrer Nähe geliefert wurde Öffnungen in perfekter Ausrichtung herausgeschnitten und von einem Lieferwagen an Ihre Tür geliefert, der Kohlendioxid in die Atmosphäre spuckt. Oder Sie machen es wie ich und verwenden eine alte ausrangierte Plastikbox.. in diesem Fall eine Madagaskar-Pflasterbox, die im Medizinschrank herumliegt… und ein paar Löcher darin bohren. Hier endet die Vorlesung. Lasst uns machen…

Schritt 1: Machen Sie die Basis

Machen Sie die Basis
Machen Sie die Basis
Machen Sie die Basis
Machen Sie die Basis

Sie können Ihre Basis aus allem, was Sie in Ihrem eigenen Keller haben, improvisieren oder einfach eine Holzkiste oder etwas verwenden, das Ihre Elektronik verbirgt.

Zuerst bohrten wir drei Löcher, gleichmäßig verteilt auf der Holzplatte, groß genug, damit die Neopixel-Ringe hineinpassen. Im Bild sind die Löcher mit einem Spatenbohrer gebohrte Löcher. Am Ende mussten wir wegen der größeren Größe der 12-LED-Ringe Löcher mit einem Bohrer bohren. Dies bedeutete, dass ich den ganzen Weg durch die Platte ging, und anstatt die Ringe schön in ihre fein gearbeiteten kleinen 2 mm tiefen Vertiefungen mit einem Mittelloch für eine saubere Drahtführung zu stecken, befestigte ich die Ringe schließlich mit … ähm … Klebeband über den Boden der Platte. Urteile nicht. Sie können die Unterseite der Platte in meinem Design sowieso nicht sehen. Und es ist dunkel, wenn es an ist. Und außerdem - was ist mit Klebeband los?

Ich brauchte einen Abstand zwischen der Platte und der Halterung für ein Steckbrett auf der Unterseite der Platte und eine Komponente - den Kondensator und für die Drahtverläufe, die vom Steckbrett zum Arduino gehen müssten, das ich in die Halterung stecken wollte. Also habe ich einen Satz provisorischer Abstandshalter auf die Bolzenschäfte gelegt, um genug Spiel zu haben - ungefähr 3 cm, die Höhe des Steckbretts und ein bisschen, damit Sie die Verkabelung nicht zerquetschen. Ich habe zwei hölzerne Ankerbolzen pro Ecke verwendet, weil sie die richtige Höhe hatten und in der Schublade des Mannes herumlagen… diese Kiste mit losen Schrauben, Bolzen, Nägeln, rostigen Kettengliedern, Schlauchkupplungen, alten Münzen, unerwartet scharfen Gegenständen und so weiter von Kleinigkeiten, die Ihnen auf magische Weise einen Gang zum Baumarkt ersparen können, indem Sie, wenn nicht genau das, was Sie brauchen, etwas anbieten, das gut funktioniert.

Glücklicher Zufall über den Spielplatzpfosten, den ich im Keller gefunden habe, war, dass bereits Löcher durch die Platte liefen. Sie müssen kein Eisen bohren! Die Basis hatte vier Schraubenlöcher, und wir bohrten vier Senklöcher in die Holzplatte passend.

Das Ganze haben wir dann Gothic Black gesprüht.

Schritt 2: Vorbereiten der Neopixel-Ringe

Vorbereitung der Neopixel-Ringe
Vorbereitung der Neopixel-Ringe

Sie müssen Drähte an Ihre Neopixel-Ringe löten: ein Data-In-Kabel für alle, ein Data-Out-Kabel für zwei von ihnen und Strom und Masse für jeden. Welche Länge Sie auch benötigen, fügen Sie einige hinzu. Sie können überschüssigen Draht immer abschneiden, einen zu kurzen nicht strecken. Und beachten Sie die Warnung von Adafruit:

Beim Löten von Drähten an diese Ringe müssen Sie besonders auf Lötflecken und Kurzschlüsse achten. Der Abstand zwischen den Komponenten ist sehr eng! Am einfachsten ist es oft, den Draht von vorne einzuführen und auf der Rückseite zu löten.

Ich wünschte, ich hätte das gelesen, bevor ich nach vorne gelötet habe. Ich schaffte es, keine meiner LEDs durchzubrennen, aber ich verbrannte den Rand einer auf eine Weise, die mich schwitzen ließ, bis ich sie einschaltete. Hätte ich das gute Handbuch gelesen, hätte ich auch die Warnung gelesen, keine Krokodilklemme auf die LED zu legen. Lass meine Beinahe-Schiffswracks dein Leuchtturm sein.

Neopixel-Ringe in Daisy-Chain, was bedeutet, dass Sie alle ihre LEDs gleichzeitig von einem Arduino aus steuern können, indem Sie einen Draht vom OUT eines Rings mit dem IN eines anderen verbinden. Jeder Ring benötigt auch Strom- und Erdungskabel.

Schritt 3: Die Verkabelung

Die Verkabelung
Die Verkabelung

Verdrahten Sie es wie im obigen Fritzing - Pin 6 des Arduino bringt die Daten zum ersten Ring, der Data-out von diesem Ring geht zum Data-in des nächsten, der Data-out von diesem geht zum Data-In des letzten Klingelns. Sie benötigen das Datenausgangskabel des letzten Rings nicht.

Die Kapazität von 1000 µf geht zwischen den positiven und negativen Schienen des Steckbretts. Diese Kappe schützt die Ringe vor Stromspitzen und wird von der Best-Practice-Sektion des Adafruit NeoPixel Uberguide empfohlen. Der Widerstand auf dem Dateneingang bis zum ersten Neopixel wird auch von Adafruit empfohlen - er beträgt 1K im Fritzing, aber der empfohlene Widerstand beträgt 300-500 Ohm.

In meinem Build habe ich die Drähte von den Neopixels über die Rückseite der Platte zu einem in der Mitte befestigten Steckbrett geführt. Auf diese Weise müssen Sie nur drei lange Kabel in die Basiseinheit führen: Strom, Masse und Daten. Ich habe diese Drähte superlang gemacht - es gibt viel Stauraum in der Basis, und es macht es bequem, die Platine zum Neuprogrammieren herauszuziehen.

Schritt 4: Der Code

"loading="lazy" erwähnte, dass mein Sohn eine musikreaktive Version davon haben wollte. Es dauerte bis zu seinem 18. Geburtstag, um es zu bekommen, aber hier ist es!

Zusätzliche Ausrüstungsgegenstände:

1 einpoliger Doppelschalter1 Mikrofon mit automatischer Verstärkungsregelung (ich habe den MAX9184 von AdaFruit verwendet) 1 1uF-100uF Kondensator (jeder Wert)

Das Mikrofon muss wirklich eine automatische Verstärkungsregelung haben, damit dies richtig funktioniert. AGC tastet ständig das Umgebungsgeräusch ab und erhöht und senkt den Schwellenwert, den es als Hintergrund betrachtet, sodass Ihr Licht auf Spitzen vor diesem Hintergrund reagiert. Das Mikrofon von AdaFruit ist brillant: Sie können von einem stillen Raum, in dem der Klang einer einzelnen Stimme es auslöst, in den vollen Party-Modus mit einem Raum voller Teenager und dröhnender Musik wechseln, und es nimmt den Takt der Musik einfach auf fein. Die Alternative, ein Adjustable Gain Mic, hat ein winziges Potentiometer auf der Platine, das unglaublich filigran und fummelig ist. Es braucht nicht viel Änderung der Umgebungsgeräusche, um das Gerät unbrauchbar zu machen: Lichter ständig an oder dunkel. AGC funktioniert wie von Zauberhand.

Ich wollte die Möglichkeit haben, das Wirbeltestmuster oder die Musik zu verwenden, also habe ich die mittlere Leitung eines Schalters mit VIN und eine Leitung mit Pin 4 und die andere mit Pin 8 des Leonardo verbunden. Indem wir diese Pins auf HIGH oder LOW testen, können wir wissen, in welchem Zustand sich der Schalter befindet, und den Code entsprechend verzweigen.

Schritt 7: Verdrahten des Mikrofons

Verkabeln des Mikrofons
Verkabeln des Mikrofons

Führen Sie den Mikrofoneingang über diesen 1-100µF-Kondensator in den analogen Pin 0 ein. Wenn Ihr Kondensator polarisiert ist, geht der Ausgangspin auf die positive Seite (grünes Kabel).

Danke an CodeGirlJP für ihre Trinket-Color-by-Sound-Routine, die ich unten angepasst habe:

// Soundaktivierte LEDs mit Arduino und NeoPixels

#enthalten

#define MIC_PIN A0 // Mikrofon ist an Pin a0 des Leonardo angeschlossen

#define LED_PIN 6 // NeoPixel LED-Strang an Pin 6 des Leonardo befestigt #define N_PIXELS 36 // Pixelanzahl im LED-Strang !!!!!! Passen Sie die Anzahl der Pixel in Ihrem Setup an. Dies gilt für 3 Neopixel-Ringe !!!!!! #define N 100 // Anzahl der Samples, die jedes Mal genommen werden sollen, wenn readSamples aufgerufen wird #define fadeDelay 5 // Verzögerungszeit für jeden Fade-Betrag #define noiseLevel 30 // Steigungspegel des durchschnittlichen Mikrofonrauschens ohne Ton

// Initialisieren Sie den NeoPixel-Streifen mit den oben definierten Werten:

Adafruit_NeoPixel-Streifen = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int-Samples[N]; // Speicher für ein Sample Collection Set

int periodFactor = 0; // Verfolgen Sie die Anzahl der ms für die Periodenberechnung int t1 = -1; // Steigungszeiten > 100 erkannt. int T; // Zeitraum zwischen den Zeiten skaliert auf Millisekunden Int Steigung; // die Steigung von zwei gesammelten Datenabtastpunkten byte periodChanged = 0; const int SwitchPinMusic = 4; // Pin für Schalterposition Musikempfindlichkeit const int SwitchPinSwirl = 8; // Pin für Schalterstellung Test Pattern (Swirl) int MusicbuttonState = 0; // Ein-Aus-Logikvariable für Musikempfindlichkeit

// Arduino-Setup-Methode

Leere Einrichtung () {

strip.begin();

ledsOff(); Verzögerung (500); displayColor (Rad (100)); Strip-Show(); Verzögerung (500); ungerades Rad (Rad (100)); Strip-Show(); Verzögerung (500); pinMode (SwitchPinMusic, EINGANG); pinMode (SwitchPinSwirl, INPUT); //attachInterrupt (4, Switched, FALLING);

}

// Arduino-Schleifenmethode

Void Schleife () { SwirlbuttonState = digitalRead (SwitchPinSwirl); // HOCH, wenn Schalter auf Musikempfindlichkeit eingestellt ist MusicbuttonState = digitalRead (SwitchPinMusic); // HOCH, wenn Schalter auf Testmuster gesetzt ist, während (SwirlbuttonState == LOW) {readSamples (); // Führen Sie die Musik-Sampling-Routine aus SwirlbuttonState = digitalRead (SwitchPinSwirl); // Überprüfen Sie, ob der Schalter geändert wurde} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) { Dance(); // Führen Sie die verwirbelte Testmusterroutine aus SwirlbuttonState = digitalRead (SwitchPinSwirl); // Überprüfen Sie, ob der Schalter geändert wurde

}

}

leerer Tanz () {

Während (SwirlbuttonState == HIGH) { colorWipe (strip. Color (255, 0, 0), 50); // Roter SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe(strip. Color(0, 255, 0), 50); // Grüner SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe(strip. Color(0, 0, 255), 50); // Blauer SwirlbuttonState = digitalRead (SwitchPinSwirl); // colorWipe (strip. Color (0, 0, 0, 255), 50); // Weiß RGBW // Sende eine Theaterpixelverfolgung in… SwirlbuttonState = digitalRead(SwitchPinSwirl); theaterChase (strip. Color (127, 127, 127), 50); // Weiß SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (127, 0, 0), 50); // Roter SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (0, 0, 127), 50); // Blauer SwirlbuttonState = digitalRead (SwitchPinSwirl); Regenbogen (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); RegenbogenZyklus(20); SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChaseRainbow(50); SwirlbuttonState = digitalRead (SwitchPinSwirl); } } // Sample-Daten vom Mikrofon lesen und verarbeiten void readSamples () { for(int i=0; i0) { Steigung = Samples - Samples[i-1]; aufrechtzuerhalten. Sonst { Steigung = Samples – Samples[N-1]; } // Prüfen, ob Slope größer als NoiseLevel - Schall, der nicht auf dem Noise-Pegel liegt, erkannt if(abs(slope)> noiseLevel) { if(slope <0) {calculatePeriod(i); if (periodChanged == 1) { displayColor (getColor (T)); } } } Else {ledsOff (); // theaterChaseRainbow(50); } periodFaktor += 1; Verzögerung(1); } }

void berechnePeriode(int i)

{ if(t1 == -1) { // t1 wurde nicht gesetzt t1 = i; aufrechtzuerhalten. Sonst {// t1 wurde so eingestellt, dass Calc period int period = periodFactor * (i - t1); periodChanged = T==Periode ? 0: 1; T = Periode; //Seriell.println (T); // t1 auf neuen i-Wert zurücksetzen t1 = i; Periodenfaktor = 0; } }

uint32_t getColor(int Periode)

{ if(Periode == -1) return Wheel(0); sonst if(Periode > 400) return Wheel(5); else return Wheel(map(-1*period, -400, -1, 50, 255)); }

Void FadeOut()

{ for(int i=0; i<5; i++) { strip.setBrightness(110 - i*20); Strip-Show(); // Streifenverzögerung aktualisieren (fadeDelay); periodFactor +=fadeDelay; } }

Leere Einblendung ()

{ strip.setBrightness (100); Strip-Show(); // Streifen aktualisieren // Farbe einblenden for(int i=0; i<5; i++) { //strip.setBrightness (20*i + 30); //Strip-Show(); // Streifenverzögerung aktualisieren (fadeDelay); periodFactor+=fadeDelay; } }

Leere LEDsOff()

{ ausblenden(); for(int i=0; i

void displayColor(uint32_t color)

{ for(int i=0; i

void oddWheel(uint32_t Farbe)

{ for (int j=0; j < 256; j++) { // zyklisch alle 256 Farben im Rad für (int q=0; q < 3; q++) { for (uint16_t i=24; i < 36; i =i+3) { strip.setPixelColor(i+q, Wheel((i+j) % 255)); // jedes dritte Pixel einschalten} strip.show();

Verzögerung(1);

für (uint16_t i = 24; i < 36; i = i + 3) { strip.setPixelColor (i + q, 0); // jeden dritten Pixel ausschalten}}} FadeIn (); }

// Fülle die Punkte nacheinander mit einer Farbe

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

void rainbow(uint8_t warte) {

uint16_t i, j;

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

// Etwas anders, dadurch ist der Regenbogen gleichmäßig verteilt

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

for(j=0; j<256*5; j++) {// 5 Zyklen aller Farben auf dem Rad for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255); } Strip-Show(); verzögern (warten); } }

// Kriechende Lichter im Theaterstil.

void theaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { // 10 Zyklen jagen für (int q=0; q < 3; q++) { for (uint16_t i= 0; i < strip.numPixels(); i = i + 3) { strip.setPixelColor (i + q, c); // jedes dritte Pixel einschalten} strip.show();

verzögern (warten);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); // jedes dritte Pixel ausschalten } } } }

// Kriechende Lichter im Theaterstil mit Regenbogeneffekt

void theaterChaseRainbow(uint8_t wait) { for (int j=0; j < 256; j++) {// alle 256 Farben im Rad durchlaufen 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)); // jedes dritte Pixel einschalten} strip.show();

verzögern (warten);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); // jedes dritte Pixel ausschalten } } } }

// Geben Sie einen Wert von 0 bis 255 ein, um einen Farbwert zu erhalten.

// Die Farben sind ein Übergang r - g - b - zurück nach 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; Return strip. Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; Return strip. Color (WheelPos * 3, 255 - WheelPos * 3, 0); }

Void Switched(){

Strip-Show(); readSamples(); }

Bevor ich in den Kommentaren abgeschlachtet werde (denken Sie an die Be Nice Policy!!), wurde mir nach dem Hochladen klar, wie schlampig mein Code ist. Es ist nicht erforderlich, Pin 4 und Pin 8 ständig auf HIGH zu testen. Da der Schalter einpoliger Doppelhub ist, kann der Wert des einen vom anderen abgeleitet werden: Sie müssen nur einen testen. Sie können also alle Verweise auf das Lesen und Schreiben des MusicButtonState durchgehen und entfernen und das Ganze einfach effizienter ausführen, indem Sie SwirlButtonState testen, wenn Sie wenig Speicher haben oder mit anderen Routinen erweitern. Aber der obige Code funktioniert.

Und wenn jemand diese Audioroutinen optimieren möchte, um nicht nur den Geräuschpegel, sondern auch die Frequenz zu erfassen, und einen glatten Code schreiben, um das Lichtspektrum als Reaktion auf Bewegungen entlang des Audiospektrums nach oben und unten zu verschieben, fügen Sie einen Link in die Kommentare zu wie du es getan hast.

Genießen!

Empfohlen: