3 ws2812 Streifen mit 2 Button steuern?

Hey liebes Forum,
ich habe eine Frage zu meinem Programm, in dem ich folgendes realisieren will.

Ich benutze einen Arduino Nano 3 Streifen und 2 Button.
Mit einem Button will ich den Streifen 1 einschalten und Programme wechseln.
Mit dem zweiten Button möchte ich gerne den Streifen 2 einschalten und Programme wechseln. Aktuell sind diese Programme zwar gleich, jedoch möchte ich das mit der Zeit ändern und das Prinzip verstehen.
Wenn beiden Button gleichzeitig gedrückt werden möchte ich gerne den 3 Streifen, der nur aus 2 einzelnen Pixeln besteht, einschalten bzw auch hier die Programme ändern.
Die Einstellung der Helligkeit erfolgt über das Programm, falls das jedoch auch möglich ist, wäre es super wenn man die Helligkeit durch langes drücken (3-5s) der Button verändern könnte.

Ich habe keine wahnsinnige Erfahrung mit Programmieren und habe hierfür mich durch verschieden Tutorials, Videos und Internetseiten mal durchgeschlagen und habe folgendes erschaffen. Mir ist aufgefallen das ich manches doppelt bzw Zuviel habe und auch unnötiger weise die Namensgebung geändert habe. Allerdings lasse ich das mal so zur Übersicht damit ich weiß was wofür ist. Ich denke das ich in den Button, Case Funktionen einen Fehler habe.

Wäre super wenn mir da jemand weiterhelfen könnte. Vielen lieben Dank.

hirsch.ino (27.7 KB)

Zeige Deinen Code mit Code Tags </>, dann bekommst Du vielleicht mehr Antworten.

DrDiettrich:
Zeige Deinen Code mit Code Tags </>, dann bekommst Du vielleicht mehr Antworten.

Könnte schwierig sein - der Code hat deutlich mehr als 1000 Zeilen und fast 30 000 Zeichen... :slight_smile:

Hi

Warum packst Du nicht alle Stripes zusammen, erstellst nur eine Instanz und setzt eben nur die Pixel, Die Du gerade sehen willst?
Ggf. musst Du Da mit Offsets arbeiten, da Dein jetziger 2.ter Stripe eben nicht bei LED 0 anfängt, sondern erst bei LED 2

  • Stripe 1 Augen (0 & 1)
  • Stripe 2 Innen (2-84)
  • Stripe 3 Außen (85-136) - wenn ich mich nicht verrechnet habe :wink:

Warum hast Du die drei Bereiche in setup() eingeklammert?

Wenn Du in loop() bei jedem Durchlauf neue Daten in den EEprom schreibst, wird Dieser nicht sonderlich lange halten (Schreibzyklen siehe Datenblatt des verwendeten AVR).
Wenn Du so was vorhast, suche Mal nach FRAM - beliebig schnell beschreibbar, Datenerhalt bei Spannungsverlust, I²C-Version pinkompatibel zum I²C-EEprom (z.B. auf diversen RTC) - als DIP immerhin mit 512 BYTE (4kb = Kilo-BIT ... durch 8 = 0,5KB oder 512 Byte).
Als SOP8 mit 256kb = 32kB (da stümpere ich aber noch an meinen Adapter-Platinen rum - SMD ist Nichts für mich).

Drücke Mal STRG+T in der IDE - Das rückt den Code sinnig ein - lässt sich dann besser lesen und man findet einfacher Klammer-Fehler.

MfG

uxomm:
Könnte schwierig sein - der Code hat deutlich mehr als 1000 Zeilen und fast 30 000 Zeichen... :slight_smile:

Wovon aber die unnötigen Leerzeilen schon alleine 756 ausmachen :grin:
Hab mir gerade mal den Spaß gemacht, und die entfernt (allerdings waren das nicht alle, um die Lesbarkeit nicht zu zerstören, also ca 50 Stück warem zu Schluss noch drin)

Das freut mich natürlich wenn ich euch mit meinem Programm erheitern konnte

this is code i've had working on a ws2812 strip of mine:

#include <Adafruit_NeoPixel.h>
#define PIN 2
Adafruit_NeoPixel strip = Adafruit_NeoPixel(90, PIN, NEO_RGB + NEO_KHZ800);

void setup() {
  delay(2500);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  for (int i=00; i<91; i++){
      strip.setPixelColor(i, strip.Color(0, 255, 0));
      strip.show();
     }
}

Difference i see here vs your code is i use:
Adafruit_NeoPixel strip = Adafruit_NeoPixel(90, PIN, NEO_RGB + NEO_KHZ800);

your code uses

Adafruit_NeoPixel strip3 = Adafruit_NeoPixel(NumPixelaugen, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(NumPixelinnen, PiN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(NumPixelaussen, Pin, NEO_GRB + NEO_KHZ800);

try changing the GRB to RGB, as its for a different type of strip.

byte Button3=(Button2,HIGH and Button1,HIGH);

Was soll das denn bedeuten?

   case 17  : {
                Static2(255,255,0);
 
               break;
              }

Die Klammern sind überflüssig und optisch störend (in allen switch Konstrukten).

   EEPROM.put(39,39);

put auf Konstanten habe ich noch nicht gesehen. Das speichert 2 Bytes, korrekt?
Wozu diese magischen Konstanten?

    asm volatile ("  jmp 0");

Ich mag keine Resets als Programmbestandteil.

void Static2(byte red2, byte green2, byte blue2){

    setAll2(red2,green2,blue2);
    showStrip2();
}

void Static12(byte red2, byte green2, byte blue2){

    setAll2(red2,green2,blue2);
    showStrip2();
}

Wo ist der Unterschied?

Hey zunächst einmal vielen Lieben Dank an alle die ihre Ideen und Vorschläge geschrieben haben bzw die sich die Mühe gemacht haben mein Programm anzuschauen. Leider habe ich das immer noch nicht zum laufen gebracht, ich habe mir nun auch ein Buch bestellt das mir hoffentlich die Lösung verrät. Bin weiterhin am probieren und werde mich wieder melden, wenn ich es hinbekommen habe.