Neopixel ansteuern

Antworten
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Neopixel ansteuern

Beitrag von Admin »

Ich bin eigentlich kein Freund von LED geflimmere und geblinke. Aber jetzt musste ich doch mal dran, weil ich eine Anzeige mit LED´s, also diesen Neopixel Kram brauche. Das Ding ist ein Kreis mit etwa 80mm mittlerer Durchmesser mit 24 sehr hellen LED´s. Also "sehr hell" ist nur mein Gefühl, als ich diese Dinger mit vollgas angesteuert habe. :eek: Also wert für Vollgas ist "255", der Wert der für mich die Helligkeit erträglich machte war "15".

Hier ist mal das Testprogramm, das ich mir zum Testen zusammengebastelt habe. Das baut abwechselnd Farbringe in verschiedenen Farben auf. Ich muss mir da mal noch ein paar wichtige Farben dazubasteln, die man gut darstellen kann.

Ich habe den Code nochmal um ein paar Farben erweitert. Unter anderem wollte ich den Strom bei Hell Weiß haben. Also bei 255,255,255. Da bin ich bei 2 Ampere mit 48 LED´s Also zwei dieser Ringe die ich da zum Testen besorgt habe. :eek: Da merkt man dann, wenn man Licht will, wollen die Dinger auch Strom. :idea: 240mA ist der kleinste Stron den ich bei meinem Farbenspiel habe. Das ist das dunkelste Orange.

.

Code: Alles auswählen

// NeoPixel Ring einfache Skizze (c) 2013 Shae Erisson
// unter der GPLv3-Lizenz veröffentlicht, um dem Rest der AdaFruit NeoPixel-Bibliothek zu entsprechen

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

// Welcher Pin des Arduino ist mit den NeoPixels verbunden?
// Bei einem Schmuckstück oder einer Gemma empfehlen wir, dies auf 1 zu ändern
#define PIN            6

// Wie viele NeoPixel sind an den Arduino angeschlossen?
#define NUMPIXELS     48

// Wenn wir die NeoPixel-Bibliothek einrichten, teilen wir ihr mit, wie viele Pixel und welcher Pin zum Senden von Signalen verwendet werden soll.
// Beachten Sie, dass Sie bei älteren NeoPixel-Streifen möglicherweise den dritten Parameter ändern müssen - siehe Strandtest
// Beispiel für weitere Informationen zu möglichen Werten.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int delayval = 30; // Schleifen Wartezeit
int i = 0;  // Wile Schleife
byte f = 0; // FarbDurchgangs Nummer
byte r = 0;
byte g = 100;
byte b = 0;
void setup() {
  Serial.begin(9600);
  // Dies ist für Trinket 5V 16MHz, Sie können diese drei Leitungen entfernen, wenn Sie kein Trinket verwenden
#if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
  // Ende des Sondercodes für Schmuckstücke

  pixels.begin(); // Dadurch wird die NeoPixel-Bibliothek initialisiert.
}

void loop() {
  // Für einen Satz von NeoPixeln ist das erste NeoPixel 0, das zweite ist 1, bis hin zur Anzahl der Pixel minus eins.
  for (i = 0; i < NUMPIXELS; i++) {

    // pixels.Color nimmt RGB-Werte, von  0,0,0 bis 255,255,255
    if (f == 0) {
      r = 0; g = 0; b = 15; // Blau
    }
    pixels.setPixelColor(i, pixels.Color(r, g, b)); // Mäßig hellgrüne Farbe.
    pixels.show(); // Dadurch wird die aktualisierte Pixelfarbe an die Hardware gesendet.
    // delay(delayval); // Verzögerung für einen bestimmten Zeitraum (in Millisekunden).
    if (i==47) delay(3000); // 3 Sekunden stopp wenn Farbe voll
  }
  {
    f++;
    if (f == 1) {
      // Dunkel
      r = 0; g = 0; b = 0;
      i = 0;
    }

    if (f == 2) {
      // Rot
      r = 255; g = 0; b = 0;
      i = 0;
    }
    if (f == 3) {
      // gelb
      r = 255; g = 85; b = 0;
      i = 0;
    }
    if (f == 4) {
      // Grün
      r = 0; g = 255; b = 0;
      i = 0;
    }
    if (f == 5) {
      // Hellblau
      r = 0; g = 30; b = 15;
      i = 0;
    }
    if (f == 6) {
      // violett
      r = 15; g = 0; b = 15;
      i = 0;
    }
    if (f == 7) {
      // Orage Hell
      r = 255; g = 38; b = 0;
      i = 0;
    }
    if (f == 8) {
      // Orage Dunkel
      r = 10; g = 2; b = 0;
      i = 0;
    }
     if (f == 9) {
      // Weiß Hell
      r = 255; g = 255; b = 255;
      i = 0;
    }
    if (f == 10) {
      f = 0;
    }
  }
}
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Neopixel ansteuern

Beitrag von Admin »

Also ich muss sagen, dieses LED geblinke geht mir immer noch am A**** vorbei. Aber was mich daran interessiert, man kann eine Menge Abläufe Programmieren. Ich bekomme laufend neue Ideen dazu, die immer aufwendiger werden. Erst hatte ich einen Ring mit den 24 Neopixeln, dann einen zweiten Ring daneben, der einfach hinter dem ersten Ring hängt. Also wo alles gleich bleibt, nur die Zahl der Neopixel verdoppelt sich. Also nur ein Wert wird verändert, und schon läuft der zweite Ring mit. Es ist als total Easy. Morgen möchte ich jetzt mal eine Änderung mit etwas Aufwand machen, dass die beiden Ringe gegenläufig arbeiten, obwohl sie im selben Strang hängen, also nicht an unterschiedlichen Pins. Ist aber eigentlich auch total einfach zu machen, jedenfalls in meinem Kopf. Ob das dann auch so geht, werde ich sehen :(o):

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Neopixel ansteuern

Beitrag von Admin »

Ich habe es jetzt mal etwas ungebaut, dass ich jeden Ring unabhängig vom anderen Steuern kann. Also jeder Ring "kann" seine eigenen Farbkobinationen haben und eigene Ablaufzeiten.

Ausserdem läuft Ring 1 rechts rum (Pixel 0 bis 23), Ring zwei links rum ( Pixel 47 bis 24).

Code: Alles auswählen

/*
  NeoPixel Ring einfache Skizze (c) 2013 Shae Erisson unter der GPLv3-Lizenz veröffentlicht,
  um dem Rest der AdaFruit NeoPixel-Bibliothek zu entsprechen
*/
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
/*
   Welcher Pin des Arduino ist mit den NeoPixels verbunden?
   Bei einem Schmuckstück oder einer Gemma empfehlen wir, dies auf 1 zu ändern
*/
#define PIN            6

// Wie viele NeoPixel sind an den Arduino angeschlossen?
#define NUMPIXELS     48

/*
    Wenn wir die NeoPixel-Bibliothek einrichten, teilen wir ihr mit, wie viele Pixel und welcher Pin zum Senden
    von Signalen verwendet werden soll. Beachten Sie, dass Sie bei älteren NeoPixel-Streifen möglicherweise den
    dritten Parameter ändern müssen - siehe Standarttest. Beispiel für weitere Informationen zu möglichen Werten.
*/
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
// ----------------------- Ring 1 Deklarationen --------------------------------------------
unsigned long Sekundenablauf01 = 0;
const unsigned long Pausezeit01 = 30;
int delayval = 30; // Schleifen Wartezeit
byte i1 = 0;  // Schleifenzähler1 Start
byte f1 = 1; // FarbDurchgangs Nummer
byte r1 = 0;
byte g1 = 0;
byte b1 = 0;
// ----------------------- Ring 2 Deklarationen --------------------------------------------
unsigned long Sekundenablauf02 = 0;
const unsigned long Pausezeit02 = 30;
byte i2 = 47; // schleifenzähler2 Start
byte f2 = 1; // FarbDurchgangs Nummer
byte r2 = 0;
byte g2 = 0;
byte b2 = 0;
// =============================== Setup ====================================================================
void setup() {
  Serial.begin(9600);
  pixels.begin(); // Dadurch wird die NeoPixel-Bibliothek initialisiert.
}
// =============================== Loop =====================================================================
void loop() {
  // Kreis 1 = Pixel 0 - 23 ---------------------------------------------------------------
  if (millis() - Sekundenablauf01 >= Pausezeit01) { // 200msec abgelaufen?
    if (i1 < 24) {
      pixels.setPixelColor(i1, pixels.Color(r1, g1, b1)); // Mäßig hellgrüne Farbe.
      pixels.show(); // Dadurch wird die aktualisierte Pixelfarbe an die Hardware gesendet.
      i1++;
    }
    Sekundenablauf01 = millis();
  }
  //---------------------------------------------------------------------------------------
  // Kreis 2 = Pixel 47 - 24 --------------------------------------------------------------
  if (millis() - Sekundenablauf02 >= Pausezeit02) { // 200msec abgelaufen?
    if (i2 > 23) {
      pixels.setPixelColor(i2, pixels.Color(r2, g2, b2)); // Mäßig hellgrüne Farbe.
      pixels.show(); // Dadurch wird die aktualisierte Pixelfarbe an die Hardware gesendet.
      i2--;
    }
    Sekundenablauf02 = millis();
  }
  //---------------------------------------------------------------------------------------
  //------Farbring 1 Farbmischung----------------------------------------------------------
  if (i1 == 24) {
    f1++;
    i1 = 0;
    if (f1 == 1) {
      // Dunkel
      r1 = 0; g1 = 0; b1 = 0;
    }
    if (f1 == 2) {
      // Rot
      r1 = 255; g1 = 0; b1 = 0;
    }
    if (f1 == 3) {
      // gelb
      r1 = 255; g1 = 85; b1 = 0;
    }
    if (f1 == 4) {
      // Grün
      r1 = 0; g1 = 255; b1 = 0;
    }
    if (f1 == 5) {
      // Hellblau
      r1 = 0; g1 = 30; b1 = 5;
    }
    if (f1 == 6) {
      // violett
      r1 = 15; g1 = 0; b1 = 15;
    }
    if (f1 == 7) {
      // Orage Hell
      r1 = 255; g1 = 38; b1 = 0;
    }
    if (f1 == 8) {
      // Orage Dunkel
      r1 = 10; g1 = 2; b1 = 0;
    }
    if (f1 == 9) {
      // Grell Weiß
      r1 = 255; g1 = 255; b1 = 255;
    }
    if (f1 == 10) {
      f1 = 1;
      // Dunkel
      r1 = 0; g1 = 0; b1 = 0;
    }
  }
  //------Farbring 2 Frabmischung------------------------------------------------------
  if (i2 == 23) {
    f2++;
    i2 = 47;
    if (f2 == 1) {
      // Dunkel
      r2 = 0; g2 = 0; b2 = 0;
    }
    if (f2 == 2) {
      // Rot
      r2 = 255; g2 = 0; b2 = 0;
    }
    if (f2 == 3) {
      // gelb
      r2 = 255; g2 = 85; b2 = 0;
    }
    if (f2 == 4) {
      // Grün
      r2 = 0; g2 = 255; b2 = 0;
    }
    if (f2 == 5) {
      // Hellblau
      r2 = 0; g2 = 30; b2 = 5;
    }
    if (f2 == 6) {
      // violett
      r2 = 15; g2 = 0; b2 = 15;
    }
    if (f2 == 7) {
      // Orage Hell
      r2 = 255; g2 = 38; b2 = 0;
    }
    if (f2 == 8) {
      // Orage Dunkel
      r2 = 10; g2 = 2; b2 = 0;
    }
    if (f2 == 9) {
      // Grell Weiß
      r2 = 255; g2 = 255; b2 = 255;
    }
    if (f2 == 10) {
      f2 = 1;
      // Dunkel
      r2 = 0; g2 = 0; b2 = 0;
    }
  }
  // ----------------------------LOOP Ende ----------------------------------------------------
}
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Neopixel ansteuern

Beitrag von Admin »

Ich habe mir jetzt mal noch zwei von den 8x8 Neopixel Feldern gekauft. Also mit 64 LED´s. Da kann man besser spielen :)
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Neopixel ansteuern

Beitrag von Admin »

Die Dinger sind hier gelandet. Sind ganz interessant. Ich finde es schon gut, dass man damit 64 LED´s einzeln in Farbe und Helligkeit ansteuern kann. Das ganze an einem DatenPin vom Arduino. Mich interessiert allerdings noch, wie man die ohne LIB ansteuert. Denn die Geschwindigkeit ist zwar schon toll, aber man würde es sich bei manchen Anwendungen noch flotter wünschen.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Neopixel ansteuern

Beitrag von Admin »

Damit lasse sich eigentlich auch schöne Ampeln bauen, mit denen man für die Ampel mit Rot, Gelb, Grün, plus Fußgänger Rot, Grün, nur eine Datenleitung braucht. :) Naja, für die kleinsten Systeme sind sie nicht geeignet. Drei LED´s brauchen 2cm Länge und 5mm Breite Platz.

Franz
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Neopixel ansteuern

Beitrag von e69-fan »

Servus,

das sollte man noch erweitern :lol: :lol: :lol: :lol:

Bei meiner "alten" Firma gab es schon sowas:

https://rundum.tv/neu-ulm-setzt-auf-spr ... -langmatz/
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Neopixel ansteuern

Beitrag von Admin »

Wäre noch ein Möglichkeit ja. Mit nem MP3 Player und einen kleinen Lautsprecher an der Ampel, :(o):

Ich habe jetzt mal einen Zähler mit Anzeige der Zahlen 0-9 am LED "Display" gemacht. Also das 8x8 LED Feld als Ausgabe-Display. Ich muss jetzt mal die Array Geschichten richtig lernen, dass ich nur noch eine Ausgabe der Zahlen brauche. Das Programm hier ist noch etwas seeeehr lang, weil ich noch nicht klar komme.

Code: Alles auswählen

/*
  NeoPixel Ring einfache Skizze (c) 2013 Shae Erisson unter der GPLv3-Lizenz veröffentlicht,
  um dem Rest der AdaFruit NeoPixel-Bibliothek zu entsprechen
*/
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
/*
   Welcher Pin des Arduino ist mit den NeoPixels verbunden?
   Bei einem Schmuckstück oder einer Gemma empfehlen wir, dies auf 1 zu ändern
*/
#define PIN            6

// Wie viele NeoPixel sind an den Arduino angeschlossen?
#define NUMPIXELS     128

/*
    Wenn wir die NeoPixel-Bibliothek einrichten, teilen wir ihr mit, wie viele Pixel und welcher Pin zum Senden
    von Signalen verwendet werden soll. Beachten Sie, dass Sie bei älteren NeoPixel-Streifen möglicherweise den
    dritten Parameter ändern müssen - siehe Standarttest. Beispiel für weitere Informationen zu möglichen Werten.
*/
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
// ----------------------- Ring 1 Deklarationen --------------------------------------------
unsigned long Sekundenablauf01 = 0;
const unsigned long Pausezeit01 = 1000;
byte i1 = 0;  // Zahlen im Feld 1
byte durchgang1 = 0; // Position Leuchtpunkt im Feld 1
byte count1 = 0;
byte f1 = 1; // FarbDurchgangs Nummer
byte r1 = 5;
byte g1 = 5;
byte b1 = 5;
//----------------------- Zeichen Format -----------------------------------
int nuller[16] = {12, 12, 11, 18, 26, 29, 42, 50, 59, 60, 53, 45, 37, 34, 21};
int eins[16] = {12, 20, 28, 36, 44, 52, 60, 59, 61, 19, 26, 26, 26, 26, 26};
int zwei[16] = {18, 11, 12, 21, 29, 36, 43, 50, 58, 59, 60, 61, 61, 61, 61};
int drei[16] = {18, 11, 12, 21, 29, 36, 35, 45, 53, 60, 59, 50, 59, 59, 59};
int vier[16] = {10, 18, 26, 34, 35, 36, 37, 28, 44, 52, 52, 52, 52, 52, 52};
int fuenf[16] = {13, 12, 11, 10, 18, 26, 28, 27, 28, 37, 45, 53, 60, 59, 50};
int sechs[16] = {12, 12, 11, 18, 26, 34, 42, 50, 59, 60, 53, 45, 36, 35, 21};
int sieben[16] = {10, 11, 12, 13, 21, 29, 36, 43, 50, 58, 58, 58, 58, 58, 58};
int acht[16] = {12, 12, 11, 18, 26, 29, 42, 50, 59, 60, 53, 45, 36, 35, 21};
int neun[16] = {11, 12, 18, 21, 29, 26, 36, 35, 37, 45, 52, 59, 59, 59, 59};
int loeschen[33] = {2, 3, 4, 5, 10, 11, 12, 13, 18, 19, 20, 21, 26, 27, 28, 29, 34, 35, 36, 37, 42, 43, 44, 45, 50, 51, 52, 53, 58, 59, 60, 61};
//----------------------- Zeichenfolge -------------------------------------
int ablauf[19] = {1, 10, 2, 10, 3, 10, 4, 10, 5, 10, 6, 10, 7, 10, 8, 10, 9, 10};
// =============================== Setup ====================================================================
void setup() {
  Serial.begin(9600);
  pixels.begin(); // Dadurch wird die NeoPixel-Bibliothek initialisiert.
}
// =============================== Loop =====================================================================
void loop() {
  if (millis() - Sekundenablauf01 >= Pausezeit01) { // 30msec abgelaufen?
    //-------------------------------------------Display löschen---------
    if (i1 < 11) {
      if (i1 == 10) {
        i1 = 0;
      }
    }
    for (count1 = 0; count1 < 32; count1++) {
      pixels.setPixelColor((loeschen[count1]), pixels.Color(0, 0, 0));
      pixels.show();
    }
    //--------------------------------------------Die null ausgeben--------------------------------
    if (i1 == 0) {
      for (count1 = 0; count1 < 15; count1++) {
        pixels.setPixelColor((nuller[count1]), pixels.Color(r1, g1, b1));
        pixels.show();
      }
    }
    //--------------------------------------------Die eins ausgeben--------------------------------
    if (i1 == 1) {
      for (count1 = 0; count1 < 15; count1++) {
        pixels.setPixelColor((eins[count1]), pixels.Color(r1, g1, b1));
        pixels.show();
      }
    }
    //--------------------------------------------Die zwei ausgeben--------------------------------
    if (i1 == 2) {
      for (count1 = 0; count1 < 15; count1++) {
        pixels.setPixelColor((zwei[count1]), pixels.Color(r1, g1, b1));
        pixels.show();
      }
    }
    //--------------------------------------------Die drei ausgeben--------------------------------
    if (i1 == 3) {
      for (count1 = 0; count1 < 15; count1++) {
        pixels.setPixelColor((drei[count1]), pixels.Color(r1, g1, b1));
        pixels.show();
      }
    }
    //--------------------------------------------Die vier ausgeben--------------------------------
    if (i1 == 4) {
      for (count1 = 0; count1 < 15; count1++) {
        pixels.setPixelColor((vier[count1]), pixels.Color(r1, g1, b1));
        pixels.show();
      }
    }
    //--------------------------------------------Die fünf ausgeben--------------------------------
    if (i1 == 5) {
      for (count1 = 0 ; count1 < 15; count1++) {
        pixels.setPixelColor((fuenf[count1]), pixels.Color(r1, g1, b1));
        pixels.show();
      }
    }
    //--------------------------------------------Die sechs ausgeben-------------------------------
    if (i1 == 6) {
      for (count1 = 0; count1 < 15; count1++) {
        pixels.setPixelColor((sechs[count1]), pixels.Color(r1, g1, b1));
        pixels.show();
      }
    }
    //--------------------------------------------Die sieben ausgeben------------------------------
    if (i1 == 7) {
      for (count1 = 0; count1 < 15; count1++) {
        pixels.setPixelColor((sieben[count1]), pixels.Color(r1, g1, b1));
        pixels.show();
      }
    }
    //--------------------------------------------Die acht ausgeben--------------------------------
    if (i1 == 8) {
      for (count1 = 0; count1 < 15; count1++) {
        pixels.setPixelColor((acht[count1]), pixels.Color(r1, g1, b1));
        pixels.show();
      }
    }
    //--------------------------------------------Die neuen ausgeben-------------------------------
    if (i1 == 9) {
      for (count1 = 0; count1 < 15; count1++) {
        pixels.setPixelColor((neun[count1]), pixels.Color(r1, g1, b1));
        pixels.show();
      }
    }
    //--------------------------------------------Die Ausgabe löschen------------------------------
    if (i1 == 10) {
      for (count1 = 0; count1 < 32; count1++) {
        pixels.setPixelColor((loeschen[count1]), pixels.Color(0, 0, 0));
        pixels.show();
      }
    }
    i1++;
    Sekundenablauf01 = millis();
  }
  // ----------------------------LOOP Ende ----------------------------------------------------
}
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Neopixel ansteuern

Beitrag von e69-fan »

Servus,
Ich muss jetzt mal die Array Geschichten richtig lernen, dass ich nur noch eine Ausgabe der Zahlen brauche. Das Programm hier ist noch etwas seeeehr lang, weil ich noch nicht klar komme.

ich habe mal was ins Forum reingestellt.

viewtopic.php?p=574#p574

Vielleich hilft das weiter.
Grüße aus der Heimat der E69
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste