Neopixel mit 3 Buttons

Hallo zusammen bräuchte mal einen Tipp bzw. Hilfe bei meinen Project.
Ausgangspunkt= Led Strip mit 42 LEDs, die farblich aufgeteilt werden auf 3 x 14 Leds.
und mit 3 Tastern=3 x Inputs die zugeordnet werden sollen.1.Funktion beim einschalten sollen die Leds von 0-13=blau ,von 14-27=türkis,28-42 blau .dauerhaft on sein. 2.Funktion Taster1 press= Leds von 0-13=red, 14-27=türkis,28-42 türkis. 3.Funtion = Taster2 press =Leds von 0-13=türkis,
14-27=red,28-42=türkis. 4.Funktion Taster3 press= 0-13 türkis, 14-27=türkis, 28-42=red.
so gesehen ist es nur ein lauflicht zwischen rot und türkis mit Taster Input.
bin noch Anfänger habe da mal was versucht mit einem Taster der alle drei befehle ausführt.
aber ich brauche 3 Taster mit 3 Eingängen. Und ich glaube das die Farbaufteilung vereinfacht (verkürzt ) werden kann.


#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif


#define BUTTON_PIN   2
#define PIXEL_PIN    6  // 
#define PIXEL_COUNT 42
  

Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NEO_GBR);

boolean oldState = HIGH;
int     mode     = (0);    // Currently-active animation mode, 0-9

void setup() {
  pinMode(BUTTON_PIN , INPUT_PULLUP);
  strip.setBrightness(13);
  pixels.setBrightness(18);
  strip.begin(); 
  pixels.begin();

// Start Blau/Türkis

  pixels.setPixelColor(0, pixels.Color(0,0,255));
  pixels.setPixelColor(1, pixels.Color(0,0,255));
  pixels.setPixelColor(2, pixels.Color(0,0,255));
  pixels.setPixelColor(3, pixels.Color(0,0,255));
  pixels.setPixelColor(4, pixels.Color(0,0,255));
  pixels.setPixelColor(5, pixels.Color(0,0,255));
  pixels.setPixelColor(6, pixels.Color(0,0,255));
  pixels.setPixelColor(7, pixels.Color(0,0,255));
  pixels.setPixelColor(8, pixels.Color(0,0,255));
  pixels.setPixelColor(9, pixels.Color(0,0,255));
  pixels.setPixelColor(10, pixels.Color(0,0,255));
  pixels.setPixelColor(11, pixels.Color(0,0,255));
  pixels.setPixelColor(12, pixels.Color(0,0,255));
  pixels.setPixelColor(13, pixels.Color(0,0,255));
  pixels.setPixelColor(14, pixels.Color(0,255,255));
  pixels.setPixelColor(15, pixels.Color(0,255,255));
  pixels.setPixelColor(16, pixels.Color(0,255,255));
  pixels.setPixelColor(17, pixels.Color(0,255,255));
  pixels.setPixelColor(18, pixels.Color(0,255,255));
  pixels.setPixelColor(19, pixels.Color(0,255,255));
  pixels.setPixelColor(20, pixels.Color(0,255,255));
  pixels.setPixelColor(21, pixels.Color(0,255,255));
  pixels.setPixelColor(22, pixels.Color(0,255,255));
  pixels.setPixelColor(23, pixels.Color(0,255,255));
  pixels.setPixelColor(24, pixels.Color(0,255,255));
  pixels.setPixelColor(25, pixels.Color(0,255,255));
  pixels.setPixelColor(26, pixels.Color(0,255,255));
  pixels.setPixelColor(27, pixels.Color(0,255,255));
  pixels.setPixelColor(28, pixels.Color(0,0,255));
  pixels.setPixelColor(29, pixels.Color(0,0,255));
  pixels.setPixelColor(30, pixels.Color(0,0,255));
  pixels.setPixelColor(31, pixels.Color(0,0,255));
  pixels.setPixelColor(32, pixels.Color(0,0,255));
  pixels.setPixelColor(33, pixels.Color(0,0,255));
  pixels.setPixelColor(34, pixels.Color(0,0,255));
  pixels.setPixelColor(35, pixels.Color(0,0,255));
  pixels.setPixelColor(36, pixels.Color(0,0,255));
  pixels.setPixelColor(37, pixels.Color(0,0,255));
  pixels.setPixelColor(38, pixels.Color(0,0,255));
  pixels.setPixelColor(39, pixels.Color(0,0,255));
  pixels.setPixelColor(40, pixels.Color(0,0,255));
  pixels.setPixelColor(41, pixels.Color(0,0,255));
  pixels.setPixelColor(42, pixels.Color(0,0,255));
  

  

  pixels.show();
 
  
}

void loop() {
  
  // Get current button state.
  boolean newState = digitalRead(BUTTON_PIN);

  
    delay(8);
    
    if(newState == LOW) {      // Yes, still low
      if(++mode > 8) mode = 0; // Advance to next mode, wrap around after #8
      switch(mode) {           // Start the new animation...
        
        
        case 1:
        

       pixels.begin();

  //leds red-türkis-türkis
  pixels.setPixelColor(0, pixels.Color(255,0,0));
  pixels.setPixelColor(1, pixels.Color(255,0,0));
  pixels.setPixelColor(2, pixels.Color(255,0,0));
  pixels.setPixelColor(3, pixels.Color(255,0,0));
  pixels.setPixelColor(4, pixels.Color(255,0,0));
  pixels.setPixelColor(5, pixels.Color(255,0,0));
  pixels.setPixelColor(6, pixels.Color(255,0,0));
  pixels.setPixelColor(7, pixels.Color(255,0,0));
  pixels.setPixelColor(8, pixels.Color(255,0,0));
  pixels.setPixelColor(9, pixels.Color(255,0,0));
  pixels.setPixelColor(10, pixels.Color(255,0,0));
  pixels.setPixelColor(11, pixels.Color(255,0,0));
  pixels.setPixelColor(12, pixels.Color(255,0,0));
  pixels.setPixelColor(13, pixels.Color(255,0,0));




  pixels.setPixelColor(14, pixels.Color(0,255,255));
  pixels.setPixelColor(15, pixels.Color(0,255,255));
  pixels.setPixelColor(16, pixels.Color(0,255,255));
  pixels.setPixelColor(17, pixels.Color(0,255,255));
  pixels.setPixelColor(18, pixels.Color(0,255,255));
  pixels.setPixelColor(19, pixels.Color(0,255,255));
  pixels.setPixelColor(20, pixels.Color(0,255,255));
  pixels.setPixelColor(21, pixels.Color(0,255,255));
  pixels.setPixelColor(22, pixels.Color(0,255,255));
  pixels.setPixelColor(23, pixels.Color(0,255,255));
  pixels.setPixelColor(24, pixels.Color(0,255,255));
  pixels.setPixelColor(25, pixels.Color(0,255,255));
  pixels.setPixelColor(26, pixels.Color(0,255,255));
  pixels.setPixelColor(27, pixels.Color(0,255,255));  
  pixels.setPixelColor(28, pixels.Color(0,255,255));
  pixels.setPixelColor(29, pixels.Color(0,255,255));
  pixels.setPixelColor(30, pixels.Color(0,255,255));
  pixels.setPixelColor(31, pixels.Color(0,255,255));
  pixels.setPixelColor(32, pixels.Color(0,255,255));
  pixels.setPixelColor(33, pixels.Color(0,255,255));
  pixels.setPixelColor(34, pixels.Color(0,255,255));
  pixels.setPixelColor(35, pixels.Color(0,255,255));
  pixels.setPixelColor(36, pixels.Color(0,255,255));
  pixels.setPixelColor(37, pixels.Color(0,255,255));
  pixels.setPixelColor(38, pixels.Color(0,255,255));
  pixels.setPixelColor(39, pixels.Color(0,255,255));
  pixels.setPixelColor(40, pixels.Color(0,255,255));
  pixels.setPixelColor(41, pixels.Color(0,255,255));
  pixels.setPixelColor(42, pixels.Color(0,255,255));

  pixels.show();
  delay(125);

          break;
          case 2:

          pixels.begin();


  pixels.setPixelColor(0, pixels.Color(0,255,255));
  pixels.setPixelColor(1, pixels.Color(0,255,255));
  pixels.setPixelColor(2, pixels.Color(0,255,255));
  pixels.setPixelColor(3, pixels.Color(0,255,255));
  pixels.setPixelColor(4, pixels.Color(0,255,255));
  pixels.setPixelColor(5, pixels.Color(0,255,255));
  pixels.setPixelColor(6, pixels.Color(0,255,255));
  pixels.setPixelColor(7, pixels.Color(0,255,255));
  pixels.setPixelColor(8, pixels.Color(0,255,255));
  pixels.setPixelColor(9, pixels.Color(0,255,255));
  pixels.setPixelColor(10, pixels.Color(0,255,255));
  pixels.setPixelColor(11, pixels.Color(0,255,255));
  pixels.setPixelColor(12, pixels.Color(0,255,255));
  pixels.setPixelColor(13, pixels.Color(0,255,255));

  pixels.setPixelColor(14, pixels.Color(255,0,0));
  pixels.setPixelColor(15, pixels.Color(255,0,0));
  pixels.setPixelColor(16, pixels.Color(255,0,0));
  pixels.setPixelColor(17, pixels.Color(255,0,0));
  pixels.setPixelColor(18, pixels.Color(255,0,0));
  pixels.setPixelColor(19, pixels.Color(255,0,0));
  pixels.setPixelColor(20, pixels.Color(255,0,0));
  pixels.setPixelColor(21, pixels.Color(255,0,0));
  pixels.setPixelColor(22, pixels.Color(255,0,0));
  pixels.setPixelColor(23, pixels.Color(255,0,0));
  pixels.setPixelColor(24, pixels.Color(255,0,0));
  pixels.setPixelColor(23, pixels.Color(255,0,0));
  pixels.setPixelColor(24, pixels.Color(255,0,0));
  pixels.setPixelColor(25, pixels.Color(255,0,0));
  pixels.setPixelColor(26, pixels.Color(255,0,0));
  pixels.setPixelColor(27, pixels.Color(255,0,0));
  
  pixels.setPixelColor(28, pixels.Color(0,255,255));
  pixels.setPixelColor(29, pixels.Color(0,255,255));
  pixels.setPixelColor(30, pixels.Color(0,255,255));
  pixels.setPixelColor(31, pixels.Color(0,255,255));
  pixels.setPixelColor(32, pixels.Color(0,255,255));
  pixels.setPixelColor(33, pixels.Color(0,255,255));
  pixels.setPixelColor(34, pixels.Color(0,255,255));
  pixels.setPixelColor(35, pixels.Color(0,255,255));
  pixels.setPixelColor(36, pixels.Color(0,255,255));
  pixels.setPixelColor(37, pixels.Color(0,255,255));
  pixels.setPixelColor(38, pixels.Color(0,255,255));
  pixels.setPixelColor(39, pixels.Color(0,255,255));
  pixels.setPixelColor(40, pixels.Color(0,255,255));
  pixels.setPixelColor(41, pixels.Color(0,255,255));
  pixels.setPixelColor(42, pixels.Color(0,255,255));
pixels.show();

        delay(125);

          break;



          

          case 3:

           pixels.begin();


  pixels.setPixelColor(0, pixels.Color(0,255,255));
  pixels.setPixelColor(1, pixels.Color(0,255,255));
  pixels.setPixelColor(2, pixels.Color(0,255,255));
  pixels.setPixelColor(3, pixels.Color(0,255,255));
  pixels.setPixelColor(4, pixels.Color(0,255,255));
  pixels.setPixelColor(5, pixels.Color(0,255,255));
  pixels.setPixelColor(6, pixels.Color(0,255,255));
  pixels.setPixelColor(7, pixels.Color(0,255,255));
  pixels.setPixelColor(8, pixels.Color(0,255,255));
  pixels.setPixelColor(9, pixels.Color(0,255,255));
  pixels.setPixelColor(10, pixels.Color(0,255,255));
  pixels.setPixelColor(11, pixels.Color(0,255,255));
  pixels.setPixelColor(12, pixels.Color(0,255,255));
  pixels.setPixelColor(13, pixels.Color(0,255,255));
  pixels.setPixelColor(14, pixels.Color(0,255,255));
  pixels.setPixelColor(15, pixels.Color(0,255,255));
  pixels.setPixelColor(16, pixels.Color(0,255,255));
  pixels.setPixelColor(17, pixels.Color(0,255,255));
  pixels.setPixelColor(18, pixels.Color(0,255,255));
  pixels.setPixelColor(19, pixels.Color(0,255,255));
  pixels.setPixelColor(20, pixels.Color(0,255,255));
  pixels.setPixelColor(21, pixels.Color(0,255,255));
  pixels.setPixelColor(22, pixels.Color(0,255,255));
  pixels.setPixelColor(23, pixels.Color(0,255,255));
  pixels.setPixelColor(24, pixels.Color(0,255,255));
  pixels.setPixelColor(25, pixels.Color(0,255,255));
  pixels.setPixelColor(26, pixels.Color(0,255,255));
  pixels.setPixelColor(27, pixels.Color(0,255,255));
  
   pixels.setPixelColor(28, pixels.Color(255,0,0));
   pixels.setPixelColor(29, pixels.Color(255,0,0));
   pixels.setPixelColor(30, pixels.Color(255,0,0));
   pixels.setPixelColor(31, pixels.Color(255,0,0));
   pixels.setPixelColor(32, pixels.Color(255,0,0));
   pixels.setPixelColor(33, pixels.Color(255,0,0));
   pixels.setPixelColor(34, pixels.Color(255,0,0));
   pixels.setPixelColor(35, pixels.Color(255,0,0));
   pixels.setPixelColor(36, pixels.Color(255,0,0));
   pixels.setPixelColor(37, pixels.Color(255,0,0)); 
   pixels.setPixelColor(38, pixels.Color(255,0,0));
   pixels.setPixelColor(39, pixels.Color(255,0,0));
   pixels.setPixelColor(40, pixels.Color(255,0,0));
   pixels.setPixelColor(41, pixels.Color(255,0,0));
   pixels.setPixelColor(42, pixels.Color(255,0,0));
   
 
  
pixels.show();

        delay(125);


          break;

      }
      }
     
        
    }

Bitte eine for schleife verwenden. Dann kann man sich 3/4 der pixels.set sparen

Grüße Uwe

So jetzt aber...

Bitte den Sketch in Code-Tags setzen. So ist der nicht lesbar.
Schaltfläche </> verwenden.

ok habe ich gemacht...

ich würde sogar sogar sagen, schau dir .fill() an und gib gleich an startPixel, Anzahl + Farbe dann ist es nur ein einzeiler je Farbe!

ok mache ich mal. mein große Problem sind die 3Taster einzubinden...

ist ja noch schlimmer geworden.

for (byte i=0; i<14;i++)
{
pixels.setPixelColor(i, pixels.Color(0,0,255));
pixels.setPixelColor(i+14, pixels.Color(0,255,255));
pixels.setPixelColor(i+28, pixels.Color(0,0,255));
}
 pixels.setPixelColor(42, pixels.Color(0,0,255));

Wieso hast Du 43 Pixel?

ich würde eine Funktion machen der man die Farben (für die 3 Bereiche) übergibt und je Tastendruck diese Funktion dann aufrufen, alla

if (digitalRead(BUTTON_PIN) == LOW) setze(0x0000FF, 0x00FFFF, 0x0000FF); 

3 Zeilen im Loop,
eine Funktion ... mit vieleicht 6 Zeilen oder gar weniger...

edit:

// https://forum.arduino.cc/t/neopixel-mit-3-buttons/1013925/10

#include <Adafruit_NeoPixel.h>

constexpr byte stepAPin {A0};
constexpr byte stepBPin {A1};
constexpr byte stepCPin {A2};
constexpr byte pixelPin {8}; // du 6
constexpr byte pixelCount{42};

Adafruit_NeoPixel pixels(pixelCount, pixelPin, NEO_GRB + NEO_KHZ800);

void set(uint32_t a, uint32_t b, uint32_t c)
{
  //void   fill (uint32_t c=0, uint16_t first=0, uint16_t count=0) // // https://adafruit.github.io/Adafruit_NeoPixel/html/class_adafruit___neo_pixel.html
  pixels.fill(a, 0, 14); 
  pixels.fill(b, 14, 15);   // deine Anzahl in Abschnitt b musst selber überprüfen, aber so hast es geschrieben
  pixels.fill(c, 29, 14);
  pixels.show();
}

void setup() {
  pinMode(stepAPin, INPUT_PULLUP);
  pinMode(stepBPin, INPUT_PULLUP);
  pinMode(stepCPin, INPUT_PULLUP);
  pixels.begin();
  pixels.setBrightness(18);
  set(0xFFFF00, 0x0000FF, 0x0000FF);
}

