Hallo en welkom bij het laatste deel van onze Disco Glass serie.
In het deel van vandaag zullen we alle relevante informatie voor de bouw van de bril samenvatten, enkele foto's van de animatiesequenties laten zien en natuurlijk onze bril weer een functionele upgrade geven.De functie upgrade bestaat uit een vibratiesensor, geactiveerd door uw dansbewegingen in de disco, om onze Micro Controller informatie te geven over uw "dansgedrag" op de dansvloer.De lichtsequenties van de glazen worden beheerst door deze informatie.
Met andere woorden, je bril reageert op je ritmische dansbewegingen.Hoe werkt het technisch gezien?
Als kernelement hebben we eerst een vibratiesensor nodig.Dit is beschikbaar in de winkel in verschillende versies.Elk van deze sensoren reageert iets anders op bewegingen.Het eindresultaat hangt natuurlijk ook af van de gebruikte sensor.Ik raad aan dat KY-002n Sensormodule voor gebruik als vibratiesensor.Ik heb dit ook in mijn eigen experimentele bouw.ten gebruikt bij het ontwikkelen van de code. Het is belangrijk dat de sensor wordt geactiveerd door massa.Dit betekent dat in geval van een "shock", de gebruikte sensor het contact na GND voor een korte tijd afsluit.
Type: Indien nodig, probeer dan verschillende sensoren van jezelf om je beste resultaat te bereiken.Een selectie van alternatieve sensoren vindt u aan het einde van deze blog!
De tweede nieuwe hardware component vereist een nog eenvoudiger schakelaar.Deze schakelaar wordt gebruikt om te schakelen tussen de oude, van deel 2 bekende, op de nieuwe modus die reageert op de bewegingen.Het schakelen tussen de modi kan op elk moment gebeuren.Bijvoorbeeld tijdens een lopend programma!
Nu komen we bij de bedrading van de twee nieuwe componenten in onze glazen.
Zoals te zien is op het schakelbord, zit de trillingsensor tussen GND en Port 10 en de schakelaar tussen GND en Port 11 van de processor.De bedrading van de knop is niet veranderd:
Ook de bedrading van de twee WS2812 ringen is niet veranderd in vergelijking met het vorige deel van de serie:
Na de hardware update upload u de volgende functioneel bijgewerkte code naar uw bril:
"35; omvat <NeoPixel Adafruit.H> 35; definieer VERANDERING VAN BUTTON 12 Digitale IO pin aangesloten op de knop.Dit wordt // aangedreven met een opstartweerstand zodat de schakelaar Trek de pin onmiddellijk aan de grond.Op een hoge > laag // transitie van de knop drukt de logica uit. 35; definieer PIXEL PIN 6 Digitale IO pin verbonden met de NeoPixels. 35; definieer SENSOR SCHOOK 10 Shock/Vibration Sensor bevestigd 35; definieer MOD VAN SCHUW 11 // Werkmodus 35; definieer PIXEL AFKENING 24 Alle pixels op Strip 35; definieer MaxAninmationsAvail 4 NeoPixel Adafruit strip = NeoPixel Adafruit(PIXEL AFKENING, PIXEL PIN, NEO RGB + NIEUW KHZ800); const int Hue = 0; const int HuearHigh.kgm = 255; const int hue = 170; const int angleMin = 0; const int angleSector = 60; const int AngleMax = 360; const int helder = 0; const int BrightMax = 255; uitwisseling Whoo!, helderheid; // De verzadiging is vastgesteld op 255 (vol) om blead-through van verschillende /kleuren. uitwisseling verzadiging = 255; // Interrut Control Bool. A60telSecuptOcced = waar; Bool. Werkmodus = Vals; uitwisseling A60telSecunds24 = 0; uitwisseling A4telSecunds24 = 0; // Tijdvariabelen int Tijdsecondes = 0; // Counter int TijdAlarmSetComment = 15; // 15 Tweede Timer Bool. TimeStartFlagName = Vals; Bool. TijdStop = waar; Werkhandboek Bool. ButtopAPress = Vals; AnimationControl int ShoulAnimatie = 0; int Animatie = 0; int OLDLIGHEID = 0; Bool. Opstijgen = Vals; Bool. OLDONOFF = Vals; Bool. PlayIntro = Vals; Play Intro Bool. Spelanderen = Vals; Spel andere Bool. Animatie = Vals; Bool. RunONE. = waar; // Stroom uit Animatie-Anmation universelevariabelen uitwisseling a, c, d, E, f; ongeschikt int r, g, b; Interrupted Routines ISR(TIMER1 COMP vector) { Bool. LED, Druk; Druk = digitalileComment(VERANDERING VAN BUTTON); Lees knop Push Werkmodus = digitalileComment(MOD VAN SCHUW); indien ((Druk == LOW) en (ButtopAPress == Vals)) { ButtopAPress = waar; } NT1 = 0; // Initialisatieregister } /Interrupts end Start Main Program Leeg setup() { strip.start(); strip.tonen(); Initialiseren pixels om'off' PinMode(VERANDERING VAN BUTTON, Input PULLUP); PinMode(SENSOR SCHOOK, Input PULLUP); PinMode(MOD VAN SCHUW, Input PULLUP); randomSeed(analoog(0)); niet onderbroken(); Alle onderbrekingen uitschakelen TCCR1 = 0x00; TCCR1B = 0x02; NT1 = 0; // Initialisatieregister OCR1A = 33353; // Laad uitvoerbaarvergelijkend register TIJD |= (1 << OCIA1A); // Timer-vergelijking activeren onderbroken interrupts(); Alle onderbrekingen activeren } Helper Functies Leeg HSBT ( ongeschikt int inHue, ongeschikt int inverzadiging, ongeschikt int inBrightness, ongeschikt int *O, ongeschikt int *O, ongeschikt int *o ) { indien (inverzadiging == 0) { // achromatische (grijs) *O = *O = *o = inBrightness; } sm { ongeschikt int scaledHue = (inHue * 6); ongeschikt int sector = scaledHue >> 8; //sector 0 tot en met 5 rond het kleurenwiel ongeschikt int offset = scaledHue - (sector << 8); // positie binnen de sector ongeschikt int p = (inBrightness * ( 255 - inverzadiging )) >> 8; ongeschikt int q = (inBrightness * ( 255 - ((inverzadiging * offset) >> 8) )) >> 8; ongeschikt int t = (inBrightness * ( 255 - ((inverzadiging * ( 255 - offset )) >> 8) )) >> 8; schakelaar ( sector ) { geval 0: *O = inBrightness; *O = t; *o = p; breuk; geval 1: *O = q; *O = inBrightness; *o = p; breuk; geval 2: *O = p; *O = inBrightness; *o = t; breuk; geval 3: *O = p; *O = q; *o = inBrightness; breuk; geval 4: *O = t; *O = p; *o = inBrightness; breuk; standaard: /zaak 5: *O = inBrightness; *O = p; *o = q; breuk; } } } Leeg ControleConfig () / Interrupt Routine { Bool. Druk; indien (ButtopAPress == waar) { indien (ShoulAnimatie < MaxAninmationsAvail ) { ShoulAnimatie++; } sm { ShoulAnimatie = 0; } vertraging(400); ButtopAPress = Vals; } } Leeg Controle () { int GetSelAnimatieGenericName = 0; indien (Opstijgen != OLDONOFF) { OLDONOFF = Opstijgen; indien (Opstijgen) { ShoulAnimatie = 1; } sm { ShoulAnimatie = 0; } } } Main Loop... Leeg ren() { Controle(); RunAnimaties(); ControleConfig(); } Main Loop... Intros Leeg Aftellen van Intro (uitwisseling r, uitwisseling g, uitwisseling b, int vertraging, Bool. jij) { indien (jij) { voor ( int i = 0; i < strip.Nupixels(); i++) { strip.setPixel(i, r, g, b); Calculate RGB-waarden voor Pixel strip.tonen(); // Resultaten tonen:) vertraging(vertraging); } } sm { voor ( int i = 0; i < strip.Nupixels() + 1; i++) { uitwisseling p = strip.Nupixels() - i; strip.setPixel(p, r, g, b); Calculate RGB-waarden voor Pixel strip.tonen(); // Resultaten tonen:) vertraging(vertraging); } } } Leeg Intro RaiseRegenboog(Bool. Opstaan.) { helderheid = 255; int Regenboog = 0; indien (Opstaan.) { voor (int i = 0; i < strip.Nupixels(); i++) { Whoo! = Map(i + Regenboog, angleMin, 60, Hue, HuearHigh.kgm); Set Color HSBT(Whoo!, verzadiging, helderheid, &r, &g, &b); Set Color strip.setPixel(i, r, g, b); Calculate RGB-waarden voor Pixel strip.tonen(); vertraging(40); } } sm { voor (int i = 0; i < strip.Nupixels(); i++) { strip.setPixel(i, 0, 0, 0); strip.tonen(); vertraging(40); } } } Animations Outros Leeg Ani allOffComment () { voor ( int i = 0; i < strip.Nupixels(); i++) { strip.setPixel(i, 0, 0, 0); Alles uit. } strip.tonen(); } Leeg Ani Allon (uitwisseling r, uitwisseling g, uitwisseling b) { voor ( int i = 0; i < strip.Nupixels(); i++) { strip.setPixel(i, r, g, b); Alles op } strip.tonen(); } Leeg Noch Starhower. () { int array[10] ; Bool. schokwaarde = waar; Bool. Druk = waar; voor ( int i = 0; i < strip.Nupixels(); i++) { strip.setPixel(i, 0, 0, 15); Allemaal op blauwe basis } voor (int i = 0; i < 10; i++) { int geselecteerd = willekeurig(strip.Nupixels()); strip.setPixel(geselecteerd, 255, 255, 255); Wit } strip.tonen(); vertraging(100); voor ( int i = 0; i < strip.Nupixels(); i++) { strip.setPixel(i, 0, 0, 15); Allemaal op blauwe basis } strip.tonen(); indien (Werkmodus) { vertraging(500); } sm { sm { schokwaarde = digitalileComment(SENSOR SCHOOK); Druk = digitalileComment(VERANDERING VAN BUTTON); Werkmodus = digitalileComment(MOD VAN SCHUW); } terwijl ((schokwaarde) && (!Werkmodus) && ( Druk)) ; } } Leeg Ani Regenboog(uitwisseling vertraging) { helderheid = 100; int Regenboog = 0; Bool. schokwaarde = waar; Bool. Druk = waar; sm { voor (int i = 0; i < strip.Nupixels(); i++) { Whoo! = Map(i + Regenboog, angleMin, 60, Hue, HuearHigh.kgm); HSBT(Whoo!, verzadiging, helderheid, &r, &g, &b); strip.setPixel(i, r, g, b); } strip.tonen(); // Resultaten tonen:) indien (Werkmodus) { vertraging(vertraging); } sm { sm { schokwaarde = digitalileComment(SENSOR SCHOOK); Druk = digitalileComment(VERANDERING VAN BUTTON); Werkmodus = digitalileComment(MOD VAN SCHUW); } terwijl ((schokwaarde) && (!Werkmodus) && ( Druk)) ; } Regenboog++ ; } terwijl (Regenboog < 61); } Leeg Ani twee kleur () { Bool. schokwaarde = waar; Bool. Druk = waar; uitwisseling Dividenden = willekeurig (1, 10); Bool. kleur; int x = 1; b = 0; voor (int S = 0; S > -1; S = S + x) { kleur = Vals; voor ( int i = 0; i < strip.Nupixels(); i++) { a = i / Dividenden; indien (!(a == b)) { b = a; kleur = !kleur; } indien (kleur) { strip.setPixel(i, 0, S, 0); //green } indien (!(kleur)) { strip.setPixel(i, S, 0, 0); /rood } } strip.tonen(); indien (S == 255) { indien (Werkmodus) { x = -1; vertraging(200); } sm { sm { schokwaarde = digitalileComment(SENSOR SCHOOK); Druk = digitalileComment(VERANDERING VAN BUTTON); Werkmodus = digitalileComment(MOD VAN SCHUW); } terwijl ((schokwaarde) && (!Werkmodus) && ( Druk)) ; x = -1; } } vertraging(10); } strip.tonen(); } Leeg Kerstavond() { Bool. schokwaarde = waar; Bool. Druk = waar; a = -10; voor (int i = 0; i < strip.Nupixels(); i++) { strip.setPixel(i, willekeurig(1, 254), willekeurig(1, 204), willekeurig(1, 254)); E = E + a; f = f + a; indien (f <= 0) { a = +10; } indien (f >= 60) { a = -10; } } strip.tonen(); // Resultaten tonen:) indien (Werkmodus) { vertraging(300); } sm { sm { schokwaarde = digitalileComment(SENSOR SCHOOK); Druk = digitalileComment(VERANDERING VAN BUTTON); Werkmodus = digitalileComment(MOD VAN SCHUW); } terwijl ((schokwaarde) && (!Werkmodus) && ( Druk)) ; } } Leeg Fade () { uitwisseling helderheid = 0; uitwisseling verzadiging = 0; int Kleuren = 49 ; sm { voor (int i = 0; i < strip.Nupixels(); i++) { HSBT(Kleuren, verzadiging, helderheid, &r, &g, &b); Set Color strip.setPixel(i, r, g, b); Calculate RGB-waarden voor Pixel } helderheid ++; strip.tonen(); // Resultaten tonen:) vertraging(40); } terwijl (helderheid < 50); } Leeg RunAnimaties() { indien (!(ShoulAnimatie == Animatie)) { Spelanderen = waar; Animatie = waar; } schakelaar (Animatie) { geval 0: Alle LedsOFF indien (PlayIntro) { PlayIntro = Vals; RunONE. = waar; } indien ((!(PlayIntro)) && (!(Spelanderen))) { indien (RunONE.) { Ani allOffComment (); } RunONE. = Vals; } indien (Spelanderen) { Spelanderen = Vals; PlayIntro = waar; RunONE. = waar; Animatie = ShoulAnimatie; } breuk; geval 1: indien (PlayIntro) { Aftellen van Intro (0, 0, 15, 100, waar); PlayIntro = Vals; } indien ((!(PlayIntro)) && (!(Spelanderen))) { Noch Starhower.(); } indien (Spelanderen) { Aftellen van Intro (0, 0, 0, 100, Vals); Spelanderen = Vals; PlayIntro = waar; Animatie = ShoulAnimatie; } breuk; geval 2: indien (PlayIntro) { Intro RaiseRegenboog(waar); PlayIntro = Vals; } indien ((!(PlayIntro)) && (!(Spelanderen))) { Ani Regenboog(20); } indien (Spelanderen) { Intro RaiseRegenboog(Vals); Spelanderen = Vals; PlayIntro = waar; Animatie = ShoulAnimatie; } breuk; geval 3: indien (PlayIntro) { Ani allOffComment (); PlayIntro = Vals; } indien ((!(PlayIntro)) && (!(Spelanderen))) { Ani twee kleur (); (byte hue, byte tail, byte helderheid, byte vertraagde tijd) } indien (Spelanderen) { Spelanderen = Vals; PlayIntro = waar; Animatie = ShoulAnimatie; } breuk; geval 4: indien (PlayIntro) { Ani allOffComment (); PlayIntro = Vals; } indien ((!(PlayIntro)) && (!(Spelanderen))) { Kerstavond (); // } indien (Spelanderen) { Spelanderen = Vals; PlayIntro = waar; Animatie = ShoulAnimatie; } breuk; } }
De animaties kunnen nu opnieuw in volgorde worden aangeroepen door op de knop te drukken.Dit is nieuw, dat nu kan worden verwisseld tussen de "Standalone" en "Feedback" functie modi door simpelweg de schakelaar om te schakelen.
Iedereen reageert!het totaal van vier animaties die enigszins verschillend zijn op de trillingsensor, indien de feedbackmodus is geselecteerd.
Als kleine hulp aan de verbeelding, heb ik ooit gefotografeerd alle vier verschillende animaties:
Ster:
Regenboog.
Motie van twee kleuren:
Halloween:
Let op dat in beide!Modi schakelt niet meteen animaties uit naar de volgende animatie, maar maakt altijd de huidige volgorde af voor het starten van de volgende animatie.
Ik wens je nu veel plezier in het aanpassen van de discoglazen.Misschien wilt u hiervoor meer animatiesequenties programmeren, voor het geval de vier bestaande niet genoeg zijn voor u?
Probeer andere sensoren zoals SB:
Of je probeert het met een sensor van de verschillende
Schrijf uw ideeën of vragen in de commentaren.