Dartscheibe+FastLed

Hallo zusammen, bin an einen Projekt und zwar Dartscheibe an Arduino(Uno) , das auslesn der matrix klappt soweit ganz gut.
Die Dartscheibe ist mit 20 leds(WS2811) bestückt.
Wenn ein Wurf statt findet sollen die Leds bestimmte animationen abspielen, leider bleibt es hängen.
Jemand ne idee wie man das beheben kann?

#include "FastLED.h"
#define NUM_LEDS 20 
#define PIN 14
CRGB strip[NUM_LEDS];

const byte numRows = 8; 
const byte numCols = 8; 
const int debounceTime = 100;

char keymap[numRows][numCols] = {
  {'0','1','2','4','5','6','7','8'},
  {'a','b','c','d','e','f','g','h'},
  {'j','k','l','m','n','o','p','q'},
  {'s','t','u','v','w','x','y','z'},
  {'B','C','D','E','F','G','H','I'},
  {'K','L','M','N','O','P','Q','R'},
  {'T','U','V','W','X','Y','Z','+'},
  {'*','/','?','!','&','

,'@','#'}
};

byte rowPins[numRows] = {13, 12, 11, 10, 9, 8, 7, 6};
byte colPins[numCols] = {5, 4, 3, 2, A5, A4, A3, A2};

