Go Down

Topic: Pushbutton mit LED Matrix (Read 410 times) previous topic - next topic

MadUnicorn1999

Moin Moin,
ich hoffe einer von euch kann mir bei meinem Problem weiterhelfen, welches sich beim Programmieren meiner Led Matrix aufgetan hat.
Grob ist der Plan, das es an der Matrix einen Pushbutton gibt mit dem ich verschiedene Leuchtmuster durchschalten kann. Dies habe ich bis jetzt realisiert über eine Abfrage an Pin 3 ( an der der Button angeschlossen ist) ob Voltage HIGH ist und wird ein Strom gemessen, wird eine Zählvariable (x) um 1 erhöht und das nächste Leuchtmuster wird ausgewählt. Als ich nur das Standartbeispiel der FastLED library genommen habe und alle anderen Zustände von x "leer" waren hat das auch Problemlos geklappt (im Serial Monitor konnte ich sehen wie x immer erhöht wurde). Nun habe ich ein weiteres Muster (die Leds wechseln alle Farben durch) programmiert und bei x==1 eingebunden, doch nun funktioniert der Button nicht mehr und ich kann x nicht mehr erhöhen (Wenn ich das neu Programmierte raus-kommentiere funktioniert alles wieder normal). Ich hab leider keine Idee woran das liegen könnte, vielleicht hat einer von euch eine Idee (Nebeninfo: ich bin eher Programmieranfänger, weswegen mein Code wahrscheinlich nicht der Beste ist, für Verbesserungsvorschläge bin ich gerne offen:)  )
Hier mein Quellcode:

Code: [Select]
#include <FastLED.h>
#define LED_PIN  6
#define COLOR_ORDER GRB
#define CHIPSET     WS2811
#define BRIGHTNESS 255

// Params for width and height
const uint8_t kMatrixWidth = 12;
const uint8_t kMatrixHeight = 12;

// Param for different pixel layouts
const bool    kMatrixSerpentineLayout = false;

uint16_t XY( uint8_t x, uint8_t y)
{
  uint16_t i;
 
  if( kMatrixSerpentineLayout == false) {
    i = (y * kMatrixWidth) + x;
  }

  if( kMatrixSerpentineLayout == true) {
    if( y & 0x01) {
      // Odd rows run backwards
      uint8_t reverseX = (kMatrixWidth - 1) - x;
      i = (y * kMatrixWidth) + reverseX;
    } else {
      // Even rows run forwards
      i = (y * kMatrixWidth) + x;
    }
  }
  return i;
}

#define NUM_LEDS (kMatrixWidth * kMatrixHeight)
CRGB leds_plus_safety_pixel[ NUM_LEDS + 1];
CRGB* const leds( leds_plus_safety_pixel + 1);

uint16_t XYsafe( uint8_t x, uint8_t y)
{
  if( x >= kMatrixWidth) return -1;
  if( y >= kMatrixHeight) return -1;
  return XY(x,y);
}


// Demo that USES "XY" follows code below
int x=0;
 void loop()
{
 int val;
 val=digitalRead(3);
 if(val==HIGH){
  x=x+1;
  Serial.print(x); //sieht man aufm Monitor
  delay(1000);
 }

 if(x==1){
    int i,o,p;
    int z;
    unsigned long zeit1;
    for(z=0; z<254; z++)
    {
      zeit1=millis();
      while((millis()-zeit1)<50){
      fill_solid(leds, 144, CRGB(255, 0, z+1)); //zu lila
      FastLED.show();
      }
    }
    for(z=0; z<254; z++)
    {
      zeit1=millis();
      while((millis()-zeit1)<50){
      fill_solid(leds, 144, CRGB(255-1-z, 0, 255)); //zu blau
      FastLED.show();
      }
    }
    for(z=0; z<254; z++)
    {
      zeit1=millis();
      while((millis()-zeit1)<50){
      fill_solid(leds, 144, CRGB(0, z+1,255)); //zu hellblau
      FastLED.show();
      }
    }
     for(z=0; z<254; z++)
    {
      zeit1=millis();
      while((millis()-zeit1)<50){
      fill_solid(leds, 144, CRGB(0, 255,255-1-z)); //zu grün
      FastLED.show();
      }
    }
     for(z=0; z<254; z++)
    {
      zeit1=millis();
      while((millis()-zeit1)<50){
      fill_solid(leds, 144, CRGB(z+1, 255, 0));//zu gelb
      FastLED.show();
      }
    }
     for(z=0; z<254; z++)
    {
      zeit1=millis();
      while((millis()-zeit1)<50){
      fill_solid(leds, 144, CRGB(255,255-1-z,0));//zu rot
      FastLED.show();
      }
    }
  }
 
  if(x==2){
    uint32_t ms = millis();
    int32_t yHueDelta32 = ((int32_t)cos16( ms * (27/1) ) * (350 / kMatrixWidth));
    int32_t xHueDelta32 = ((int32_t)cos16( ms * (39/1) ) * (310 / kMatrixHeight));
    DrawOneFrame( ms / 65536, yHueDelta32 / 32768, xHueDelta32 / 32768);
    if( ms < 5000 ) {
      FastLED.setBrightness( scale8( BRIGHTNESS, (ms * 256) / 5000));
    } else {
      FastLED.setBrightness(BRIGHTNESS);
    }
    FastLED.show();
  }
 
  if(x==4){  //Anzahl an Mustern
  x=0;
 }
}

void DrawOneFrame( byte startHue8, int8_t yHueDelta8, int8_t xHueDelta8)
{
  byte lineStartHue = startHue8;
  for( byte y = 0; y < kMatrixHeight; y++) {
    lineStartHue += yHueDelta8;
    byte pixelHue = lineStartHue;     
    for( byte x = 0; x < kMatrixWidth; x++) {
      pixelHue += xHueDelta8;
      leds[ XY(x, y)]  = CHSV( pixelHue, 255, 255);
    }
  }
}

void setup() {
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalSMD5050);
  FastLED.setBrightness( BRIGHTNESS );
  pinMode(3, INPUT);
  Serial.begin(9600);
}

Tommy56

Während Dein Sketch die for-Schleifen für das neue Muster abarbeitet, wird der Taster nicht abgefragt.
Du brauchst keine for-Schleifen, Du hast doch loop.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

MadUnicorn1999

Okay danke schonmal für deinen Antwort, jetzt verstehe ich immerhin wieso der Taster nicht mehr abgefragt wird. Dennoch habe ich noch keine Idee, wie ich die For-Schleifen umgehen kann und er somit die Farben wechselt (also die einzelenen R, G, B Werte hochaddiert oder immer etwas abzieht) und parallel den Taster abfragt und alles nur stattfindet wenn x = 1 ist.

Tommy56

Du musst Dir den Zustand in Variablen merken und bei jedem Loop-Durchlauf prüfen, ob die Zeit vorbei ist (millis()) und dann die Werte hoch oder runter zählen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

gregorss

Dennoch habe ich noch keine Idee, wie ich die For-Schleifen umgehen kann und er somit die Farben wechselt (also die einzelenen R, G, B Werte hochaddiert oder immer etwas abzieht) und parallel den Taster abfragt und alles nur stattfindet wenn x = 1 ist.
Ich habe Deinen Sketch nicht gelesen.

Ich tippe aber darauf, dass Du die „Programmierstrategie" anpassen bzw. ändern musst, um quasi mehrere Sachen gleichzeitig machen zu können. Evtl. hilft das hier.

Gruß

Gregor
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

Go Up