hulp nodig met 2 x ws2812 ledstrip op 2 poorten met knop

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 6
Geregistreerd: 10 Jul 2013, 09:23

hulp nodig met 2 x ws2812 ledstrip op 2 poorten met knop

Berichtdoor nawikre » 01 Sep 2014, 11:18

Hallo Mensen,

Ik heb jullie hulp nodig met een programmering. Ik ben nu 2 volle dagen bezig met zoeken en experimenteren, maar ik loop nu vast. Ik heb een duwtje nodig.
Ik zal eerdst uitleggen wat ik wil bereiken.
Ik heb 2 ws2812 ledstrips aangesloten op een uno op 2 poorten. Als ik een knop induk moet het hele proces gaan lopen (zonder dat ik nog een keer een knop moet indrukken, wat nu het geval is na ieder Pattern..Dit moet er dus uit, maar weet niet hoe)
Ik wil ledstrip A continu het TheatreChase programma laten afspelen. Daarnaast wil ik dat strip B ook direct begint met het TheatreChase programma (led 0 tot 16) voor ongeveer 60 seconde en dan uit gaat. Wanneer op strip B het theaterChase programma begint (samen met strip A) wil ik dat na 5 seconden op strip B led 17-20 voor 5 seconden aangaat en dan weer uit. Daarna voor 5 seconden led 21-25 voor 10 seconden en daarna weer uitgaat.

Ik hoop dat mijn uitleg zo duidelijk is van wat ik wil bereiken. Ik heb al een code waarbij de 2 strips al werken, maar ik merk dat wanneer ik strip A en strip B start, ze eigenlijk om en om werken. Strip A begint met TheaterChase en werkt goed, maar dan bevriest strip A en begint strip B te lopen...dan bevriest strip B en gaat strip A weer verdere en zo blijft het doorgaan. Het lukt e niet om ze beide tegelijk vloeiend te laten lopen. Ook de drukknop die ik uit een voorbeeld heb gehaald krijg ik niet werkend zoals ik wil.....ik wil niet na iedere Pattern op de knop hoeven drukken...ik wil dat het met een druk op de knop begint en dan het hele programma afloopt zoals hierboven beschreven...

Ik hoop dat iemand mij verder kan helpen, want ik zit gewoon vast...ik ben nu willekeurig dingen aan het proberen, maar kom zo niet verder.

Hieronder de code voor zover ik nu ben.


alvast bedankt voor de hulp.

Code: Alles selecteren
#include <Adafruit_NeoPixel.h>

    int buttonPin = 0;          // De knop zit op pin 0
    int oldButtonVal = 0;
   
    #define LEDCOUNT   50       // aantal LEDs in de strip
    #define PINA 6              // pin nummer waar strip A data op zit
    #define PINB 5              // pin nummer waar strip B data op zit
    #define TPIXELA 50          //aantal leds op strip A
    #define TPIXELB 16          //aantal leds op strip B
   
// DEFINITIES

// Parameter 3 = RGB LED vlaggen, combineer indien nodig:
// NEO_KHZ800  800 KHz bitstream (de meeste NeoPixel producten met WS2812 LEDs)
//   NEO_KHZ400  400 KHz (klassieke 'v1' (niet v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     RGB LED volgens GRB bitstream (de meeste NeoPixel produkten)
//   NEO_RGB     RGB LED volgens RGB bitstream (v1 FLORA pixels, niet v2)

    Adafruit_NeoPixel strip_a = Adafruit_NeoPixel(TPIXELA, PINA, NEO_RGB + NEO_KHZ800);
    Adafruit_NeoPixel strip_b = Adafruit_NeoPixel(TPIXELB, PINB, NEO_RGB + NEO_KHZ800);
   
    int nPatterns = 4;
    int lightPattern = 1;

// begin/initialisatie bij drukken knop of reset knop:
    void setup() {
    strip_a.begin();
    strip_a.show();                   // initialisatie van alle LEDs op strip A (resulteert in UIT zetten hier)
    strip_b.begin();
    strip_b.show();                   // initialisatie van alle LEDs op strip B (resulteert in UIT zetten hier)   

    pinMode(buttonPin, INPUT);      // initializeer de knop als input
    digitalWrite(buttonPin, HIGH);  // knop pin is HIGH, dus het veranderd naar 0 bij ingedrukt.
}


// Pattern 1 - TheatreChase red
    void pattern1() {
        // Zogenaamde theater chase voorbeeld ...
   theaterChase(strip_a.Color(255,   0,   0), 125); } // Rood, parameter 1 = Kleurcode 255,0,0 Parameter 2 = snelheid van het looplicht 

      //Theatre-style kruipende LEDs.
       void theaterChase(uint32_t c, uint8_t wait) {
       for (int q=0; q < 3; q++) {
       for (int i=0; i < strip_a.numPixels(); i=i+3) {
       strip_a.setPixelColor(i+q, c); }  //zet elke 3de RGD LED aan     
       strip_a.setBrightness(75);
       strip_a.show();
       delay(200);                      // tijd dat de led aan blijft en daarna door onderstaande code wordt uitgeschakeld
       for (int i=0; i < strip_a.numPixels(); i=i+3) {
       strip_a.setPixelColor(i+q, 0);     //zet elke 3de RGB LED uit
       strip_a.Color(0, 0, 0);
       strip_a.show(); 
      }
    }
    }

   
// Pattern 2 - Red light, all LEDs in the strip are red
    void pattern2() {
      // Zogenaamde theater chase voorbeeld ...
   theaterChase1(strip_b.Color(255,   150,   0), 125); } // Rood, parameter 1 = Kleurcode 255,0,0 Parameter 2 = snelheid van het looplicht
     
      //Theatre-style kruipende LEDs.
       void theaterChase1(uint32_t c, uint8_t wait) {
       for (int q=0; q < 3; q++) { 
       for (int i=0; i < strip_b.numPixels(); i=i+3) {
       strip_b.setPixelColor(i+q, c); }  //zet elke 3de RGD LED aan
       strip_b.setPixelColor(0, strip_b.Color(0, 255, 0)); // Red
       strip_b.setPixelColor(10, strip_b.Color(0, 255, 0));
       strip_b.setPixelColor(12, strip_b.Color(0, 255, 0));
       strip_b.setPixelColor(13, strip_b.Color(0, 255, 0));
       strip_b.setPixelColor(14, strip_b.Color(0, 255, 0));
    strip_b.setBrightness(75);
    strip_b.show();
    delay(200);                      // tijd dat de led aan blijft en daarna door onderstaande code wordt uitgeschakeld
    for (int i=0; i < strip_b.numPixels(); i=i+3) {
       strip_b.setPixelColor(i+q, 0);     //zet elke 3de RGB LED uit
    }
    }
    }
 
// Pattern 3 - Orange light, all LEDs in the strip are orange
    void pattern3() {
        strip_b.setPixelColor(0, strip_b.Color(255, 128, 0)); // Orange
        strip_b.setPixelColor(1, strip_b.Color(255, 128, 0));
        strip_b.setPixelColor(2, strip_b.Color(255, 128, 0));
        strip_b.setPixelColor(3, strip_b.Color(255, 128, 0));
        strip_b.setPixelColor(4, strip_b.Color(255, 128, 0));
    strip_b.show();
    }

// Pattern 4 - Yellow light, all LEDs in the strip are yellow
    void pattern4() {
        strip_a.setPixelColor(0, strip_a.Color(255, 255, 0)); // Yellow
        strip_a.setPixelColor(1, strip_a.Color(255, 255, 0));
        strip_a.setPixelColor(2, strip_a.Color(255, 255, 0));
        strip_a.setPixelColor(3, strip_a.Color(255, 255, 0));
        strip_a.setPixelColor(4, strip_a.Color(255, 255, 0));
    strip_a.show();
    }

// the loop routine runs over and over again forever;
void loop() {
  // read that state of the pushbutton value;
  int buttonVal = digitalRead(buttonPin);
  if (buttonVal == LOW && oldButtonVal == HIGH) {// button has just been pressed
    lightPattern = lightPattern + 1;
  }
  if (lightPattern > nPatterns) lightPattern = 1;
  oldButtonVal = buttonVal;
 
  switch(lightPattern) {
    case 1:
      pattern1();
      break;
    case 2:
      pattern2();
      break;
    case 3:
      pattern3();
      break;
    case 4:
      pattern4();
      break;
   
  }
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: hulp nodig met 2 x ws2812 ledstrip op 2 poorten met knop

Berichtdoor nicoverduin » 01 Sep 2014, 16:25

Mijn eerste reactie zou zijn:
- stap over op de FastLED library van Paul Stoffregen. Kun je zo ongeveer alle LEDs aan en is een stuk sneller
- Als je wilt dat hij alleen start bij eenmalig indrukken knop, dan de knop uitvragen in de setup() en dan wachten tot hij is ingedrukt. Pas daarna gaat hij naar de loop()
- Als je meerdere routines tegelijk wilt laten draaien, dan wordt het de kunst om te bepalen wanneer je een LED strip vult met waarden en wanneer je iets laat zien. Als je bijvoorbeeld theatreChase() bekijkt:
cpp code
void pattern2() {
// Zogenaamde theater chase voorbeeld ...
theaterChase1(strip_b.Color(255, 150, 0), 125);
} // Rood, parameter 1 = Kleurcode 255,0,0 Parameter 2 = snelheid van het looplicht

//Theatre-style kruipende LEDs.
void theaterChase1(uint32_t c, uint8_t wait) {
for (int q = 0; q < 3; q++) {
for (int i = 0; i < strip_b.numPixels(); i = i + 3) {
strip_b.setPixelColor(i + q, c);
} //zet elke 3de RGD LED aan
strip_b.setPixelColor(0, strip_b.Color(0, 255, 0)); // Red
strip_b.setPixelColor(10, strip_b.Color(0, 255, 0));
strip_b.setPixelColor(12, strip_b.Color(0, 255, 0));
strip_b.setPixelColor(13, strip_b.Color(0, 255, 0));
strip_b.setPixelColor(14, strip_b.Color(0, 255, 0));
strip_b.setBrightness(75);
strip_b.show();
delay(200); // tijd dat de led aan blijft en daarna door onderstaande code wordt uitgeschakeld
for (int i = 0; i < strip_b.numPixels(); i = i + 3) {
strip_b.setPixelColor(i + q, 0); //zet elke 3de RGB LED uit
}
}
}


Wat een beetje vreemd is dat hij eerst bepaalde LEDS'aanzet in een kleur, de strip update en vervolgens LEDS uit zet. Wat je kan doen in de loop is beide functies (zonder de header) kopiëren en vervolgens de show functie pas aan het eind in de loop doen. Dus wat je dan doet is strip a opbouwen, strip b opbouwen en dan pas beide laten zien.

LED strips zijn op zich vrij eenvoudig te programmeren:
- Een led strip wordt in het geheugen opgebouwd als een tabel. En elke LED wordt vertegenwoordigd in die tabel als een RGB entry (3 bytes).
- in die tabel kun je constant wijzigingen aanbrengen.
- Zolang je de show() functie niet uitvoert, zal je geen wijziging zien.

Ik heb net zelf een LED strip programma ontwikkeld waarbij de strip is onderverdeeld in een 12-tal segmenten (totaal iets van 300 leds) met elk hun eigen functionaliteit. Maar dan moet je zeker niet met delay() werken maar met millis() zodat je nergens onderbrekingen krijgt of iets zit op iets anders te wachten. de loop

Het handigste in dit soort projecten waar je meerdere zaken door elkaar wilt doen, is een tijdlijn maken. Horizontaal teken je een lijn voor elke pin die je gebruikt. je geeft aan wanneer iets hoog of laag moet zijn (je tekent dus ahw een blokgolf voor elke pin) en dan kan jet met verticale lijnen bepalen wanneer er iets moet gebeuren. millis() gebruik je dan om het juiste tijdstip te bepalen.

nog even over mijn loop() in het LED programma:
cpp code
/**
* @name loop()
* @brief main loop of program and runs endlessly
* @page "Function descriptions"
* @par loop()
* check if the demoSwitch has been pushed. if so and idle_mode is active, set program_mode to demo_mode.\n
* process any volume timers. \n
* check if we are switching to a different option color. \n
* pending program_mode switch to either processIdleMode() or processDemoMode() \n
* update the Wings \n
* update Audio Channels \n
* if required, update the LED strip.
*/
void loop() {
//
// process flashy Demo and volume buttons
//
processPWMDemoLeds();
processPWMVolumeLeds();
processVolumeButtons();

if (checkButton(demoSwitch)) {
//
// process only if we are in idle mode
//
if (programMode == idle_mode) {
//
// switching to active mode
//
programMode = demo_mode;
//
// save moment when demo mode has started
//
startDemoMode = millis();
//
// set to known state
//
mustUpdate = true;
demoStep = 0;
}
}
//
// check volume timers
//
processVolume();
//
// check program mode
//
if (programMode == idle_mode) {
processIdleMode(); // move the meteor
} else {
processDemoMode(); // process the segments
}
//
// process wings
//
displayWings();
//
// check audio channels
//
checkAudioChannels();
//
// update the physical led strip if it has changed
//
if (mustUpdate) {
//
// update the led strip
//
FastLED.show();
//
// reset update flag
//
mustUpdate = false;
}
}

Er worden allerlei functies aangeroepen die allemaal iets willen in de LED strip. Echter er wordt maar 1x in de loop() een update van de ledstrip gedaan en dan alleen nog als er daadwerkelijk iets is gewijzigd.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 41 gasten