@dope-walker (dope-walker) posted a new topic, subject "Led Matrix wechsel blinken". It read:

   Hallo zusammen,
    
    Ich habe ein Problem mit meiner LEd Matrix und brauche bitte hilfe.  
    Ich habe kürzlich das millis stat delay gelernt und das ist mein erster versuch damit.  
    Ich steuere die zeit mit einem poti. Das funktioniert sowiet sehr gut nun möchte ich es aber unterschiedlich blinken lassen.  
    Zuerst den einen teil dreimal und dann den anderen auch dreimal. Die blink frequenz steuer ich weiterhin mit dem poti.  
    Aber das bekomme ich einfach nicht hin   
    Ich habe es mit einem einfachen counter versucht aber so blinkt der eine teil zwar dreimal jedoch das andere nur einmal .  
    Kann mir bitte jemand erklären wie ich das ändern kann?
    [code] 
        include <Adafruit_NeoPixel.h>
        #ifdef __AVR__
        #include <avr/power.h>
        #endif
        #define PIN 11
        #define BRIGHTNESS 32
         
         
         
        int pot1        = A0;
        int pot2        = A1;
        int pot3        = A2;
        int pot4        = A3;
        int pot5        = A4;
        int pot6        = A5;
         
        int del1        = 0;
        int del2        = 0;
        int bright      = 0;
        int rot         = 0;
        int gruen       = 0;
        int blau        = 0;
        int interval    = 0;
        int  interval2  = 0;
        unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
        unsigned long previousMillis2 = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
        byte counter = 0;
        Adafruit_NeoPixel strip = Adafruit_NeoPixel(256, PIN, NEO_GRB + NEO_KHZ800);
         
        void setup()
        {
          Serial.begin(9600); // Starte Serialmonitor
         
          strip.begin();
          strip.show();
        }
         
        void loop()
        {
          bright    = analogRead(pot5);
          bright    = map(bright, 0, 1023, 0, 240);
         
          interval2     = analogRead(pot1);
          interval      = analogRead(pot6);
         
          rot       = analogRead(pot2);
          rot       = map(rot, 0, 1023, 0, 255);
          gruen     = analogRead(pot3);
          gruen     = map(gruen, 0, 1023, 0, 255);
          blau      = analogRead(pot4);
          blau      = map(blau, 0, 1023, 0, 255);
         
         
         
          unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
         
          strip.clear();
          strip.show();
         
          if (currentMillis - previousMillis >= interval) { // Falls mehr als 1000 ms vergangen sind
            previousMillis = currentMillis;
         
            if (counter == 0 ||  counter == 4)
            {
         
              strip.fill(strip.Color(0, 0, 255), 8, 8);
              strip.fill(strip.Color(0, 0, 255), 16, 8);
              strip.fill(strip.Color(0, 0, 255), 40, 8);
              strip.fill(strip.Color(0, 0, 255), 48, 8);
              strip.fill(strip.Color(0, 0, 255), 72, 8);
              strip.fill(strip.Color(0, 0, 255), 80, 8);
              strip.fill(strip.Color(0, 0, 255), 104, 8);
              strip.fill(strip.Color(0, 0, 255), 112, 8);
              strip.setBrightness(bright);
              strip.show();
            }
         
            else {
              strip.fill(strip.Color(251, 22, 0), 0, 8);
              strip.fill(strip.Color(251, 22, 0), 24, 8);
              strip.fill(strip.Color(251, 22, 0), 32, 8);
              strip.fill(strip.Color(251, 22, 0), 56, 8);
              strip.fill(strip.Color(251, 22, 0), 64, 8);
              strip.fill(strip.Color(251, 22, 0), 88, 8);
              strip.fill(strip.Color(251, 22, 0), 96, 8);
              strip.fill(strip.Color(251, 22, 0), 120, 8);
              strip.setBrightness(bright);
              strip.show();
            }
            counter++;
         
            if (counter == 4) counter = 0;
         
          }
        
    [/code]
    
    Grüße
    
    Weedling

After which, @my_xy_projekt (my_xy_projekt) added

    dope-walker:
    
    > Zuerst den einen teil dreimal und dann den anderen auch dreimal. Die blink frequenz steuer ich weiterhin mit dem poti.
    
    Ist folgender Gedanke richtig?  
    Es sollen die
    [code] 
         {
              strip.fill(strip.Color(0, 0, 255), 8, 8);
              strip.fill(strip.Color(0, 0, 255), 16, 8);
              strip.fill(strip.Color(0, 0, 255), 40, 8);
              strip.fill(strip.Color(0, 0, 255), 48, 8);
              strip.fill(strip.Color(0, 0, 255), 72, 8);
              strip.fill(strip.Color(0, 0, 255), 80, 8);
              strip.fill(strip.Color(0, 0, 255), 104, 8);
              strip.fill(strip.Color(0, 0, 255), 112, 8);
              strip.setBrightness(bright);
            }
    [/code]
    
    3x an und aus gehen.  
    Wenn das erledigt ist, sollen die anderen 3x an und aus gehen.  
    Die Blinkgeschwindigkeit für den ersten Teil möchtest Du mit `interval` und für den zweiten Teil mit `interval2` einstellen?
    
    Wenn es das nicht ist, dann musst Du das genauer beschreiben.

After which, @agmue (agmue) added

    dope-walker:
    
    > Zuerst den einen teil dreimal und dann den anderen auch dreimal. Die blink frequenz steuer ich weiterhin mit dem poti.
    
    Das erinnert mich an die amerikanischen Polizeiautos. Dein Programm mit leichten Abwandlungen:
    [code] 
        #include <Adafruit_NeoPixel.h>
        #define PIN 11
        Adafruit_NeoPixel strip(128, PIN, NEO_GRB + NEO_KHZ800);
        
        const byte pot6        = A5;
        unsigned long interval    = analogRead(pot6);
        unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
        byte counter = 0;
        
        void setup()
        {
          strip.begin();
          strip.show();
        }
        
        void loop()
        {
          unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
        
          if (currentMillis - previousMillis >= interval)  // Falls mehr als 1000 ms vergangen sind
          {
            previousMillis = currentMillis;
            interval      = analogRead(pot6);
        
            if (counter == 0 || counter == 2 || counter == 4)
            {
              strip.fill(strip.Color(0, 0, 255), 8, 8);
              strip.fill(strip.Color(0, 0, 255), 16, 8);
              strip.fill(strip.Color(0, 0, 255), 40, 8);
              strip.fill(strip.Color(0, 0, 255), 48, 8);
              strip.fill(strip.Color(0, 0, 255), 72, 8);
              strip.fill(strip.Color(0, 0, 255), 80, 8);
              strip.fill(strip.Color(0, 0, 255), 104, 8);
              strip.fill(strip.Color(0, 0, 255), 112, 8);
            }
            else if (counter == 6 || counter == 8 || counter == 10)
            {
              strip.fill(strip.Color(251, 22, 0), 0, 8);
              strip.fill(strip.Color(251, 22, 0), 24, 8);
              strip.fill(strip.Color(251, 22, 0), 32, 8);
              strip.fill(strip.Color(251, 22, 0), 56, 8);
              strip.fill(strip.Color(251, 22, 0), 64, 8);
              strip.fill(strip.Color(251, 22, 0), 88, 8);
              strip.fill(strip.Color(251, 22, 0), 96, 8);
              strip.fill(strip.Color(251, 22, 0), 120, 8);
            }
            else
            {
              strip.fill(strip.Color(0, 0, 0), 0, 128);
            }
            strip.show();
            if (++counter >= 12) counter = 0;
          }
        }
        
    [/code]
    
    Oder hast Du Dir was anderes vorgestellt?

After which, @dope-walker (dope-walker) added

    agmue:
    
    > 
    [code]
    >     #include <Adafruit_NeoPixel.h>
    >     #define PIN 11
    >     Adafruit_NeoPixel strip(128, PIN, NEO_GRB + NEO_KHZ800);
    >     
    >     const byte pot6        = A5;
    >     unsigned long interval    = analogRead(pot6);
    >     unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
    >     byte counter = 0;
    >     
    >     void setup()
    >     {
    >       strip.begin();
    >       strip.show();
    >     }
    >     
    >     void loop()
    >     {
    >       unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
    >     
    >       if (currentMillis - previousMillis >= interval)  // Falls mehr als 1000 ms vergangen sind
    >       {
    >         previousMillis = currentMillis;
    >         interval      = analogRead(pot6);
    >     
    >         if (counter == 0 || counter == 2 || counter == 4)
    >         {
    >           strip.fill(strip.Color(0, 0, 255), 8, 8);
    >           strip.fill(strip.Color(0, 0, 255), 16, 8);
    >           strip.fill(strip.Color(0, 0, 255), 40, 8);
    >           strip.fill(strip.Color(0, 0, 255), 48, 8);
    >           strip.fill(strip.Color(0, 0, 255), 72, 8);
    >           strip.fill(strip.Color(0, 0, 255), 80, 8);
    >           strip.fill(strip.Color(0, 0, 255), 104, 8);
    >           strip.fill(strip.Color(0, 0, 255), 112, 8);
    >         }
    >         else if (counter == 6 || counter == 8 || counter == 10)
    >         {
    >           strip.fill(strip.Color(251, 22, 0), 0, 8);
    >           strip.fill(strip.Color(251, 22, 0), 24, 8);
    >           strip.fill(strip.Color(251, 22, 0), 32, 8);
    >           strip.fill(strip.Color(251, 22, 0), 56, 8);
    >           strip.fill(strip.Color(251, 22, 0), 64, 8);
    >           strip.fill(strip.Color(251, 22, 0), 88, 8);
    >           strip.fill(strip.Color(251, 22, 0), 96, 8);
    >           strip.fill(strip.Color(251, 22, 0), 120, 8);
    >         }
    >         else
    >         {
    >           strip.fill(strip.Color(0, 0, 0), 0, 128);
    >         }
    >         strip.show();
    >         if (++counter >= 12) counter = 0;
    >       }
    >     }
    >     
    [/code]
    
    Öhm nein 
    
    Das ist genau das was ich gerne wollte   
    Vielen vielen herzlichen dank!!!!
    
    Ich habe den counter falsch geschrieben und nun versuche ich deine n zu verstehen  das hilft mir wirklich sehr viel weiter!  
    Dankeschön

@agmue (agmue) replied

    dope-walker:
    
    > versuche ich deine n zu verstehen
    
    Bei Fragen bitte fragen

Then @my_xy_projekt (my_xy_projekt) said

    dope-walker:
    
    > Öhm nein
    
    Also doch.
    
    > 3x an und aus gehen.  
    >  Wenn das erledigt ist, sollen die anderen 3x an und aus gehen.

So @dope-walker (dope-walker) replied

    Ja genau

To which @dope-walker (dope-walker) replied

    agmue:
    
    > 
    [code]
    >     {
    >       unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
    >     
    >       if (currentMillis - previousMillis >= interval)  // Falls mehr als 1000 ms vergangen sind
    >       {
    >         previousMillis = currentMillis;
    >         interval      = analogRead(pot6);
    >     
    >         if (counter == 0 || counter == 2 || counter == 4)
    >         {
    >           strip.fill(strip.Color(0, 0, 255), 8, 8);
    >           strip.fill(strip.Color(0, 0, 255), 16, 8);
    >           strip.fill(strip.Color(0, 0, 255), 40, 8);
    >           strip.fill(strip.Color(0, 0, 255), 48, 8);
    >           strip.fill(strip.Color(0, 0, 255), 72, 8);
    >           strip.fill(strip.Color(0, 0, 255), 80, 8);
    >           strip.fill(strip.Color(0, 0, 255), 104, 8);
    >           strip.fill(strip.Color(0, 0, 255), 112, 8);
    >         }
    >         else if (counter == 6 || counter == 8 || counter == 10)
    >         {
    >           strip.fill(strip.Color(251, 22, 0), 0, 8);
    >           strip.fill(strip.Color(251, 22, 0), 24, 8);
    >           strip.fill(strip.Color(251, 22, 0), 32, 8);
    >           strip.fill(strip.Color(251, 22, 0), 56, 8);
    >           strip.fill(strip.Color(251, 22, 0), 64, 8);
    >           strip.fill(strip.Color(251, 22, 0), 88, 8);
    >           strip.fill(strip.Color(251, 22, 0), 96, 8);
    >           strip.fill(strip.Color(251, 22, 0), 120, 8);
    >         }
    >         else
    >         {
    >           strip.fill(strip.Color(0, 0, 0), 0, 128);
    >         }
    >         strip.show();
    >         if (++counter >= 12) counter = 0;
    >       }
    >     }
    >     
    [/code]
    
    Wieso geht man da so zu sagen in zweier schritten bei dem counter? und nicht so wie ich mir es denken würde 1,2,3 usw....

@my_xy_projekt (my_xy_projekt) replied

    dope-walker:
    
    > so wie ich mir es denken würde 1,2,3 usw....
    [code] 
        #include <Adafruit_NeoPixel.h>
        #ifdef __AVR__
          #include <avr/power.h>
        #endif
        const byte neoPin = 11;
        const byte initBright = 255;
        
        const byte potInterval = A0;
        const byte potRot = A1;
        const byte potGruen = A2;
        const byte potBlau = A3;
        const byte potBright = A4;
        
        byte del1 = 0;
        byte del2 = 0;
        byte bright = 0;
        byte rot = 0;
        byte gruen = 0;
        byte blau = 0;
        unsigned long interval = 0;
        
        unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
        byte counter = 0;
        Adafruit_NeoPixel strip = Adafruit_NeoPixel(initBright, neoPin, NEO_GRB + NEO_KHZ800);
        
        void setup()
        {
          Serial.begin(9600); // Starte Serialmonitor
          strip.begin();
          strip.show();
        }
        
        void loop()
        {
          rot = map(analogRead(potRot), 0, 1023, 0, 255);
          gruen = map(analogRead(potGruen), 0, 1023, 0, 255);
          blau = map(analogRead(potBlau), 0, 1023, 0, 255);
          bright = map(analogRead(potBright), 0, 1023, 0, 240);
          interval = analogRead(potInterval);
        // alternativ:
        // interval = analogRead(potInterval)*2;
          unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
          if (currentMillis - previousMillis >= interval)
          {
            previousMillis += interval;
            strip.clear();
            switch (counter)
            {
              case 0 ... 2:
                {
                  strip.fill(strip.Color(0, 0, 255), 8, 8);
                  strip.fill(strip.Color(0, 0, 255), 16, 8);
                  strip.fill(strip.Color(0, 0, 255), 40, 8);
                  strip.fill(strip.Color(0, 0, 255), 48, 8);
                  strip.fill(strip.Color(0, 0, 255), 72, 8);
                  strip.fill(strip.Color(0, 0, 255), 80, 8);
                  strip.fill(strip.Color(0, 0, 255), 104, 8);
                  strip.fill(strip.Color(0, 0, 255), 112, 8);
                }
                break;
              case 3 ... 5:
                {
                  strip.fill(strip.Color(251, 22, 0), 0, 8);
                  strip.fill(strip.Color(251, 22, 0), 24, 8);
                  strip.fill(strip.Color(251, 22, 0), 32, 8);
                  strip.fill(strip.Color(251, 22, 0), 56, 8);
                  strip.fill(strip.Color(251, 22, 0), 64, 8);
                  strip.fill(strip.Color(251, 22, 0), 88, 8);
                  strip.fill(strip.Color(251, 22, 0), 96, 8);
                  strip.fill(strip.Color(251, 22, 0), 120, 8);
                }
                break;
                counter++;
                if (counter >= 6) counter = 0;
            }
            strip.setBrightness(bright);
            strip.show();
          }
          if (currentMillis - previousMillis >= interval / 2 + 1)
          {
            strip.setBrightness(0);
            strip.show();
          }
        }
    [/code]

After which, @agmue (agmue) added

    dope-walker:
    
    > in zweier schritten
    
    Nö, die geraden Zahlen bringen Farbe, die ungeraden bei `else` Dunkelheit:
    
    counter | - | Farbe  
    ---|---|---  
    0 | - | blau  
    1 | - | aus  
    2 | - | blau  
    3 | - | aus  
    4 | - | blau  
    5 | - | aus  
    6 | - | rot  
    7 | - | aus  
    8 | - | rot  
    9 | - | aus  
    10 | - | rot  
    11 | - | aus  
      
    Man kann auch noch schrumpfen:
    [code] 
        #include <Adafruit_NeoPixel.h>
        #define PIN 11
        Adafruit_NeoPixel strip(128, PIN, NEO_GRB + NEO_KHZ800);
        
        const byte pot6        = A5;
        unsigned long interval    = analogRead(pot6);
        unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
        byte counter = 0;
        
        void setup()
        {
          strip.begin();
          strip.show();
        }
        
        void loop()
        {
          unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
          if (currentMillis - previousMillis >= interval)  // Falls mehr als 1000 ms vergangen sind
          {
            previousMillis = currentMillis;
            interval      = analogRead(pot6);
            if (counter % 2) strip.fill(strip.Color(0, 0, 0), 0, 128);
            else animation( counter > 5 );
            strip.show();
            if (++counter >= 12) counter = 0;
          }
        }
        
        void animation(byte c)
        {
          const byte anzahl = 8;
          const uint16_t start[2][anzahl] = {{8, 16, 40, 48, 72, 80, 104, 112}, {0, 24, 32, 56, 64, 88, 96, 120}};
          const uint32_t farbe[2] = {strip.Color(0, 0, 255), strip.Color(251, 22, 0)};
          for (byte j = 0; j < anzahl; j++)
          {
            strip.fill(farbe[c], start[c][j], 8);
          }
        }
        
    [/code]

After which, @agmue (agmue) added

    Irgendwo habe ich gelesen, Du beschäftigst Dich mit Strukturen. Zu Übungszwecken ist das auch in diesem Thema möglich, denn dann kann das zweidimensionale Feld entfallen:
    [code] 
        #include <Adafruit_NeoPixel.h>
        #define PIN 11
        Adafruit_NeoPixel strip(128, PIN, NEO_GRB + NEO_KHZ800);
        
        const byte pot6        = A5;
        unsigned long interval    = analogRead(pot6);
        unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
        const byte anzahl = 8;
        byte counter = 0;
        
        void setup()
        {
          strip.begin();
          strip.show();
        }
        
        void loop()
        {
          unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
          if (currentMillis - previousMillis >= interval)  // Falls mehr als 1000 ms vergangen sind
          {
            previousMillis = currentMillis;
            interval      = analogRead(pot6);
            if (counter % 2) strip.fill(strip.Color(0, 0, 0), 0, 128);
            else animation( counter > 5 );
            strip.show();
            if (++counter >= 12) counter = 0;
          }
        }
        struct Start
        {
          const uint32_t farbe;
        	const uint16_t pos[anzahl];
        };
        Start start[2]
        {
          {strip.Color(0, 0, 255), {8, 16, 40, 48, 72, 80, 104, 112}},
          {strip.Color(251, 22, 0), {0, 24, 32, 56, 64, 88, 96, 120}}
        };
        void animation(byte c)
        {
          for (byte j = 0; j < anzahl; j++)
          {
            strip.fill(start[c].farbe, start[c].pos[j], 8);
          }
        }
        
    [/code]
    
    Mit einer Methode gefällt es mir noch besser:
    [code] 
        #include <Adafruit_NeoPixel.h>
        #define PIN 11
        Adafruit_NeoPixel strip(128, PIN, NEO_GRB + NEO_KHZ800);
        
        const byte pot6        = A5;
        unsigned long interval    = analogRead(pot6);
        unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
        const byte anzahl = 8;
        byte counter = 0;
        
        struct Start
        {
          const uint32_t farbe;
          const uint16_t pos[anzahl];
        
          void animation()
          {
            for (byte j = 0; j < anzahl; j++)
            {
              strip.fill(farbe, pos[j], 8);
            }
          }
        };
        Start start[2]
        {
          {strip.Color(0, 0, 255), {8, 16, 40, 48, 72, 80, 104, 112}},
          {strip.Color(251, 22, 0), {0, 24, 32, 56, 64, 88, 96, 120}}
        };
        
        void setup()
        {
          strip.begin();
          strip.show();
        }
        
        void loop()
        {
          unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
          if (currentMillis - previousMillis >= interval)  // Falls mehr als 1000 ms vergangen sind
          {
            previousMillis = currentMillis;
            interval      = analogRead(pot6);
            if (counter % 2) strip.fill(strip.Color(0, 0, 0), 0, 128);
            else start[ counter > 5 ].animation();
            strip.show();
            if (++counter >= 12) counter = 0;
          }
        }
        
    [/code]


{'source': 'discourse', 'url': 'https://forum.arduino.cc/t/led-matrix-wechsel-blinken/986632', 'title': 'Led Matrix wechsel blinken', 'views': 140, 'has_accepted_answer': False, 'word_count': 2378, 'like_count': 1, 'reply_count': 7, 'participant_count': 3, 'posts': 11, 'tags': '', 'author': '@dope-walker (dope-walker)', 'participants': '@dope-walker (dope-walker), @my_xy_projekt (my_xy_projekt), @agmue (agmue)', 'image_url': [None], 'created_at': '2022-04-29T18:43:25.043Z', 'last_posted_at': '2022-04-30T09:10:15.098Z'}