Go Down

Topic: Nur ein NeoPixel leuchtet von kompletten Stripe (Read 193 times) previous topic - next topic

TomTower

Hallo,

mein Vorhaben ist folgendes:
Ich möchte ein NeoPixel mittels Taster ansteuern. Dabei leuchtet das NeoPixel für eine Sekunde. Anschließend, nach 2 Sekunden, sollen vier NeoPixel (Stripe) eingeschaltet werden und auf unbestimmte Zeit leuchten. Mein Problem ist, dass nur das erste NeoPixel aufleuchtet. Habe den Stripe mittels des "Strandtest" getestet und alles funktioniert. Kann meinen Fehler leider nicht finden.

Viele Grüße und vielen Dank schon einmal im Vorraus!

Code: [Select]
#include <Adafruit_NeoPixel.h>
#define PIN_1               3
#define PIN_3               5


#define NUMPIXEL         1
#define NUMPIXELS        5

const int schalter_1 = 7;
int push_1;
float zeitstempel_1 = 0;
Adafruit_NeoPixel pixel_1 = Adafruit_NeoPixel(NUMPIXEL, PIN_1, NEO_GRB + NEO_KHZ800);

const byte PIN_LED_1 =    6;
unsigned long aktMillis, altMillis;
unsigned int zeit = 2000;
bool zustand = false;
bool aenderung;

Adafruit_NeoPixel pixels_1 = Adafruit_NeoPixel(NUMPIXELS, PIN_LED_1, NEO_GRB + NEO_KHZ800);

void setup() {

  Serial.begin(9600);
  pixel_1.begin();
  pinMode(schalter_1, INPUT_PULLUP);

  pixels_1.begin();


}

void loop() {

  {
    push_1 = digitalRead(schalter_1);
    Serial.println(push_1);

    if (push_1 == 1)
    {
      pixel_1.setPixelColor(0, pixel_1.Color(0, 255, 0)); //dann soll die LED leuchten
      pixel_1.show();
      zeitstempel_1 = millis();
    }
    else if (millis() - zeitstempel_1 > 900) {

      pixel_1.setPixelColor(0, pixel_1.Color(0, 0, 0));
      pixel_1.show();
    }
 
 
 aktMillis = millis();
  if (digitalRead(schalter_1) == LOW) {
    if ((aktMillis - altMillis >= zeit) && aenderung) {
      aenderung = false;
      zustand = !zustand;
      pixels_1.setPixelColor(0, pixels_1.Color(0, 255, 0));
      pixels_1.show();

     
     
    }
  } else {
    aenderung = true;
    altMillis = aktMillis;
  }

}

 
   
}



agmue

Code: [Select]
Adafruit_NeoPixel pixel_1 = Adafruit_NeoPixel(NUMPIXEL, PIN_1, NEO_GRB + NEO_KHZ800);
...
Adafruit_NeoPixel pixels_1 = Adafruit_NeoPixel(NUMPIXELS, PIN_LED_1, NEO_GRB + NEO_KHZ800);

Für einen Streifen benötigst Du das nur einmal.

TomTower

Quote
Code: [Select]
Adafruit_NeoPixel pixel_1 = Adafruit_NeoPixel(NUMPIXEL, PIN_1, NEO_GRB + NEO_KHZ800);
...
Adafruit_NeoPixel pixels_1 = Adafruit_NeoPixel(NUMPIXELS, PIN_LED_1, NEO_GRB + NEO_KHZ800);

Für einen Streifen benötigst Du das nur einmal.
Ich hatte mich dahingehend nicht verständlich genug ausgedrückt, das erste NeoPixel welches eine Sekunde leuchtet, ist unabhängig vom Streifen.




postmaster-ino

#3
Sep 16, 2018, 05:59 pm Last Edit: Sep 16, 2018, 06:01 pm by postmaster-ino
Hi

Wenn Du nur einen Pixel setzt, leuchtet auch nur ein Pixel.
Code: [Select]
pixels_1.setPixelColor(0, pixels_1.Color(0, 255, 0));
Gewöhne Dir an, sprechende Namen zu benutzen.
Pixels_1 ... Pixel_1 ... jupp, Da macht das Lesen gleich viel mehr Spaß.

Auch hast Du in loop() eine Klammer-Ebene zu viel drin - ob Die auch schaden kann, ist mir aber nicht bekannt.

MfG

*Edit*
Laut Definition ist der eine 'Streifen', bestehend aus einem Pixel, an Pin 3, der Andere, mit 4 Pixeln, an Pin 6 (oder umgekehrt).
Unschön auf jeden Fall, aber ggf. so benötigt.

*Edit 2*
Ob der Pixel 'am Streifen' ist, oder einen halben Meter daneben, ist dem Pixel egal - auch, wenn Er elektrisch in einer Reihe zum Streifen hängt.
So wirst Du den doppelten Speicherplatz benötigen, da Du eine Extra-Wurst für den Einzel-Pixel braten möchtest.

TomTower

#4
Sep 16, 2018, 06:18 pm Last Edit: Sep 16, 2018, 06:20 pm by TomTower
Erst einmal vielen Dank für die schnellen Antworten.

Quote
Wenn Du nur einen Pixel setzt, leuchtet auch nur ein Pixel.
Ich dachte, die Anzahl der Pixel definiere ich hier:

Code: [Select]
#define NUMPIXELS        5


Code: [Select]
Auch hast Du in loop() eine Klammer-Ebene zu viel drin - ob Die auch schaden kann, ist mir aber nicht bekannt.

Habe ich nun "behoben".

postmaster-ino

Hi

Du definiesrt die Anzahl der vorhandenen Pixel, Du musst Denen aber schon einzeln eine Farbe zuweisen.
Wenn Du 'Immer Alle gleich' haben willst, geht Das natürlich auch mit NeoPixel, RGB-LED (mit 4 Beinchen) sind dafür aber billiger.
Wenn Du also allen Pixeln eines Stripes die gleiche Farbe zuweisen möchtest, musst Du Das auch explizit machen.

DEFINE sind 'unschön' - benutze statt Dessen
const byte NUMPIXELS=5;   //definiert 'NUMPIXELS' als Byte (0...255), Platzverbrauch 1 Byte, und weist Ihm den Wert 5 zu
Da hat der Komiper die Chance, den Typ mit zu überprüfen.
Bei Define wird nur das Vorkommen von 'NUMPIXELS' nur sturr durch '5' ersetzt, bevor Es durch den Kompiler wandert.


Bei Deiner Annahme, daß die Anzahl der Pixel auch für die Zuweisung der Farbe gedacht wäre - hier kannst Du ggf. auf einen Deiner Stripes (1 und 4 Pixel groß) verzichten und beide Pixel zusammen fassen.

MfG

agmue

Ich dachte, die Anzahl der Pixel definiere ich hier:

Code: [Select]
#define NUMPIXELS        5

Das ist die Anzahl der Pixel des Streifens.

Code: [Select]
setPixelColor(0, pixels_1.Color(0, 255, 0));
Damit setzt Du das erste Pixel auf Grün, da der erste Parameter von setPixelColor 0 ist. Eine 1 setzt den zweiten Pixel.

TomTower

ich entschuldige mich schonmal im Voraus für meine Fragen, versuche mich hier mit meinen eher dürftigen Grundkenntnissen durch zu hangeln.

Quote
Bei Deiner Annahme, daß die Anzahl der Pixel auch für die Zuweisung der Farbe gedacht wäre - hier kannst Du ggf. auf einen Deiner Stripes (1 und 4 Pixel groß) verzichten und beide Pixel zusammen fassen.
So richtig schlüssig ist mir das noch nicht da ich doch die beiden Streifen auf zwei Pins verteilen muss da ich doch zwei Streifen habe.

Quote
Code: [Select]
setPixelColor(0, pixels_1.Color(0, 255, 0));

Damit setzt Du das erste Pixel auf Grün, da der erste Parameter von setPixelColor 0 ist. Eine 1 setzt den zweiten Pixel.
Genau das ist zur Zeit mein Problem, selbst wenn ich es auf 1 setze, leuchtet das erste Pixel dann statt in Grün, in Weiss.

agmue

#8
Sep 16, 2018, 07:58 pm Last Edit: Sep 16, 2018, 07:58 pm by agmue
... Platzverbrauch 1 Byte ...
Nö, das optimiert der Kompiler.

... in Weiss.
Das kann ich mir nicht vorstellen, das wäre Color(255, 255, 255).

Go Up