NEOPIXEL Ansteuerung

Hallo zusammen, für LiveProduktionen möchte ich gerne auf jeder Kamera einen Ring mit Neopixel setzen, um so zu zeigen welche Kamera gerade 'OnAir' ist.

Dafür habe ich 4 Taster mit LED-Ring, (für jede Kamera einen Taster)

Wird z.B. Taster 1 gedrückt, leuchtet es am Taster 1, an Taster2, 3 & 4 geht es aus.

Das funktioniert soweit alles.

Ich möchte jetzt aber gerne noch die NeoPixel integrieren und für jede 'Kamera' einen seperaten Pin nutzen.

Es sollen also 4 Streifen mit NeoPixel angeschlossen werden, jeder davon sollte gedimmt sein (die sind sonst echt hell.. :sunglasses: )

Jetzt zu meiner Frage;
ist das überhaupt möglich? Wenn ja, kann mich dazu bitte jemand unterstützen?

Anbei schonmal der Sketch, der funktioniert soweit, bei Kamera 1 gehen die NeoPixel auch an, dann aber nicht mehr aus... :roll_eyes:

Freue mich auf eure Tipps :slight_smile:

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> 
#endif

#define PIN        8 // NEOPIXEL KAMERA1


#define NUMPIXELS 16 


Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);




const int TasterLED1 = 9;
const int TasterLED2 = 10;
const int TasterLED3 = 11;
const int TasterLED4 = 12;

const int Taster1 = A0;
const int Taster2 = A1;
const int Taster3 = A2;
const int Taster4 = A3;


  

void setup() {

  #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
 

  pixels.begin();


  pinMode(TasterLED1,OUTPUT);
  pinMode(TasterLED2,OUTPUT);
  pinMode(TasterLED3,OUTPUT);
  pinMode(TasterLED4,OUTPUT);

  pinMode(Taster1,INPUT_PULLUP);
  pinMode(Taster2,INPUT_PULLUP);
  pinMode(Taster3,INPUT_PULLUP);
  pinMode(Taster4,INPUT_PULLUP);
  
  digitalWrite(TasterLED1,LOW);
  digitalWrite(TasterLED2,LOW);
  digitalWrite(TasterLED3,LOW);
  digitalWrite(TasterLED4,LOW);
  
}

void loop() {

   for(int i=0; i<NUMPIXELS; i++) { 
    pixels.setPixelColor(i, pixels.Color(0, 150, 0)); 
   
  }

  
  if (digitalRead(Taster1) == LOW) {
    digitalWrite(TasterLED1,HIGH);
    digitalWrite(TasterLED2,LOW);
    digitalWrite(TasterLED3,LOW);
    digitalWrite(TasterLED4,LOW);
    pixels.show();  
    // NEOPIXEL Kamera 1 GRÜN
    // NEOPIXEL Kamera 2,3,4 ROT
   }
   
    if (digitalRead(Taster2) == LOW) {
    digitalWrite(TasterLED1,LOW);
    digitalWrite(TasterLED2,HIGH);
    digitalWrite(TasterLED3,LOW);
    digitalWrite(TasterLED4,LOW);
    pixels.clear(); // Testweise zum Ausschalten von Kamera 1 - funktioniert aber nicht
    // NEOPIXEL Kamera 2 GRÜN
    // NEOPIXEL Kamera 1,3,4 ROT
   }

  if (digitalRead(Taster3) == LOW) {
    digitalWrite(TasterLED1,LOW);
    digitalWrite(TasterLED2,LOW);
    digitalWrite(TasterLED3,HIGH);
    digitalWrite(TasterLED4,LOW);
    // NEOPIXEL Kamera 3 GRÜN
    // NEOPIXEL Kamera 1,2,4 ROT
   }
   
if (digitalRead(Taster4) == LOW) {
    digitalWrite(TasterLED1,LOW);
    digitalWrite(TasterLED2,LOW);
    digitalWrite(TasterLED3,LOW);
    digitalWrite(TasterLED4,HIGH); 
    // NEOPIXEL Kamera 4 GRÜN
    // NEOPIXEL Kamera 1,2,3 ROT
   }

}

Da fehlt danach das pixels.show() - clear() setzt nur die internen Speicher zurück, aber überträgt das nicht automatisch.

Ach so - Deine Frage:
Natürlich ist das möglich. Beispielsweise mit vier Instanzen von Adafruit_NeoPixel (für jede Kamera eine) an vier Pins und dann die vier passend setzen oder löschen - analog zu dem wie das mit den rot/grün LEDs schon machst.

Ja möglich.
Ich versuch mal eine Unterstützung.

Ich habe KEINE Pixel und auch keine Hardware.
Alles was ich hier reingepickt habe ist ins blaue.
Aber @wno158 wird da sicher helfen, wenn was klemmt. Vielleicht auch unser @agmue .
Ich habe etwas ausprobiert mit denPixels - das ist evtl. nicht funktional.
Aber die Taster und die LEDs dazu sollten gehen.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

const byte camPin[4] = {8, 7, 6, 5}; // NEOPIXEL KAMERA1,2,3,4
const byte numPixel = 16;

Adafruit_NeoPixel pixelCam[4] = {Adafruit_NeoPixel  (numPixel, camPin[0], NEO_GRB + NEO_KHZ800),
                                 Adafruit_NeoPixel  (numPixel, camPin[1], NEO_GRB + NEO_KHZ800),
                                 Adafruit_NeoPixel  (numPixel, camPin[2], NEO_GRB + NEO_KHZ800),
                                 Adafruit_NeoPixel  (numPixel, camPin[0], NEO_GRB + NEO_KHZ800),
                                };

const byte tasterLed[4] = {9, 10, 11, 12};
const byte tasterPin[4] = {A0, A1, A2, A3};

void setup()
{
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set (clock_div_1);
#endif
  for (byte b = 0; b < 4; b++)
  {
    pixelCam[b].begin();
    digitalWrite (tasterLed[b], LOW);
    pinMode (tasterLed[b], OUTPUT);
    pinMode (tasterPin[b], INPUT_PULLUP);
    for (byte p = 0; p < numPixel; p++)
    {
      pixelCam[b].setPixelColor (p, pixelCam[b].Color (0, 150, 0));
    }
  }
}

void tasterAbfrage()
{
  for (byte b = 0; b < 4; b++)
  {
    if (!digitalRead (tasterPin[b]))
    {
      for (byte t = 0; t < 4; b++)
      {
        digitalWrite (tasterLed[t], LOW);
        for (byte p = 0; p < numPixel; p++)
        {
          pixelCam[b].setPixelColor (p, pixelCam[t].Color (0, 150, 0));
        }
      }
      digitalWrite (tasterLed[b], HIGH);
      for (byte p = 0; p < numPixel; p++)
      {
        pixelCam[b].setPixelColor (p, pixelCam[b].Color (0, 150, 0));
      }
      pixelCam[b].show();
    }
  }
}

void loop()
{
  tasterAbfrage();
}
1 Like
  • wie kann ich das dann Übertragen?

Kannst du mir das zeigen, wie ich da für jeden Pin einen Streifen gesondert ansteuern kann?
so tief bin ich leider noch nicht im Thema :roll_eyes:

Danke für den Code! - Da funktioniert aber Tatsächlich gar nix mehr.. :frowning:

Probier mal den KurzSketch, ob die LED's gehen:

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif


const byte tasterLed[4] = {9, 10, 11, 12};
const byte tasterPin[4] = {A0, A1, A2, A3};

void setup()
{
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set (clock_div_1);
#endif
  for (byte b = 0; b < 4; b++)
  {
    digitalWrite (tasterLed[b], LOW);
    pinMode (tasterLed[b], OUTPUT);
    pinMode (tasterPin[b], INPUT_PULLUP);
  }
}

void tasterAbfrage()
{
  for (byte b = 0; b < 4; b++)
  {
    if (!digitalRead (tasterPin[b]))
    {
      for (byte t = 0; t < 4; b++)
      {
        digitalWrite (tasterLed[t], LOW);
      }
      digitalWrite (tasterLed[b], HIGH);
    }
  }
}

void loop()
{
  tasterAbfrage();
}
1 Like

Hmm. So:

    if (digitalRead(Taster2) == LOW) {
    digitalWrite(TasterLED1,LOW);
    digitalWrite(TasterLED2,HIGH);
    digitalWrite(TasterLED3,LOW);
    digitalWrite(TasterLED4,LOW);
    pixels.clear(); // Testweise zum Ausschalten von Kamera 1 - funktioniert aber nicht
    pixels.show();
    // NEOPIXEL Kamera 2 GRÜN
    // NEOPIXEL Kamera 1,3,4 ROT
   }

Nun, du musst dann schon an Deiner Hardware ein paar Erweiterungen vornehmen (die drei fehlenden NeoPixel-Ringe anschließen) und ggf. die Pins im Sketch von @my_xy_projekt anpassen falls Du anders verkabelst.
Da ist auch noch ein kleiner Copy&Paste-Fehler drin: camPin[0] wird in der Initialisierung des Arrays für die NeoPixel-Ringe zweimal verwendet.

Grübele gerade über einem Sketch, der Taster, LED Pin und NeoPixel in einer Struktur (Klasse) zusammenfasst... aber jetzt hat die schönere Hälfte erstmal zum Abendessen gerufen.

1 Like
  • Funktioniert leider auch nicht..

Gerade die Schaltung der 1 an und 3 aus sollte man in eine Funktion auslagern, mit Übergabe wer an. Alle aus und die eine an. evtl sogar erweitert auf alle aus.

Gruß Tommy

Was geht nicht?
Ich habe nichts hier - aber Deine Pins verwendet.
Die LED-Pins müssen gehen.

  • wenn man weiß wie, ists easy.. Danke!

Hab ich gemacht, den Fehler hab ich auch gesehen und gleich angepasst.. Hat nur leider nix geholfen..

Danke - und dann erstmal n Guten :smiley:

leider machen sie das aber nicht..

Dann kann ich nicht weiter helfen. Ich probier das aber später nochmal aus....

1 Like

Danke :smiling_face_with_three_hearts:

Da ich nicht genug Hardware auf die Schnelle zusammenstecken kann wird das mit dem Alternativsketch heute nix mehr (wäre auch mehr Kür, die Grundidee von @my_xy_projekt sollte funktionieren).

Bei der Kurzversion ohne Neos in Zeile 29 - das zweite for - ist ein b++, das sollte m.E. ein t++ sein. Ich würde ich die Funktion tasterAbfrage() etwas anders basteln:

void tasterAbfrage()
{
  for (byte b = 0; b < 4; b++)
  {
    if (!digitalRead (tasterPin[b]))
    {
      for (byte t = 0; t < 4; t++)
      {
        if (t == b)
        {
          // gedrückte Taste grün
          digitalWrite (tasterLed[t], HIGH);
        }
        else
        {
          // alle anderen rot
          digitalWrite (tasterLed[t], LOW);
        }
      }
    }
  }
}

Geht das besser?

1 Like

Wenn ich so nett gebeten werde, dann eine mit einem UNO getestete Variante von mir, basierend auf #3 mit kleinen Änderungen:

#include <Adafruit_NeoPixel.h>

const byte camPin[4] = {5, 6, 7, 8}; // NEOPIXEL KAMERA1,2,3,4
const byte numPixel = 16;

Adafruit_NeoPixel pixelCam[4] = {Adafruit_NeoPixel  (numPixel, camPin[0], NEO_RGB + NEO_KHZ800),
                                 Adafruit_NeoPixel  (numPixel, camPin[1], NEO_RGB + NEO_KHZ800),
                                 Adafruit_NeoPixel  (numPixel, camPin[2], NEO_RGB + NEO_KHZ800),
                                 Adafruit_NeoPixel  (numPixel, camPin[3], NEO_RGB + NEO_KHZ800),
                                };

const byte tasterLed[4] = {9, 10, 11, 12};
const byte tasterPin[4] = {A0, A1, A2, A3};

void setup()
{
  for (byte b = 0; b < 4; b++)
  {
    pinMode (tasterPin[b], INPUT_PULLUP);
    pinMode (tasterLed[b], OUTPUT);
    pinMode (LED_BUILTIN, OUTPUT);
    pixelCam[b].begin();
    pixelCam[b].setBrightness(50);
    pixelCam[b].fill(0xFF0000);  // Rot
    pixelCam[b].show();
  }
}

void tasterAbfrage()
{
  for (byte b = 0; b < 4; b++)
  {
    if (!digitalRead (tasterPin[b]))
    {
      for (byte t = 0; t < 4; t++)
      {
        if (t == b)
        {
          digitalWrite (tasterLed[t], HIGH);
          pixelCam[t].fill(0xFF0000);  // Rot
        }
        else
        {
          digitalWrite (tasterLed[t], LOW);
          pixelCam[t].fill(0x00FF00);  // Grün
        }
        pixelCam[t].show();
      }
    }
  }
}

void herzschlag()
{
  uint32_t jetzt = millis();
  static uint32_t vorhin = jetzt;
  const uint32_t intervall = 222;

  if (jetzt - vorhin >= intervall)
  {
    vorhin = jetzt;
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }
}

void loop()
{
  tasterAbfrage();
  herzschlag();
}

Bei mir paßt das so mit Rot und Grün. Wenn die Farben bei Dir vertauscht sind, versuche mal "NEO_GRB", das ist vom LED-Streifenhersteller abhängig.

1 Like

Perfekt, das Funktioniert schonmal!

Tausend Dank an euch alle! Das Funktioniert genauso wie ich es mir vorstelle :star_struck:

Der Herzschlag soll zeigen, daß noch andere Aktivitäten möglich wären.

Der Dank geht am @my_xy_projekt für die gute Vorlage :trophy:

Danke!
Nehme ich gerne an :slight_smile:

@simons_arduinoprojects
Ich hab tatsächlich auf dem Nachhauseweg gestern abend noch die Lösung gehabt.
Und sie ist natürlich, wie sollte es anders sein, 42

In diesem Fall war @wno158 schon schneller, aber der Sketch aus #6 hat genau in der Zeile das Problem :wink:

Schön, wenns gefällt.
Und dafür das ich das trocken angegangen bin, freu ich mich umsomehr :grinning: