Flora Neopixels progamma voor een kostuum

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 5
Geregistreerd: 26 Feb 2017, 19:46
Woonplaats: Creatieve strateeg

Flora Neopixels progamma voor een kostuum

Berichtdoor DaDRZ » 26 Feb 2017, 19:54

Hoi allemaal!

Ik ben een ontwerper (en niet echt / echt niet een programmeur) en ben met een persoonlijk kostuum project begonnen.
Daarvoor gebruik ik wearable tech en Arduino voor de eerste keer. Om een beetje een gevoel erbij te krijgen wel de nodige starterskit dingen gedaan.
Maar merk wel dat ik er maar moeilijk in kom en dus via deze weg hulp zoek.

Hopelijk kunnen jullie mij verder helpen!
Als er vragen zijn laat maar horen.

Groet!

Andras


------------

Onderstaande heb ik bij elkaar verzameld uit verschillende templates en sketches online maar zoek dus de verbindende schakel.
Doel is om de verschillende scene's aan te roepen door een moment schakelaar in te drukken.

// For ADAFRUIT FLORA Board
// Flora RGB Neopixels are connected in line on PIN 6 with + on V-BATT and - on GND - strand of 100
// Switch is moment-switch connected to PIN TX1 with + and - on adjecent GND
// External power supply delivers 3.7 V with a max 5.0 A (Velleman LABPS 3005D 30v 5A)

// Purpose is to have three scenes of the dress
// Base state is a dimm blue backlit state of the LED's with a random appearing "glow" in near white + fade out
// When the switch is pressed a random white sparkle (not too fast) appears on all LED's
// When the switch is pressed again 1 random LED will glow up/down until switch is pressed again
// Switch pressed again will return to base state


// Define the pixel-count and PIN setting:

#define NUMBEROFPIXELS 10 // Number of Flora Neopixels V2 - VOOR TESTEN GEBRUIK IK ER SLECHTS 10
#define PIXELPIN 6 // onbaord PIN with pixels - DE SCHAKELAAR ZOU OP TX #1 en GND MOETEN KOMEN

// Setup the libraries:

#include "Arduino.h"
#include <Adafruit_NeoPixel.h>
#include <NeoPixelPainter.h>

// I do not know exactly whats happening below here:

Adafruit_NeoPixel neopixels = Adafruit_NeoPixel(NUMBEROFPIXELS, PIXELPIN, NEO_GRB + NEO_KHZ800);

NeoPixelPainterCanvas pixelcanvas = NeoPixelPainterCanvas(&neopixels); //create canvas, linked to the neopixels (must be created before the brush)
NeoPixelPainterBrush pixelbrush = NeoPixelPainterBrush(&pixelcanvas); //crete brush, linked to the canvas to paint to

// Define the switch and switchstate:

const int switchPin = 1;
int switchState = 0;
int prevSwitchState = 0;
int select;

// Create the VOID Setup:

void setup() {
randomSeed(analogRead(0)); // new random seed (for what?)
pinMode(PIXELPIN, OUTPUT); // tell the PIN with pixels its an output
pinMode(switchPin, INPUT); // tell the PIN with switch its an input

neopixels.begin(); // start the pixels

}

void loop() {
switchState = digitalRead (switchPin); // read the Switch
if (switchState != prevSwitchState) { // act on switch state
if (switchState == LOW) {

switch (select) {

case 0: // slow random twinkle in "white" on a dimmed blue base color

HSV brushcolor;

pixelbrush.setSpeed(1); // set the speed (10 LED's "200" is fine) "0" = off
pixelbrush.setFadein(true); // do not fade in ("appear")
pixelbrush.setFadeout(true); // do fade out ("ftb")

if (rand() % 100 == 0) // at a random interval, move the brush to paint a new pixel (brush only paints a new pixel once)
{
brushcolor.h = rand();
brushcolor.s = random(20); //set low saturation, almost white
brushcolor.v = random(200) + 20; //set random brightness

pixelbrush.setColor(brushcolor);
pixelbrush.moveTo(random(NUMBEROFPIXELS)); //move the brush to a new, random pixel
pixelbrush.setFadeSpeed(random() + 5); //set random fade speed, minimum of 5
}

// neopixels.clear();

// OR - add a background color by setting all pixels to a color (instead of clearing all pixels):

int i;
for (i = 0; i < NUMBEROFPIXELS; i++)
{
neopixels.setPixelColor(i, 0, 0, 5); //color in RGB: dark blue
}

pixelbrush.paint(); //paint the brush to the canvas
pixelcanvas.transfer(); //transfer (add) the canvas to the neopixels

neopixels.show();

break;


case 1: // random fast sparkle over all LED's (loosely based sparkler template)
{
HSV brushcolor;
{
pixelbrush.setSpeed(1);
pixelbrush.setFadeout(true); //sparkles fade out
pixelbrush.setFadein(false); //and fade in immediately after reaching the set brightness
}
if (rand() % 100 == 0) // at a random interval, move the brush to paint a new pixel (brush only paints a new pixel once)

//set a new brush color in each loop

brushcolor.h = (0); //set color
brushcolor.s = (0); //random but low saturation, giving white-ish sparkles
brushcolor.v = random(200) + 20; //random (peak) brighness

pixelbrush.setColor(brushcolor);
pixelbrush.moveTo(random(NUMBEROFPIXELS));
pixelbrush.setFadeSpeed(random(250) + 20); //set a new fadespeed with some randomness

neopixels.clear();

pixelbrush.paint(); //paint the brush to the canvas (and update the brush, i.e. move it a little)
pixelcanvas.transfer(); //transfer (add) the canvas to the neopixels

neopixels.show();


break;

}
}

}


prevSwitchState = switchState;
}
}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Flora Neopixels progamma voor een kostuum

Berichtdoor Koepel » 26 Feb 2017, 22:19

Het gaat om de StateChangeDetection : https://www.arduino.cc/en/Tutorial/StateChangeDetection
Die heb je al.
Iedere keer als je daar doorheen komt (er is iets gewijzigd en de digitalRead() ging van HIGH naar LOW) dan kun je de 'select' verhogen, en alleen 0 en 1 laten tellen.

Iedere keer dat de Arduino opstart, doet de random() precies dezelfde volgorde van getallen.
Om dat te voorkomen, kun je de 'seed' (heb beginzaadje) een getal geven, en dan gaat random() een andere volgorde van getallen geven.
Om de 'seed' een willekeurig getal te geven wordt de waarde van een analoge input gebruikt. Daar staat ruis op en die pin zweeft een beetje, dus met wat geluk geeft dat een ander getal.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Flora Neopixels progamma voor een kostuum

Berichtdoor shooter » 26 Feb 2017, 22:24

ik zie nergens dat je de select goed zet.
zet die switchstate aub gelijk na de if want dan wordt het gelijk goed gezet.
doe eens Ctrl T dan lijnt het beter uit.
dan kun je ook de haakjes en de fases beter zien.

kijk ook eens naar functies dan hoef je niet zoveel te schrijven.
paul deelen
shooter@home.nl

Berichten: 5
Geregistreerd: 26 Feb 2017, 19:46
Woonplaats: Creatieve strateeg

Re: Flora Neopixels progamma voor een kostuum

Berichtdoor DaDRZ » 27 Feb 2017, 12:24

Hi Koepel en Shooter,

Allereerst hartelijk dank voor het meedenken en kijken.

@Koepel; waar ik dus juist niet uitkom (gewoonweg niet de kennis voor) is hoe ik de verwijzing maak naar de "scenes" die ik wil en hoe ik daar een goede volgorde in houdt.

@Shooter; ik denk wat jij probeert duidelijk te maken is exact waar mijn kennis te kort schiet in deze :-) De code heb ik onderstaand nog even met "CTRL-T" geplakt voor beter overzicht. Dank voor de tip, scheelt inderdaad in het overzicht! Het schrijven bij van alles doe ik zodat ik het beter kan onthouden en leren.

Groet! Andras

Code: Alles selecteren
// Wishcollectors dress © Myra de Groot entertainment productions The Netherlands

// Made for ADAFRUIT FLORA Board by Andras Fictoor 26 Feb. 2017
// Flora RGB Neopixels are connected in line on PIN 6 with + on V-BATT and - on GND - strand of 100
// Switch is moment-switch connected to PIN TX1 with + and - on adjecent GND
// External power supply delivers  3.7 V with a max 5.0 A (Velleman LABPS 3005D 30v 5A)

// Purpose is to have three scenes of the dress
// Base state is a dimm blue backlit state of the LED's with a random appearing "glow" in near white + fade out
// When the switch is pressed a random white sparkle (not too fast) appears on all LED's
// When the switch is pressed again 1 random LED will glow up/down until switch is pressed again
// Switch pressed again will return to base state


// Define the pixel-count and PIN setting:

#define NUMBEROFPIXELS 10 // Number of Flora Neopixels V2
#define PIXELPIN 6 // onbaord PIN with pixels

// Setup the libraries:

#include "Arduino.h"
#include <Adafruit_NeoPixel.h>
#include <NeoPixelPainter.h>

// I do not know exactly whats happening below here:

Adafruit_NeoPixel neopixels = Adafruit_NeoPixel(NUMBEROFPIXELS, PIXELPIN, NEO_GRB + NEO_KHZ800);

NeoPixelPainterCanvas pixelcanvas = NeoPixelPainterCanvas(&neopixels); //create canvas, linked to the neopixels (must be created before the brush)
NeoPixelPainterBrush pixelbrush = NeoPixelPainterBrush(&pixelcanvas); //crete brush, linked to the canvas to paint to

// Define the switch and switchstate:

const int switchPin = 1;
int switchState = 0;
int prevSwitchState = 0;
int select;

// Create the VOID Setup:

void setup() {
  randomSeed(analogRead(0)); // new random seed (for what?)
  pinMode(PIXELPIN, OUTPUT); // tell the PIN with pixels its an output
  pinMode(switchPin, INPUT); // tell the PIN with switch its an input

  neopixels.begin(); // start the pixels

}

void loop() {
  switchState = digitalRead (switchPin); // read the Switch
  if (switchState != prevSwitchState) { // act on switch state
    if (switchState == LOW) {

      switch (select) {

        case 0: // slow random twinkle in "white" on a dimmed blue base color

          HSV brushcolor;

          pixelbrush.setSpeed(1); // set the speed (10 LED's "200" is fine) "0" = off
          pixelbrush.setFadein(true); // do not fade in ("appear")
          pixelbrush.setFadeout(true); // do fade out ("ftb")

          if (rand() % 100 == 0) // at a random interval, move the brush to paint a new pixel (brush only paints a new pixel once)
          {
            brushcolor.h = rand();
            brushcolor.s = random(20); //set low saturation, almost white
            brushcolor.v = random(200) + 20; //set random brightness

            pixelbrush.setColor(brushcolor);
            pixelbrush.moveTo(random(NUMBEROFPIXELS)); //move the brush to a new, random pixel
            pixelbrush.setFadeSpeed(random() + 5); //set random fade speed, minimum of 5
          }

          // neopixels.clear();

          // OR - add a background color by setting all pixels to a color (instead of clearing all pixels):

          int i;
          for (i = 0; i < NUMBEROFPIXELS; i++)
          {
            neopixels.setPixelColor(i, 0, 0, 5); //color in RGB: dark blue
          }

          pixelbrush.paint(); //paint the brush to the canvas
          pixelcanvas.transfer(); //transfer (add) the canvas to the neopixels

          neopixels.show();

          break;


        case 1: // random fast sparkle over all LED's (loosely based sparkler template)
          {
            HSV brushcolor;
            {
              pixelbrush.setSpeed(1);
              pixelbrush.setFadeout(true); //sparkles fade out
              pixelbrush.setFadein(false);  //and fade in immediately after reaching the set brightness
            }
            if (rand() % 100 == 0) // at a random interval, move the brush to paint a new pixel (brush only paints a new pixel once)

              //set a new brush color in each loop

              brushcolor.h = (0); //set color
            brushcolor.s = (0); //random but low saturation, giving white-ish sparkles
            brushcolor.v = random(200) + 20; //random (peak) brighness

            pixelbrush.setColor(brushcolor);
            pixelbrush.moveTo(random(NUMBEROFPIXELS));
            pixelbrush.setFadeSpeed(random(250) + 20); //set a new fadespeed with some randomness

            neopixels.clear();

            pixelbrush.paint(); //paint the brush to the canvas (and update the brush, i.e. move it a little)
            pixelcanvas.transfer(); //transfer (add) the canvas to the neopixels

            neopixels.show();


            break;

          }
      }

    }


    prevSwitchState = switchState;
  }
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Flora Neopixels progamma voor een kostuum

Berichtdoor Koepel » 27 Feb 2017, 13:42

De 'scene' selecteer je met de variable 'select'. Maak die 'select' eens 0 en 1 en kijk of hij de verschillende scenes gaat uitvoeren. Vervolgens kun je de scene wijzigen als de knop wordt ingedrukt.

Berichten: 5
Geregistreerd: 26 Feb 2017, 19:46
Woonplaats: Creatieve strateeg

Re: Flora Neopixels progamma voor een kostuum

Berichtdoor DaDRZ » 27 Feb 2017, 14:00

Hi Koepel,

Ik vrees dat ik je niet helemaal begrijp.
Als ik "case" verander door select dan krijg ik een error als ik compile.
Of "case" weghalen?

Waar stel jij voor dat ik "select" 0 en 1 maak?

Groet!

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Flora Neopixels progamma voor een kostuum

Berichtdoor Koepel » 27 Feb 2017, 21:33

Maak 'select' in setup() eens '0', en ook eens '1' en kijk of je de loop() kunt aanpassen dat scene 0 of scene 1 wordt afgespeeld. Ik vermoed dat de scenes in de loop() altijd steeds opnieuw uitgevoerd dienen te worden ?
Nu heb je de scenes binnen de if-statements van de drukknop gezet, maar daar hoort het waarschijnlijk niet. Je kunt de code voor de drukknop er uit halen om de twee scenes werkend te krijgen.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Flora Neopixels progamma voor een kostuum

Berichtdoor shooter » 27 Feb 2017, 22:38

oke

je hebt dit prog ergens vandaan, dus kijk eens of er daar wat te halen valt, maar een paar ideeen.
je hebt case 0 en een case 1
zet het stuk onder case 0 eens direct onder de if, en het stuk van case 1 onder de else van dezelfde if, de rest even onder comment zetten dus even //
dan de haakjes controleren etc.
als de rest dan goed is dan schakel je dus al tussen 2 scenes, de volgende stap is dan met die case switch.dan kun je zoveel scenes maken als je wilt.


ik snap HSV niet.
maar ik heb ook geen libraries bekeken.

voorbeelden zijn leuk, maar hebben het nadeel dat je precies moet snappen wat er gebeurt.

en vrees niet het zal tijd kosten, maar je krijgt het werkend.
paul deelen
shooter@home.nl

Berichten: 5
Geregistreerd: 26 Feb 2017, 19:46
Woonplaats: Creatieve strateeg

Re: Flora Neopixels progamma voor een kostuum

Berichtdoor DaDRZ » 27 Feb 2017, 23:06

Hi Guys,

Echt super dat jullie zo helpen en het geduld opbrengen om een echte beginner verder te helpen.
De code heb ik inderdaad links en rechts verzameld op basis van template sketches van de libraries etc.
Individueel ben ik met de code gaan pielen totdat het deed wat ik ongeveer wil.
Nu inderdaad die laatste stap dat het een na het ander gebeurd aangestuurd door een schakelaar.
Gaat vast en zeker lukken #optimistisch!

@ Koepel, ja dat veranderen van de select in de setup (met alle switch dingen ge-//-ed) werkt! "int select (0);" is het geworden dan (of 1 natuurlijk)
Nu kan ik daar aangeven welke "scene" er speelt als de Flora opstart. Ze blijven dan in loop van zichzelf wat ook de bedoeling is en gaan niet automatisch verder.

@ Shooter, hoe je dat bedoelt met die IF moet je me even iets meer bij helpen vrees ik. Na de IF moet ik tussen de () een commando meegeven wat moet dat dan zijn?

Nog even voor de zekerheid mijn doel:
Starten met scene 1: blauwe zachte gloed met random twinkles in bijna wit
Druk op knop -> scene 2: snelle random sparkles over alle LED in wit
Druk op knop -> scene 3: 1 random LED gaat glowen in wit (of rainbow) <<deze code heb ik nog niet en kan ik ook niet vinden>>
Druk op knop -> terug naar scene 1
Overgangen mogen harde overgangen zijn zonder fades

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Flora Neopixels progamma voor een kostuum

Berichtdoor Koepel » 27 Feb 2017, 23:38

Je code doet mijn wenkbrouwen fronsen. Het is een beetje een rommeltje :o Maar als het voor jouw werkt, dan kun je dat voor nu even zo laten. Eigenlijk heb je een software maker nodig voor je project.

Wordt de code voor een scene maar één keer uitgevoerd ?

Om Arduino code te maken zonder een echte debugger is al niet lekker, maar je gebruikt niet eens de seriële monitor om dingen op af te drukken. Het zou handig zijn om dat toe te voegen. Dan kun je bijvoorbeeld de variabele 'select' laten zien, zodat je weet wanneer die verandert.
Er zijn echter wel consequenties bij de FLORA (ATmega32U4 8MHz). Tijdens de sketch ontwikkelen wacht de sketch totdat de seriële monitor is geopend, maar als je dat vergeet om er uit te halen, dan werkt je sketch niet in het echt :(

We hebben het steeds over de variabele 'select' en de "scene". Kun je die variabele "scene" noemen ?

In 'c' code begint een array met 0. Je kunt de scene met 1 laten beginnen, maar liever met 0. Of anders de switch-case aanpassen zodat die bij 1 begint. Maak een keuze, en hou je daar consequent aan in de code.

Hieronder heb ik de regel "prevSwitchState = switchState;" naar boven gehaald, zodat de code van de knop bij elkaar blijft. Maar dat is niet echt nodig.
Code: Alles selecteren
  // ---------------------------------------
  // StateChangeDetection for the Switch
  // ---------------------------------------
  switchState = digitalRead (switchPin); // read the Switch
  if (switchState != prevSwitchState)   // act on switch state
  {
    prevSwitchState = switchState;    // remember this state for next time
    if (switchState == LOW)
    {
      // The switch has just been pressed !
      // Change the scene.
      // The scene can be 0,1,2
      select = select + 1;     // increment the scene
      if (select >= 3)   // return to zero ?
      {
         select = 0;
      }

      // This is the place that the scene can be 0,1,2 and a button has been pressed.
    }
  }

Volgende

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten