NeoPixel einzelne Farben Dimmen

Hallo Leute,

hab einen Fertigen Sketch, wo ich mit 3 Tastern den Neopixelring ein-aus und hoch-runter dimmen kann.

#include <Adafruit_NeoPixel.h>
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#define PIXEL_PIN    6    // Digital I6 pin connected to the NeoPixels.
#define PIXELCOUNT   24    // Number of leds in the ring
//Adafruit_NeoPixel strip(PIXELCOUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
//Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXELCOUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip(PIXELCOUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

const byte BUTTON_PIN_OnOff = 2;
const byte BUTTON_PIN_HELLER = 3;
const byte BUTTON_PIN_DUNKLER = 4;
const byte BUTTON_PIN_COLOR = 5;

const int startHelligkeit = 10;
const int maxHelligkeit = 200;
const int aus = 0;
unsigned long debounceDelay = 50;
int Helligkeit = 10;
int Helligkeitschritte = 10;


void setup() {
  Serial.begin (115200);
  Serial.println (F ("Start"));
  pinMode(BUTTON_PIN_OnOff, INPUT_PULLUP);
  pinMode(BUTTON_PIN_HELLER, INPUT_PULLUP);
  pinMode(BUTTON_PIN_DUNKLER, INPUT_PULLUP);
  pinMode(BUTTON_PIN_COLOR, INPUT_PULLUP);
  strip.begin();
  strip.show();
  Ausgabe (aus);
}



void Ausgabe ( const int staerke) // (const int staerke)
{
  Serial.println (F ("Übergebener Wert an PWM: "));
  Serial.println (staerke);
  for (int i = 0; i < strip.numPixels(); i++) { // For each pixel in strip...
    strip.setBrightness( staerke);
    strip.setPixelColor(i, 255, 255, 255);     //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
    delay(20);                           //  Pause for a moment
  }
}



void einaus()
{
  static unsigned long lastmillis = millis();
  static bool laststate;
  if (millis() - lastmillis > debounceDelay)
  {
    if (!digitalRead (BUTTON_PIN_OnOff))
    {
      Serial.println (F ("Taste BUTTON_PIN_OnOff gedrückt!"));
      lastmillis = millis();
      if (Helligkeit != aus)
      {
        Ausgabe (aus);
        Helligkeit = aus;
      }
      else
      {
        Ausgabe (startHelligkeit);
        Helligkeit = startHelligkeit;
      }
    }
  }
}

void heller()
{
  static unsigned long lastmillis = millis();

  if (millis() - lastmillis > debounceDelay * 1)
  {
    if (!digitalRead (BUTTON_PIN_HELLER))
    {
      Serial.println (F ("Taste BUTTON_PIN_HELLER gedrückt!"));

      if (Helligkeit >= startHelligkeit && Helligkeit < maxHelligkeit)
      {
        Helligkeit = Helligkeit + Helligkeitschritte;
        Ausgabe (Helligkeit);
        lastmillis = millis();
      }
    }
  }
}

void dunkler()
{
  static unsigned long lastmillis = millis();

  if (millis() - lastmillis > debounceDelay * 1)
  {
    if (!digitalRead (BUTTON_PIN_DUNKLER))
    {
      Serial.println (F ("Taste BUTTON_PIN_DUNKLER gedrückt!"));

      if (Helligkeit > startHelligkeit)
      {
        Helligkeit = Helligkeit - Helligkeitschritte;
        Ausgabe (Helligkeit);
        lastmillis = millis();
      }
    }
  }
}


void loop()
{
  einaus();
  heller();
  dunkler();
  delay(20);
}

aber wie würde es funktionieren, das ich z.b. 5 verschiedene Farben durchschalten kann, und diese dan auch dimmen kann?
ColorChange würde über Taster4 laufen!
hab bereits einen Buttonsycle sketch mit eingebunden, die farbe hat sich geändert, aber wen ich dimmen wollte, ist es wieder "weiß" geworden

Danke schon mal für Gedankenanstöße

seehafen89:
Danke schon mal für Gedankenanstöße

Der Sketch stammt nie und nimmer von Dir.

Benutze eine oder zwei Tasten zum Durchschalten der Farben, zwei weitere zum Dimmen und Ein-/Ausschalten. Da Du den Sketch wohl per copy+paste „programmiert“ hast, hast Du wohl eher wenig bis gar keine Ahnung vom Programmieren. Genau das solltest Du lernen, dann weißt Du auch, wie Du das Problem lösen kannst.

Gruß

Gregor

Hallo,

du könntest mi dem neuen Taster eine Zähler aufbauen der von 0 bis 5 zählt. Wenn er dann bei 5 ankmmt wird er sofort wieder auf 0 gesetzt. Damit geht er letzlich nur von 0-4.

Noch besser setzt Du enum ein dann kannst Du aus 1,2,3,4 auch rot,gelb,gruen,blau machen.

Mittels if.. else oder besser switch case änderst Du die Farbe mit strip.setPixelColor(i, 255, 255, 255). Dazu über RGB Farbwerte schlau machen.

Heinz

Mit switch case hab ich es bereits probiert wie beschrieben. Beim dimmen wird immer wieder auf weiß umgeschaltet.

Der sketch handelt teils von mir. Die Grundstruktur handelt von jemand anderen. Also, led ein/aus, und die dimmfunktion.

Hallo,

na ja , in der Funktion Ausgabe ist nochmal ein strip.setPixelColor(i, 255, 255, 255) drin das überschreibt die Farbe wieder.

Heinz

Hab auch schon probiert dort „color“ oder colorWipe einzufügen statt den 255,255,255, ohne erfolg

    strip.setBrightness( staerke);
    strip.setPixelColor(i, 255, 255, 255);     //  Set pixel's color (in RAM)

Da sehe ich gleich 2 Probleme.

  1. strip.setBrightness ist dafür gedacht 1 mal im Setup aufgerufen zu werden
  2. strip.setPixelColor(i, 255, 255, 255); setzt Deine Farbe auf weiß

Jede der Zahlen in setPixelColor steht für eine Farbe. Oben hast Du "NEO_GRB" angegeben.
Also steht die 1. Zahl für Grün, die 2. für Rot und die 3. für Blau.
strip.setPixelColor(i, 255, 255, 255); ist also weiß
strip.setPixelColor(i, 255, 0, 0); wäre schön helles grün
strip.setPixelColor(i, 100, 0, 0); nicht mehr so helles grün

Ist der Groschen jetzt gefallen was da bei der Helligkeitsregelung stehen muss?
Wenn man die Doku liest und die Beispiele anschaut sollte es aber auch klar werden.
Wie z.B. Arduino Library Use | Adafruit NeoPixel Überguide | Adafruit Learning System

Gruß, Jürgen

Ja das war mir klar, das diese funktion

strip.setPixelColor(i, 255, 255, 255); ist also weiß
strip.setPixelColor(i, 255, 0, 0); wäre schön helles grün
strip.setPixelColor(i, 100, 0, 0); nicht mehr so helles grün

das bewirken.

Aber es ist ja gewollt, das diese werte gedimmt werden.
Hab von einen sketch das example hergenommen wo man mitn taster nach und nach die „case‘s“ durchschalten kann. Aber da bin ich auch nicht weitergekommen.

Hallo,

ich kenne die lib nicht, versuch doch mal einfach in der Ausgabe die Zeile weg zu lassen. Das mit dem zähler if.. else hast Du schon drin. Dann zeig das mal

Heinz

seehafen89:
aber wie würde es funktionieren, das ich z.b. 5 verschiedene Farben durchschalten kann, und diese dan auch dimmen kann?
ColorChange würde über Taster4 laufen!
hab bereits einen Buttonsycle sketch mit eingebunden, die farbe hat sich geändert, aber wen ich dimmen wollte, ist es wieder "weiß" geworden

Hast Du den Sketch noch?
Du musst Dir in Variablen merken welche Werte die einzelnen Farben haben.
Ich würde mir bei rot die Zahlen 0, 255 und 0 merken. Für das Dimmen dann z.B. die Werte maximal und minimal auf 100 und 0 begrenzen. Bei der Ausgabe dann die 0 die 255 und die 0 dementsprechend verrechnen und auf die LEDs ausgeben.
Der Wert für die rote LED wäre dann z.B. bei dimmen auf 50%: 255 / 100 * 50
Das gleiche bei grün und blau auch machen. Dann würde bei setPixelColor 0, 128, 0 gesendet.

Edit:

Rentner:
ich kenne die lib nicht, versuch doch mal einfach in der Ausgabe die Zeile weg zu lassen. Das mit dem zähler if.. else hast Du schon drin. Dann zeig das mal

Stimmt, versuchen kannst Du es. Da hat Heinz recht. setPixelColor weglassen und nur mit setBrightness versuchen die Helligkeit zu setzen. Kann sein es geht, kann aber auch sein das das gleich oder später Fehler verursacht. Die Entwickler von Adafruit schreiben ja auch dass es dafür nicht gedacht ist.

Gruß, Jürgen

#include <Adafruit_NeoPixel.h>

#define BUTTON_PIN   2    // Digital IO pin connected to the button.  This will be
                          // driven with a pull-up resistor so the switch should
                          // pull the pin to ground momentarily.  On a high -> low
                          // transition the button press logic will execute.

#define PIXEL_PIN    9   // Digital IO pin connected to the NeoPixels.

#define PIXEL_COUNT 12   // number of neopixel (change this accordingly)

// Parameter 1 = number of pixels in strip,  neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream
//   NEO_GRB     Pixels are wired for GRB bitstream, correct for neopixel stick
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

bool oldState = HIGH;
int showType = 0;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

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

  // Check if state changed from high to low (button press).
  if (newState == LOW && oldState == HIGH) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 9)
        showType=0;
      startShow(showType);
    }
  }

  // Set the last button state to the old state.
  oldState = newState;
}

void startShow(int i) {
  switch(i){
    case 0: colorWipe(strip.Color(0, 0, 0), 50);    // Black/off
            break;
    case 1: colorWipe(strip.Color(255, 0, 0), 50);  // Red
            break;
    case 2: colorWipe(strip.Color(0, 255, 0), 50);  // Green
            break;
    case 3: colorWipe(strip.Color(0, 0, 255), 50);  // Blue
            break;
    
  }
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

hab da eine teil vom Sketch noch gefunden denn ich eingefügt hatte. es hat aber nur zum teil funktioniert. also Farben wechseln funtkioniert! aber wie bekomm ich diese geänderte farbe in den "void Ausgabe" Teil das ich diese auch dimmen kann? Grund: alle tasteränderungen laufen in den "void Ausgabe" zusammen und geben dann dort die Helligkeit aus!

Hallo,

und warum hast Du die function´s für heller, dunkler und anzeige jetzt nicht mehr drin ? . Der letze gezeigte Sketch hat doch mit dem ersten fast nichts mehr gemeinsam.

ich vermute mal es scheitert daran das du die beiden Sketche nicht zusammen bringen kannst. Wie man sowas mit copy&past hin bekommen kann wurde hier auch schon mehrfach beschrieben. Besser ist es allerdings beide Sketche zu verstehen und dann was gemeinsames draus machen.

Heinz

und warum hast Du die function´s für heller, dunkler und anzeige jetzt nicht mehr drin ? . Der letze gezeigte Sketch hat doch mit dem ersten fast nichts mehr gemeinsam.

eher schwierig wen ich in der arbeit bin, das ich programmieren könnte.

ich vermute mal es scheitert daran das du die beiden Sketche nicht zusammen bringen kannst

du vermutest? hab bereits geschrieben das ich diese zusammengebracht hatte, jedoch wurde beim dimmen immer wieder auf "weiß" umgeschaltet!

Besser ist es allerdings beide Sketche zu verstehen und dann was gemeinsames draus machen.

und wie hast du angefangen?? ich traue mich fast wetten, auch mit copy&paste!!

du vermutest? hab bereits geschrieben das ich diese zusammengebracht hatte, jedoch wurde beim dimmen immer wieder auf "weiß" umgeschaltet!

Hallo,
sorry ich wollte nicht motzig wirken,aber warum das immer wieder auf weis schaltete hatte ich Dir geschrieben. Warum Du dann mit einem ganz anderen Sketch um die Ecke kommst weiß ich nicht.

Heinz

Was meinst du damit, das i mit einen anderen Sketch un die Ecke komm?

Wie oft soll ich es dir noch schreiben?

Ich habe den zweiten Sketch in der arbeit gesucht und hier eingefügt , weil ich diesen teil verwenden würde! Weil in diesen sketch könnte ich farben vordefinieren und dan mitn Taster4 durchschalten!

Und es tut mir wirklich leid, das ich keine Möglichkeit habe in der arbeit mittn in der nacht fertig zu stellen!

Hallo,

Ich habe den zweiten Sketch in der arbeit gesucht und hier eingefügt , weil ich diesen teil verwenden würde! Weil in diesen sketch könnte ich farben vordefinieren und dan mitn Taster4 durchschalten!

ja dann mach das doch , ich halte Dich doch nicht davon ab. Das ist Doch genau das was ich Dir schon ganz am Anfang vorgeschlagen habe . Zählen und mit if else auswerten. Du muss Du jetzt doch nur sinvoll zusammen kopieren.

Also ich bin jetzt raus

Heinz

hallo,

so schaut der momentane Sketch aus, ich komm einfach nicht weiter,...

vielleicht kann mir doch jemand weiterhelfen?

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define PIXEL_PIN    6    // Digital I6 pin connected to the NeoPixels.
#define PIXELCOUNT   24    // Number of leds in the ring
//Adafruit_NeoPixel strip(PIXELCOUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
//Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXELCOUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXELCOUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

const byte BUTTON_PIN_OnOff = 2;
const byte BUTTON_PIN_HELLER = 3;
const byte BUTTON_PIN_DUNKLER = 4;
const byte BUTTON_PIN_COLOR = 5;

bool oldState = HIGH;
int showType = 0;

const int startHelligkeit = 5;
const int maxHelligkeit = 255;
const int aus = 0;
unsigned long debounceDelay = 50;
int Helligkeit = 0;
int Helligkeitschritte = 2;


void setup() {
  Serial.begin (115200);
  Serial.println (F ("Start"));
  pinMode(BUTTON_PIN_OnOff, INPUT_PULLUP);
  pinMode(BUTTON_PIN_HELLER, INPUT_PULLUP);
  pinMode(BUTTON_PIN_DUNKLER, INPUT_PULLUP);
  pinMode(BUTTON_PIN_COLOR, INPUT_PULLUP);
  strip.begin();
  strip.show();
  Ausgabe (aus);
}



void Ausgabe ( const int staerke) // (const int staerke)
{
  Serial.println (F ("Übergebener Wert an PWM: "));
  Serial.println (staerke);
//  for (int i = 0; i < strip.numPixels(); i++)  // For each pixel in strip...
  strip.setBrightness( staerke);
  strip.show();
  delay(0);
}

void colorChange() {

  bool newState = digitalRead(BUTTON_PIN_COLOR);

  // Check if state changed from high to low (button press).
  if (newState == LOW && oldState == HIGH) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN_COLOR);
    if (newState == LOW) {
      showType++;
      if (showType > 3)
        showType = 0;
      startShow(showType);
    }
  }

  // Set the last button state to the old state.
  oldState = newState;
}

void startShow(int i) {
  switch (i) {
    case 0: colorWipe(strip.Color(255, 255, 255), 50);    // Black/off
      break;
    case 1: colorWipe(strip.Color(255, 0, 0), 50);  // Red
      break;
    case 2: colorWipe(strip.Color(0, 255, 0), 50);  // Green
      break;
    case 3: colorWipe(strip.Color(0, 0, 255), 50);  // Blue
      break;

  }
}

// Fill the dots one after the other with a color

void colorWipe (uint32_t c, const int staerke) {                // (uint32_t c, uint8_t wait)
  for (uint16_t i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(20);
  }
}

void einaus()
{
  static unsigned long lastmillis = millis();
  static bool laststate;
  if (millis() - lastmillis > debounceDelay)
  {
    if (!digitalRead (BUTTON_PIN_OnOff))
    {
      Serial.println (F ("Taste BUTTON_PIN_OnOff gedrückt!"));
      lastmillis = millis();
      if (Helligkeit != aus)
      {
        Ausgabe (aus);
        Helligkeit = aus;
      }
      else
      {
        Ausgabe (startHelligkeit);
        Helligkeit = startHelligkeit;
      }
    }
  }
}

void heller()
{
  static unsigned long lastmillis = millis();

  if (millis() - lastmillis > debounceDelay * 1)
  {
    if (!digitalRead (BUTTON_PIN_HELLER))
    {
      Serial.println (F ("Taste BUTTON_PIN_HELLER gedrückt!"));

      if (Helligkeit >= startHelligkeit && Helligkeit < maxHelligkeit)
      {
        Helligkeit = Helligkeit + Helligkeitschritte;
        Ausgabe (Helligkeit);
        lastmillis = millis();
      }
    }
  }
}

void dunkler()
{
  static unsigned long lastmillis = millis();

  if (millis() - lastmillis > debounceDelay * 1)
  {
    if (!digitalRead (BUTTON_PIN_DUNKLER))
    {
      Serial.println (F ("Taste BUTTON_PIN_DUNKLER gedrückt!"));

      if (Helligkeit > startHelligkeit)
      {
        Helligkeit = Helligkeit - Helligkeitschritte;
        Ausgabe (Helligkeit);
        lastmillis = millis();
      }
    }
  }
}


void loop()
{
  einaus();
  heller();
  dunkler();
  colorChange();
}

Wenn Du uns dazu noch sagst, was geht, was nicht geht und wie Du dieses gern hättest, wäre es einfacher.

Gruß Tommy

Wenn Du uns dazu noch sagst, was geht, was nicht geht und wie Du dieses gern hättest, wäre es einfacher.

Gruß Tommy

also im Prinzip solls so ablaufen,
Taster1 - "ein" auf "starthelligkeit=5" (EGAL welche Farbe in "CASE" ausgewählt ist) oder "aus "auf Helligkeit = 0"
Taster2 - "Hochdimmen bis 255" , aber nur wenn "starthelligkeit" darüber liegt.
Taster3 - "Runterdimmen bis 5", aber nicht komplett aus.
Taster4 - "Vordefinierte" Farben Durchschalten

Es funktioniert nicht:
Taster 1 drücken--> LED´s werden nach einander eingeschalten auf die letzte ausgewählte Farbe.

Es funktioniert über Umwege:
Taster 1 drücken--> Taster 4 drücken --> farben werden angezeigt.

Es funktioniert:
Wenn Farben dargestellt sind, Farben durchschalten und hoch/runterdimmen.

Je knapper Deine Infos, desto schlechter die Möglichkeiten, Dir zu helfen.

Gruß Tommy