void setup()
{
  Serial.begin(9600);
  FastLED.addLeds<WS2811, PIN, GRB>(strip, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(255); 
  FastLED.clear();
 
  for (int row = 0; row < numRows; row++)
  {
    pinMode(rowPins[row],INPUT);     
    digitalWrite(rowPins[row],HIGH); 
  }
  for (int column = 0; column < numCols; column++)
  {
    pinMode(colPins[column],OUTPUT);                                             
    digitalWrite(colPins[column],HIGH); 
  }
}

void loop()
{
  char taster = wurf();
  if( taster != 0) {                           
    Serial.println(taster);
  }
}

char wurf(){
  char taster = 0;                               
  for(int column = 0; column < numCols; column++){
    digitalWrite(colPins[column],LOW);     
    for(int row = 0; row < numRows; row++){ 
      if(digitalRead(rowPins[row]) == LOW ){
        delay(debounceTime);                 
        while(digitalRead(rowPins[row]) == LOW);                                 
        taster = keymap[row][column];

// S20
      if(column == 1 && row == 4) {
        set1( 10, 2, 100, 255, 255, 100);
        }
      }       
    }
    digitalWrite(colPins[column],HIGH);   
  }
  return taster; 
}

void set1( byte start, byte off, byte r, byte g, byte b ,uint16_t warten)
  {
  static uint32_t previousMillis = 0;
  static int8_t j = off - 1;
  static byte d = 1;
  strip[start + j] = CHSV(r, g, b);
  strip[start - j] = CHSV(r, g, b);
  FastLED.show();
  strip[start + j] = CRGB::Black;
  strip[start - j] = CRGB::Black;
  if (millis() - previousMillis > warten){
  if ((j >= off - 1) || (j < 1)) {
    d = -d;
    }
    j += d;
    previousMillis = millis();
    }
  }

(deleted)

Guten Morgen Peter,
Das ist einen Arduino Uno, die Leds haben eine separate Stromquelle.

andele:
.....
Die Dartscheibe ist mit 20 leds(WS2811) bestückt.
Wenn ein Wurf statt findet sollen die Leds bestimmte animationen abspielen, leider bleibt es hängen.
Jemand ne idee wie man das beheben kann?

Was bleibt wann hängen ?

Kannst du es bitte genauer beschreiben ?

Diese Zeile

static byte d = 1;

bitte ändern in

static int8_t d = 1;

Wird nichts verbessern, aber man weiß nie.

Diese Zeile

static byte d = 1;

bitte ändern in

static int8_t d = 1;

Wird nichts verbessern, aber man weiß nie.

Keine besserung.

HotSystems:
Was bleibt wann hängen ?

Kannst du es bitte genauer beschreiben ?

wenn ich das einfüge

// S20
       if(column == 1 && row == 4) {
        set1( 10, 2, 100, 255, 255, 100); 
        }
bleibt es hängen, die animation findet nicht statt, es fängt zwar an aber bleibt hängen.
wenn das im loop alleine läuft dann funktioniert.
loop()
{
set1(10, 2, 100, 255, 255, 100)
}

andele:
... die animation findet nicht statt, es fängt zwar an aber bleibt hängen.

Durch die Bedingung if (column == 1 && row == 4) hast Du genau das programmiert. Das Programm tut, was es soll, aber nicht, was Du willst.

Sowas habe ich ständig. Wenn ein Programm sofort tut, was ich will, werde ich skeptisch ;D

Und warum beantwortest du nicht die gestellten Fragen ?

HotSystems:
Und warum beantwortest du nicht die gestellten Fragen ?

Du hast gefragt ""Was bleibt wann hängen ?
Kannst du es bitte genauer beschreiben ?
In Post 5 ist mein problem beschrieben, wieso sollte ich deine Frage nicht beantworten?
Nochmal zum Vertsändniss, wenn ich auf den Dartpad "20" drauftippe läuft die animation nicht ab, wenn man aber mehrmals drauf tippt dann wird das langsamm abgespielt je nach dem wie oft mann drauf tippt und das möchte ich nicht so haben.

Durch die Bedingung if (column == 1 && row == 4) hast Du genau das programmiert. Das Programm tut, was es soll, aber nicht, was Du willst.

Sowas habe ich ständig. Wenn ein Programm sofort tut, was ich will, werde ich skeptisch ;D

Deswegen habe ich um Hilfe gebeten, kann nicht raus finden wo der Fehler ist.

Sorry, deinen eingefügten Sketch hatte ich nicht mit meiner Frage in Verbindung gesetzt.

Mein Tipp.

Du musst dein Ergebnis zwischenspeichern, bis die Animation beendet ist.
Die Animation läuft nur so lange, wie die Bedingung auch TRUE ist.
Beachte auch den Hinweis von agmue.

HotSystems:
Sorry, deinen eingefügten Sketch hatte ich nicht mit meiner Frage in Verbindung gesetzt.

Mein Tipp.

Du musst dein Ergebnis zwischenspeichern, bis die Animation beendet ist.
Die Animation läuft nur so lange, wie die Bedingung auch TRUE ist.
Beachte auch den Hinweis von agmue.

Die Animation endet wenn das Pad nicht mehr betätigt wird.
Die Bedingung wir mit ein if ausgeführt und dort hackt es.
Wie kann man das machen? Das ist ja meine frage.

andele:
Die Animation endet wenn das Pad nicht mehr betätigt wird.
Die Bedingung wir mit ein if ausgeführt und dort hackt es.
Wie kann man das machen? Das ist ja meine frage.

Dann liegt der Fehler vermutlich an deiner Dartscheibe. Da wird der Kontakt nicht ständig gegeben.
Somit unterbricht die Animation.

Die Abfrage wird ja nur ausgeführt, solange der Kontakt (Pad betätigt) vorhanden ist.

Besteht die möglichkeit diesen Kontakt programmtechnisch zu beinflussen?
z.B. Pad wird angetippt soll aber 3 sec. der Kontakt gehalten werden.

andele:
Besteht die möglichkeit diesen Kontakt programmtechnisch zu beinflussen?
z.B. Pad wird angetippt soll aber 3 sec. der Kontakt gehalten werden.

Hatte ich ja geschrieben.
Du musst den Zustand in einer Statusvariable zwischenspeichern.
Diese muss durch entsprechende Maßnahmen wieder gelöscht werden.

HotSystems:
Hatte ich ja geschrieben.
Du musst den Zustand in einer Statusvariable zwischenspeichern.
Diese muss durch entsprechende Maßnahmen wieder gelöscht werden.

Wie kann man das machen? Das ist ja meine frage.

andele:
Wie kann man das machen?

Wenn Taste (naja, Dartscheibe) gedrückt, Merker auf true.

Wenn Merker true, Animation laufen lassen. Nach abgelaufener Zeit oder anderer Bedingung setzt die Animation der Merker auf false.

andele:
Wie kann man das machen? Das ist ja meine frage.

Oh.....sorry, ich wusste nicht, dass du es nicht verstanden hast.

HotSystems:
Oh.....sorry, ich wusste nicht, dass du es nicht verstanden hast.

Theorie und Praxis

andele:
Theorie und Praxis

Gut das agmue das jetzt noch mal erklärt hat.

HotSystems:
Gut das agmue das jetzt noch mal erklärt hat.

ist ok...

agmue:
Wenn Taste (naja, Dartscheibe) gedrückt, Merker auf true.

Wenn Merker true, Animation laufen lassen. Nach abgelaufener Zeit oder anderer Bedingung setzt die Animation der Merker auf false.

hab mal das so interpretiert , jedoch läuft nicht.

  bool run;     
  if(column == 1 && row == 4 ) {
         if (run=true){
          set1( 10, 3, 100, 255, 255, 250); 
         delay(3000);
       run=false;
        }
       }