Onze discobril geeft feedback!

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:

Deel 3: schakelbord voor Fritzing

 

Ook de bedrading van de twee WS2812 ringen is niet veranderd in vergelijking met het vorige deel van de serie:

 

Deel 3: Fritzing detail

 

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:

Effect: Starhower

Regenboog.

Deel 3-Regenboog Effect

Motie van twee kleuren:

Deel 3: Motie van twee kleuren

 

Halloween:

Deel 3-Halloween effect

 

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.

 

Für arduinoProjekte für anfänger

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Aanbevolen blog berichten

  1. Installeer ESP32 nu van de raad van bestuur
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP Programmeren via Wi-Fi