void loop() {
  if (digitalRead(stepAPin) == LOW) set(0xFF0000, 0x00FFFF, 0x00FFFF);
  if (digitalRead(stepBPin) == LOW) set(0x00FFFF, 0xFF0000, 0x00FFFF);
  if (digitalRead(stepCPin) == LOW) set(0x00FFFF, 0x00FFFF, 0xFF0000);
}

nicht mal 42 Zeilen, da könnte man jetzt noch Konstanten für die Farben machen...

evtl. musst die Reihenfolge noch richtig stellen, aber so in etwa soll das doch lesbar sein ... finde ich ^^

2 Likes

ich danke dir ,super danke...

läuft super nochmals vielen dank...

Hast Du nun 42 oder 43 LED?

1 Like

42 sorry habe ich geändert

dann musst du das auch in deiner Beschreibung und im Code richtig stellen...

1 Like

ok danke ,erstaunlich wie kurz das Programm von dir ist .

dabei ist das jetzt nicht mal bis letzte ausoptimiert.
Aber ich finde so ist es noch gut verständlich und lesbar.

einfach im Hinterkopf behalten:
bevor man mit STRG-C eine Codezeile dupliziert, überlegen wie man das Program das machen lassen kann.

edit:
man könnte die Phasen in eine Struktur legen und dann mit For Schleifen arbeiten.
Wird aber eigentlich nicht kürzer, aber es schaut nicht mehr nach Copy-Paste aus.
Ich tu mich aber leichter beim testen. Ich hab z.B. nur einen Strip mit 3 Pixel, das ändere ich genau in einer einzigen Zeile und der Rest geschieht automatisch.

// https://forum.arduino.cc/t/neopixel-mit-3-buttons/1013925/10
// ohne Codeduplikate

#include <Adafruit_NeoPixel.h>

constexpr byte pixelPin {8};    // du 6
constexpr byte pixelCount{42};
constexpr byte sections {3};    // the strip will be devided into n parts
struct {
  const byte stepPin;
  const uint32_t color[sections];
} phase[] {
  {A0, 0xFF0000, 0x00FFFF, 0x00FFFF},
  {A1, 0x00FFFF, 0xFF0000, 0x00FFFF},
  {A2, 0x00FFFF, 0x00FFFF, 0xFF0000}
};

Adafruit_NeoPixel pixels(pixelCount, pixelPin, NEO_RGB + NEO_KHZ800); // du NEO_GRB

void set(const uint32_t color[sections])
{
  //void   fill (uint32_t c=0, uint16_t first=0, uint16_t count=0) // // https://adafruit.github.io/Adafruit_NeoPixel/html/class_adafruit___neo_pixel.html
  for (int i = 0; i < sections; i++) 
    pixels.fill(color[i], i * pixelCount / sections, pixelCount / sections);
  pixels.show();
}

void setup() {
  for (auto &i : phase) pinMode(i.stepPin, INPUT_PULLUP);
  pixels.begin();
  pixels.setBrightness(18);
  uint32_t startcolor[sections] = {0xFFFF00, 0x0000FF, 0x0000FF};
  set(startcolor);
}

void loop() {
  for (auto &i : phase) 
    if (digitalRead(i.stepPin) == LOW) set(i.color);
}

ich probier noch was anderes ...

1 Like

Ja, wirklich fast Angst zu bekommen :wink:
Grüße Uwe

2 Likes

ok mein problem war am anfang das es so viele beispiele im netz gibt wie zb./Neopixel,FastLED,Bounce2 usw. da weiss man als anfänger überhaupt nicht wo die Glocken hängen.wenn ich jetzt sehe , wie einfach das gehen könnte...

ne wird nicht besser.
Anders halt.
zunächst hab ich mal versucht ohne Struct auszukommen:

// https://forum.arduino.cc/t/neopixel-mit-3-buttons/1013925/10
// ein Array für die Pins, ein Zweidimensionales Array für die Farben, Speicher: 2940/93

#include <Adafruit_NeoPixel.h>

constexpr byte pixelPin {8};    // du 6
constexpr byte pixelCount {42};
constexpr byte sections {3};    // the strip will be devided into n parts
const byte stepPin[] {A0, A1, A2};
const uint32_t color[sections][sections]
{
  {0xFF0000, 0x00FFFF, 0x00FFFF}, // erster Button 
  {0x00FFFF, 0xFF0000, 0x00FFFF}, // zweiter Button
  {0x00FFFF, 0x00FFFF, 0xFF0000}, // dritter Button
};

Adafruit_NeoPixel pixels(pixelCount, pixelPin, NEO_RGB + NEO_KHZ800); // du NEO_GRB

void set(const uint32_t color[sections])
{
  //void   fill (uint32_t c=0, uint16_t first=0, uint16_t count=0) // // https://adafruit.github.io/Adafruit_NeoPixel/html/class_adafruit___neo_pixel.html
  for (int i = 0; i < sections; i++) 
    pixels.fill(color[i], i * pixelCount / sections, pixelCount / sections);
  pixels.show();
}

void setup() {
  for (auto &i : stepPin) pinMode(i, INPUT_PULLUP);
  pixels.begin();
  pixels.setBrightness(18);
  uint32_t startcolor[sections] = {0xFFFF00, 0x0000FF, 0x0000FF};  
  set(startcolor);
}

void loop() {
  for (size_t i = 0; i < sections; i++) 
    if (digitalRead(stepPin[i]) == LOW) set(color[i]); 
}

und schlussendlich die Erkenntnis, eine For-Schleife statt drei ... das wird nicht "kurz" wenn man sauber Klammern setzt. Da schreib ichs lieber hart hin.

Array für die Farben braucht es eigentlich auch nicht, wenn man sich einfach leistet, den ganzen strip mal zu füllen und nur den gewünschten Abschnitt umzufärben.
ist jetzt wieder Zeilenmäßig gleich kurz wie die erste Fassung, braucht etwa 100 byte weniger Programmspeicher jedoch 4 byte mehr SRAM.

// https://forum.arduino.cc/t/neopixel-mit-3-buttons/1013925/10
// ein Array für die Pins, Variablen für aktive/inaktive Farben;  Speicher: 2884/45

#include <Adafruit_NeoPixel.h>

constexpr byte pixelPin {8};    // du 6
constexpr byte pixelCount {42};
constexpr byte sections {3};    // the strip will be devided into n parts
constexpr byte stepPin[] {A0, A1, A2};
constexpr uint32_t colorActive {0xFF0000};
constexpr uint32_t colorPassive {0x00FFFF};

Adafruit_NeoPixel pixels(pixelCount, pixelPin, NEO_RGB + NEO_KHZ800); // du NEO_GRB

void setup() {
  for (auto &i : stepPin) pinMode(i, INPUT_PULLUP);
  pixels.begin();
  pixels.setBrightness(18);
  pixels.fill(0xFFFF00, 0 * pixelCount / sections, pixelCount / sections); // Startfarbe erster Abschnitt
  pixels.fill(0x0000FF, 1 * pixelCount / sections, pixelCount / sections);
  pixels.fill(0x0000FF, 2 * pixelCount / sections, pixelCount / sections);
  pixels.show();
}

void loop() {
  for (size_t i = 0; i < sections; i++) 
    if (digitalRead(stepPin[i]) == LOW) 
    { 
      pixels.fill(colorPassive);
      pixels.fill(colorActive, i * pixelCount / sections, pixelCount / sections);
      pixels.show();
    }
}

ich schließe das Thema für mich jetzt.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.