GELÖST: Wordclock mit WS2812B LEDs: Farbwechsel per Button

Moin,

ich habe eine funktionierende Wordclock (auch Dank der Hilfe dieses Forums) und hatte mir nun gedacht es wäre schön, wenn ich die Farbe per Button verstellen könnte.
Das gestaltet sich nicht so einfach, weswegen ich hier um Rat fragen möchte…

Ich habe ein Testsketch (button_test) der auch einwandfrei so funktioniert wie erwartet.

  • digitaler Pin 7
  • 10k Widerstand zwischen Pin 7 und GND

Der sketch hängt unten drin, aber hier zum schneller scrollen:

#include <Adafruit_NeoPixel.h>

    int buttonPin = 7;    // momentary push button on pin 0
    int oldButtonVal = 0;
   
    #define PIN 3    // Parameter 1 = number of pixels in strip
                          // Parameter 2 = pin number (most are valid)
                          // Parameter 3 = pixel type flags, add together as needed:
                          // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
                          // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
                          // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
                          // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(2, PIN, NEO_GRB + NEO_KHZ800);
   
    int nPatterns = 8;
    int lightPattern = 2;

// the setup routine runs once when you press reset:
    void setup() {
        Serial.begin(19200);
    strip.begin();
    strip.show();                // initialize all pixels to 'off'   
// initialize the BUTTON pin as an input
    pinMode(buttonPin, INPUT);
    digitalWrite(buttonPin, HIGH);  // button pin is HIGH, so it drops to 0 if pressed
}


// Pattern 1 - White light, all LEDs in the strip are white
    void pattern1() {
        strip.setPixelColor(0, strip.Color(255, 255, 255)); // White
       // strip.setPixelColor(0, strip.Color(255, 255, 255)); 
    strip.show();
    }
   
// Pattern 2 - Red light, all LEDs in the strip are red
    void pattern2() {
        strip.setPixelColor(0, strip.Color(255, 0, 0)); // Red
        strip.setPixelColor(1, strip.Color(255, 0, 0));
        strip.setPixelColor(2, strip.Color(255, 0, 0));
        strip.setPixelColor(3, strip.Color(255, 0, 0));
        strip.setPixelColor(4, strip.Color(255, 0, 0));
    strip.show();
    }
   
// Pattern 3 - Orange light, all LEDs in the strip are orange
    void pattern3() {
        strip.setPixelColor(0, strip.Color(255, 128, 0)); // Orange
        strip.setPixelColor(1, strip.Color(255, 128, 0));
        strip.setPixelColor(2, strip.Color(255, 128, 0));
        strip.setPixelColor(3, strip.Color(255, 128, 0));
        strip.setPixelColor(4, strip.Color(255, 128, 0));
    strip.show();
    }

// Pattern 4 - Yellow light, all LEDs in the strip are yellow
    void pattern4() {
        strip.setPixelColor(0, strip.Color(255, 255, 0)); // Yellow
        strip.setPixelColor(1, strip.Color(255, 255, 0));
        strip.setPixelColor(2, strip.Color(255, 255, 0));
        strip.setPixelColor(3, strip.Color(255, 255, 0));
        strip.setPixelColor(4, strip.Color(255, 255, 0));
    strip.show();
    }
   
// Pattern 5 - Green light, all LEDs in the strip are green
    void pattern5() {
        strip.setPixelColor(0, strip.Color(0, 255, 0)); // Green
        strip.setPixelColor(1, strip.Color(0, 255, 0));
        strip.setPixelColor(2, strip.Color(0, 255, 0));
        strip.setPixelColor(3, strip.Color(0, 255, 0));
        strip.setPixelColor(4, strip.Color(0, 255, 0));
    strip.show();
    }

// Pattern 6 - Blue light, all LEDs in the strip are blue
    void pattern6() {
        strip.setPixelColor(0, strip.Color(0, 0, 255)); // Blue
        strip.setPixelColor(1, strip.Color(0, 0, 255));
        strip.setPixelColor(2, strip.Color(0, 0, 255));
        strip.setPixelColor(3, strip.Color(0, 0, 255));
        strip.setPixelColor(4, strip.Color(0, 0, 255));
    strip.show();
    }
   
// Pattern 7 - Violet light, all LEDs in the strip are violet
    void pattern7() {
        strip.setPixelColor(0, strip.Color(127, 0, 255)); // Violet
        strip.setPixelColor(1, strip.Color(127, 0, 255));
        strip.setPixelColor(2, strip.Color(127, 0, 255));
        strip.setPixelColor(3, strip.Color(127, 0, 255));
        strip.setPixelColor(4, strip.Color(127, 0, 255));
    strip.show();
    }

// Pattern 8 - Rainbow light, all LEDs in the strip are different colors
    void pattern8() {
        strip.setPixelColor(0, strip.Color(255, 0, 255)); // Red
        strip.setPixelColor(1, strip.Color(255, 255, 0)); // Yellow
        strip.setPixelColor(2, strip.Color(0, 255, 0)); // Green
        strip.setPixelColor(3, strip.Color(0, 0, 255)); // Blue
        strip.setPixelColor(4, strip.Color(127, 0, 255)); // Violet
    strip.show();
    }


// the loop routine runs over and over again forever;
void loop() {
  // read that state of the pushbutton value;
  int buttonVal = digitalRead(buttonPin);
  if (buttonVal == LOW && oldButtonVal == HIGH) {// button has just been pressed
    lightPattern = lightPattern + 1;
  }
  if (lightPattern > nPatterns) lightPattern = 1;
  oldButtonVal = buttonVal;
 
  switch(lightPattern) {
    case 1:
      pattern1();
      break;
    case 2:
      pattern2();
      break;
    case 3:
      pattern3();
      break;
    case 4:
      pattern4();
      break;
    case 5:
      pattern5();
      break;
    case 6:
      pattern6();
      break;
    case 7:
      pattern7();
      break;
    case 8:
      pattern8();
      break;
  }
}

Weiter gehts in meinem nächsten Post…

SCHNELLEDIT:
DIE Antwort findet sich im letzten Post von mir, zusammen mit dem sketch.

button_test.ino (4.94 KB)

Du kannst einen Sketch auch auf 2 Postings sinnvoll aufteilen, damit er lesbar ist.

Gruß Tommy

Arne3a:
Wie gesagt würde ich mich über einige hilfreiche Hinweise sehr freuen!

Als Tipp am Rande:
Alleroberstes Gebot für Sketche, die ich ändern möchte, ist, dass sie ordentlich formatiert sind. Für meine eigenen Sketche gilt, dass es keine Zeile gibt, die länger als 80 Zeichen ist. Und wenn etwas geändert werden soll, das breiter als 80 Zeichen pro Zeile ist, dann wird es zuerst auf diese Zeilenlänge umformatiert. Normalerweise lese ich den Code dabei und sehe, wo was passiert und ggf. geändert werden muss.

An Deiner Stelle würde ich also zunächst dafür sorgen, dass es keine Zeilen mehr gibt, die länger als 80 Zeichen ist.

Gruß

Gregor

PS: Ja Fehlersuche und das, was Du haben möchtest, können unter manchen Bedingungen Strafarbeit sein. Viel schlimmer, als das Umformatieren eines mangelhaft formatierten Codes :slight_smile:

Hier der zweite Teil:

Diesen wollte ich nun “übertragen” auf den Sketch für die Uhr. Der Uhr sketch ist um einiges komplexer als der Test_button und deshalb ergeben sich folgende Probleme, für die ich um Hinweise dankbar bin:

Hier der Wordclock sketch (einiges irrelevante Punkte sind hier nicht drin(der komplette ist auch unten angehängt)

l
FASTLED_USING_NAMESPACE
#define DATA_PIN    3
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS    156  // Gesamtanzahl der WS2812 LEDs
CRGB leds[NUM_LEDS];

uint8_t maxBrightness     = 35;
// Wenn Fotoresistor benutzt wird, hier
//min. Helligkeit eintragen (0=Off->255=max)
uint8_t minBrightness     = 210;
// Wenn Fotoresistor benutzt wird, hier
//max. Helligkeit eintragen (0=Off->255=max)
uint8_t AmbientLightPin   = 0;
// Fotoresistor Pin
uint8_t BRIGHTNESS        = 120;
// Wenn kein Fotoresistor benutzt wird
//hier dauerhafte Helligkeit eintragen

uint8_t Stunde     = 0;
uint8_t Minute     = 15;
uint8_t WochenTag  = 0;
uint8_t Tag        = 30;
uint8_t Monat      = 10;
boolean DST        = false;

//button
int buttonPin = 7;    // momentary push button on pin 7
int oldButtonVal = 1;
int nPatterns = 2;
int lightPattern = 2; //Start with this light
//End button

//***HIER LED POSITIONEN EINTRAGEN***//
int EsIst[]     = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};


//**********************************//

int i, Ambient, LastAmbient;

void setup() {
  delay(3000); // Sicherheits Delay
  Serial.begin(19200);

  //button
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  // button pin is HIGH, so it drops to 0 if pressed
  //End button

  //LEDs werden eingefügt + Farbkorrektur 
  //und Farbtemperatur auf Wolfram (warmweiß)
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>
  (leds, NUM_LEDS).setCorrection(TypicalPixelString);
  FastLED.setTemperature( Tungsten40W );
  Serial.println("Starte Wordclock ...");

  //Versuche auf RTC zu zugreifen
  setSyncProvider(RTC.get);
  if (timeStatus() != timeSet) {
    Serial.println("Unable to sync with the RTC");
  } else if (timeStatus() != timeNeedsSync) {
    Serial.println("RTC has set the system time");
  } else {
    Serial.println("RTC has set the system time but needs Sync");
  }
}

void SwitchLED(int MyArray[], int n) {
  //Umgebungshelligkeit überprüfen (sofern gewünscht)
  if (maxBrightness != 0) {
    Ambient = analogRead(AmbientLightPin);
    //Nur bei größeren Helligkeitsänderungen
    //soll die Helligkeit der LEDs angepasst werden:
    if ((Ambient > LastAmbient * 1.10) || (Ambient < LastAmbient * 0.90)) {
      BRIGHTNESS = map(Ambient, 0, 1023, maxBrightness, minBrightness);
      LastAmbient = Ambient;
    }
  }
  //Funktion zum Anschalten der LEDs in warmweiß
  for (i = MyArray[0]; i < MyArray[0] + n; i++) {
    //leds[i] = 0xFFC58F;
    // HEX Warmweiß | Hier gewünschte LED Farbe (HEX) eintragen
    pattern1();
    FastLED.setBrightness(BRIGHTNESS);
    //leds[i] = CHSV(140, 27, BRIGHTNESS);
    // ODER hier gewünschte Farbe in HSV
    //(  CHSV(FARBE, SÄTTIGUNG, BRIGHTNESS)  )
    //leds[i].setRGB(255, 68, 221);
    // ODER hier gewünschte Farbe in RGB
    //(  .setRGB(Rot,Grün,Blau)   )
  }
}

void displaytime(void) {
  //zuerst setzten wir alle LEDs zurück
  fill_solid( leds, NUM_LEDS, CHSV(0, 0, 0));

  // Nun suchen wir die richtigen LEDs
  //und übergeben sie an die Funktion zum Anschalten
  Serial.print("Es ist ");
  SwitchLED(EsIst, (sizeof(EsIst) / 2));

  if (((Minute > 4) && (Minute < 10)) || (Minute > 54)) {
    SwitchLED(MFuenf, (sizeof(MFuenf) / 2));
    Serial.print("5 Minuten ");
  }
  if (((Minute > 9) && (Minute < 15))
      || ((Minute > 49) && (Minute < 55))) {
    SwitchLED(MZehn, (sizeof(MZehn) / 2));
    Serial.print("10 Minuten ");
  }
  if (((Minute > 14) && (Minute < 20))
      || ((Minute > 44) && (Minute < 50))) {
    SwitchLED(Viertel, (sizeof(Viertel) / 2));
    Serial.print("Viertel ");
  }
  if (((Minute > 19) && (Minute < 25))
      || ((Minute > 39) && (Minute < 45))) {
    SwitchLED(MZwanzig, (sizeof(MZwanzig) / 2));
    Serial.print("20 Minuten ");
  }
  if (((Minute > 24) && (Minute < 30))
      || ((Minute > 34) && (Minute < 40))) {
    SwitchLED(MFuenf, (sizeof(MFuenf) / 2));
    SwitchLED(Und, (sizeof(Und) / 2));
    SwitchLED(MZwanzig, (sizeof(MZwanzig) / 2));
    Serial.print("25 Minuten ");
  }
  if ((Minute > 29) && (Minute < 35)) {
    SwitchLED(Halb, (sizeof(Halb) / 2));
    Serial.print("Halb ");
  }

  ......
  }
  // Minuten Zähler
  uint8_t MinCount = Minute - (floor(Minute / 10) * 10);
  if (MinCount > 5)
    MinCount = MinCount - 5;
  switch (MinCount) {
    case 4:
      SwitchLED(VierM, (sizeof(VierM) / 2));
    case 3:
      SwitchLED(DreiM, (sizeof(DreiM) / 2));
    case 2:
      SwitchLED(ZweiM, (sizeof(ZweiM) / 2));
    case 1:
      SwitchLED(EinsM, (sizeof(EinsM) / 2));
  }
  FastLED.show();
}

void CheckDST(void) {
  //Funktion zum Überprüfen ob Sommer oder Winterzeit
  Tag = day();
  Monat = month();

  WochenTag = (weekday() - 1);
  int Hilf = Tag - WochenTag;
  if (Monat <= 2 || Monat >= 11)
    DST = false; // Winterzeit

  if (Monat >= 4 && Monat <= 9)
    DST = true;    // Sommerzeit

  if ((Monat == 3) && (Hilf >= 25))
    DST = true; // Beginn der Sommerzeit

  if ((Monat == 10) && (Hilf >= 25))
    DST = false; // Beginn der Winterzeit

  if (DST == true) {
    if (Stunde <= 11)
      Stunde = Stunde + 1;
    else if (Stunde > 12)
      Stunde = Stunde - 12 + 1;
    else if (Stunde == 12)
      Stunde = 1;
    else if (Stunde == 24)
      Stunde = 1;
    //Stunde += 1;
  }
}

// Pattern 1 - White light, all LEDs in the strip are white
void pattern1() {
  leds[i].setRGB(255, 255, 255); // White
  FastLED.show();
}

// Pattern 2 - Red light, all LEDs in the strip are white
void pattern2() {
  leds[i].setRGB(255, 0, 0); // Red
  FastLED.show();
}

void loop() {
  /* Schleifen Funktion, die die Uhrzeit ausliest
      und dann in die entsprechende Funktionen übergibt.
  */
  Minute = minute();
  int Std = hour();
  if (Std > 12)
    Stunde = Std - 12;
  else if (Std == 0)
    Stunde = 12;
  else
    Stunde = Std;

  CheckDST();
  displaytime();
  FastLED.delay(250);
  Serial.println(Stunde);
  Serial.println(Minute);

//Button
  // read that state of the pushbutton value;
  int buttonVal = digitalRead(buttonPin);
  if (buttonVal == LOW && oldButtonVal == HIGH) {
    // button has just been pressed
    lightPattern = lightPattern + 1;
  }
  if (lightPattern > nPatterns) lightPattern = 1;
  oldButtonVal = buttonVal;

  switch (lightPattern) {
    case 1:
      pattern1();
      break;
    case 2:
      pattern2();
      break;
  }
}

Folgendes kann ich mir vorstellen:

  1. Das Problem ist der Aufruf der Button Funktion im Teil “SwitchLED” (Zeile 109 im Wordclock sketch); ich kann da zwar die Funktion für eine Farbe aufrufen, es funktioniert allerdings dann nicht die Umschaltung auf die nächste Farbe…
    → Welche Änderung muss hier sein?

1a) zumindest denke ich, das die Farbe per Button hier sein müsste, damit diese Farbe dann für die Darstellung der Uhr genutzt wird.

  1. Die Farbe im Uhrsketch “flackert”, wenn ich sie in der SwitchLED Funktion direkt aufrufe (was sie im Test-button sketch nicht macht). Kann das das Zusammenspiel mit der Helligkeitseinstellung sein?

  2. Wie im Test-button sketch rufe ich in Zeile 43 die Farbfunktion auf, mit der gestartet werden soll, das funktioniert aber nicht; vermutlich interferiert auch die “SwitchLED” Funktion?

Wie gesagt würde ich mich über einige hilfreiche Hinweise sehr freuen!
Wenn eine andere Methode zur Farbumschaltung “einfacher” ist, immer her damit :slight_smile:

Danke
Arne

Wordclock_basic_button.ino (13.3 KB)

Ich habe Deinen zweiten Sketch etwas verändert, indem ein Index für eine Farbpalette mit dem Taster hochgezählt wird.

Da ich APA102 mit SPI anstelle WS2812 verwende, mußte ich ein paar Zeilen für mich anpassen.

  for (i = MyArray[0]; i < MyArray[0] + n; i++) {
    leds[i] = Rainbow[colorindex];
    //leds[i].setRGB(255, 0, 0); // Red
    // HEX Warmweiß | Hier gewünschte LED Farbe (HEX) eintragen
    //pattern1();
    FastLED.setBrightness(BRIGHTNESS);
    //leds[i] = CHSV(140, 27, BRIGHTNESS);
    // ODER hier gewünschte Farbe in HSV
    //(  CHSV(FARBE, SÄTTIGUNG, BRIGHTNESS)  )
    //leds[i].setRGB(255, 68, 221);
    // ODER hier gewünschte Farbe in RGB
    //(  .setRGB(Rot,Grün,Blau)   )
  }
  bool buttonVal = digitalRead(buttonPin);
  if (!buttonVal && oldButtonVal) {
    // button has just been pressed
    colorindex = (colorindex + 1) % 16;
    Serial.print("colorindex ");
    Serial.println(colorindex);
  }
  oldButtonVal = buttonVal;

Ich hoffe, ich konnte Dir den richtigen Anstoß geben.

Test_Forum.ino (14 KB)

Hallo agmue,

vielen Dank für deine Hinweise !

Den colorindex zählt er jetzt hoch und damit ist bewiesen, der Taster funktioniert :wink:

Der Wechsel von Farben funktioniert aber nicht, ich befürchte, da benötige ich noch einen Hinweis.
Egal, was ich in der Funktion "SwitchLED" aufrufe leds[i] = pattern1[colorindex]; , die LEDs sind immer blau ??? obwohl mir nicht bewusst ist, eine blaue Farbe aufzurufen...
Merkwürdig!

Das ist jetzt in meiner loop drin, da müsste doch der Fehler zwischen colorindex Verknüpfung und den farben Funktionen sein, oder?

void loop() {
  /* Schleifen Funktion, die die Uhrzeit ausliest
      und dann in die entsprechende Funktionen übergibt.
  */
  Minute = minute();
  int Std = hour();
  if (Std > 12)
    Stunde = Std - 12;
  else if (Std == 0)
    Stunde = 12;
  else
    Stunde = Std;

  CheckDST();
  displaytime();
  FastLED.delay(250);
  Serial.println(Stunde);
  Serial.println(Minute);



  bool buttonVal = digitalRead(buttonPin);
  if (!buttonVal && oldButtonVal) {
    // button has just been pressed
    colorindex = (colorindex + 1) % 16;
    Serial.print("colorindex ");
    Serial.println(colorindex);
  }
  oldButtonVal = buttonVal;
 
 switch (colorindex) {
  case 1:
      pattern1();
      break;
    case 2:
      Rainbow();
      break;
    case 3:
      pattern2();
      break;
  }
 }

Vielen Dank!
Arne

Arne3a:
... die LEDs sind immer blau ???

Bist Du sicher, dass die überhaupt etwas anderes als blau können?

Mein' ja nur so ...

Gruß

Gregor

Moin,

mir fehlt leider noch immer die Idee, warum keine der aufgerufenen Farben funktioniert. Es fehlt anscheinend an der Verknüfung "colorindex" zur Farbe-
Für einen Hinweis wäre ich dankbar!

Edit: Es könnte natürlich auch sein, das ich den Aufruf nicht richtig gestaltet habe...
So habe ich es jetzt :

leds[i] = pattern1[colorindex];

Ist das so richtig?

Danke und viele Grüße,
Arne

Hi

Kannst Du denn, z.B. im Setup, mit folgender Zeile (und etwas Code drum herum, klar) Deine LEDs in Rot leuchten lassen?

leds[i].setRGB(255, 0, 0); // Red

MfG

postmaster-ino:
Hi

Kannst Du denn, z.B. im Setup, mit folgender Zeile (und etwas Code drum herum, klar) Deine LEDs in Rot leuchten lassen?

leds[i].setRGB(255, 0, 0); // Red

MfG

Hallo Postmaster,

ja, wenn ich in meiner Funktion SwitchLED direkt die rote Farbe aufrufe, dann leuchten die LEDs rot.
Wenn ich allerdings wieder auf den Verknüpfung zum Button Programm gehe, dann gehts nur in blau und ohne Änderung der Farben, obwohl der Index hochzählt.

Hier mal die entsprechende Funktion:

void SwitchLED(int MyArray[], int n) {
  //Umgebungshelligkeit überprüfen (sofern gewünscht)
  if (maxBrightness != 0) {
    Ambient = analogRead(AmbientLightPin);
    //Nur bei größeren Helligkeitsänderungen
    //soll die Helligkeit der LEDs angepasst werden:
    if ((Ambient > LastAmbient * 1.10) || (Ambient < LastAmbient * 0.90)) {
      BRIGHTNESS = map(Ambient, 0, 1023, maxBrightness, minBrightness);
      LastAmbient = Ambient;
    }
  }
  //Funktion zum Anschalten der LEDs in warmweiß
  for (i = MyArray[0]; i < MyArray[0] + n; i++) {
   leds[i] = pattern1[colorindex];
    //leds[i].setRGB(255, 0, 0); // Red
    // HEX Warmweiß | Hier gewünschte LED Farbe (HEX) eintragen
    FastLED.setBrightness(BRIGHTNESS);
    //leds[i] = CHSV(140, 27, BRIGHTNESS);
    // ODER hier gewünschte Farbe in HSV
    //(  CHSV(FARBE, SÄTTIGUNG, BRIGHTNESS)  )
    //leds[i].setRGB(255, 68, 221);
    // ODER hier gewünschte Farbe in RGB
    //(  .setRGB(Rot,Grün,Blau)   )
  }
}

deshalb dachte ich, das der Aufruf leds[i] = pattern1[colorindex];evtl falsch ist, habe aber selber keine Idee…

Danke
Arne

Hi

Wie sieht denn die Funktion aus?
Wird ja wohl nicht Die im Anfangspost sein

// Pattern 1 - White light, all LEDs in the strip are white
    void pattern1() {
        strip.setPixelColor(0, strip.Color(255, 255, 255)); // White
       // strip.setPixelColor(0, strip.Color(255, 255, 255));
    strip.show();
    }

Nicht nur, daß Da weiß raus kommen müsste, auch würde diese Funktion kein übergebenes Argument annehmen.

MfG

Hallo Postmaster,

hier der “aktuelle” Teil des Sketches:

// Pattern 1 - White light, all LEDs in the strip are white
void pattern1() {
leds*.setRGB(255, 255, 255); // White*

  • FastLED.show();*
    }
    // Pattern 2 - Red light, all LEDs in the strip are white
    void pattern2() {
    _ leds*.setRGB(255, 0, 255); // Red*_
    * FastLED.show();*
    }
    void Rainbow(){
    * // FastLED’s built-in rainbow generator*
    * // random colored speckles that blink in and fade smoothly*
    * fadeToBlackBy( leds, NUM_LEDS, 10);
    int pos = random16(NUM_LEDS);
    leds[pos] += CHSV( random8(64), 200, 255);
    FastLED.show();
    _
    }_
    void loop() {
    _ / Schleifen Funktion, die die Uhrzeit ausliest_

    * und dann in die entsprechende Funktionen übergibt.*
    _ /_
    _
    Minute = minute();_
    _
    int Std = hour();_
    _
    if (Std > 12)_
    _
    Stunde = Std - 12;_
    _
    else if (Std == 0)_
    _
    Stunde = 12;_
    _
    else*_
    * Stunde = Std;*
    * CheckDST();*
    * displaytime();*
    * FastLED.delay(250);*
    * Serial.println(Stunde);*
    * Serial.println(Minute);*
    /*Button
    * // read that state of the pushbutton value;*
    * int buttonVal = digitalRead(buttonPin);*
    * if (buttonVal == LOW && oldButtonVal == HIGH) {*
    * // button has just been pressed*
    * lightPattern = lightPattern + 1;*
    * }*
    * if (lightPattern > nPatterns) lightPattern = 1;*
    * oldButtonVal = buttonVal;*
    */
    * bool buttonVal = digitalRead(buttonPin);*
    * if (!buttonVal && oldButtonVal) {*
    * // button has just been pressed*
    * colorindex = (colorindex + 1) % 16;*
    * Serial.print("colorindex ");*
    * Serial.println(colorindex);*
    * }*
    * oldButtonVal = buttonVal;*

* switch (colorindex) {*
* case 1:*
* pattern1();*
* break;*
* case 2:*
* Rainbow();*
* break;*
* case 3:*
* pattern2();*
* break;*
* }*
}
[/quote]
Danke
Arne

Hi

In meiner Adafruit_Neopixel Library gibt es die Methode setGRB(R,G,B) nicht - die Methode im Ausgangspost aber schon, also setPixelColor(n,c).
Dort wird aber nur EIN Pixel (Nummer n) eingefärbt - die Restlichen verbleiben in aktueller Farbe.

MfG

Hallo Postmaster,

da bin ich nicht sicher, was du meinst...

mit leds[i].setRGB(255, 0, 0); die ich in SwitchLED aufrufe, werden ja alle LEDs rot.

Rufe ich mit leds[i] = pattern1[colorindex]; aber jetzt pattern1 auf, wo im Prinzip das gleiche passiert mit

// Pattern 1 - White light, all LEDs in the strip are white
void pattern1() {
  leds[i].setRGB(255, 255, 255); // White
  FastLED.show();

dann kommt nicht nur nicht die "Sollfarbe", sondern nur blau...

Danke
Arne

Arne3a:
Rufe ich mit

leds[i] = pattern1[colorindex];

aber jetzt pattern1 auf,

Da ist sicherlich was falsch. pattern1 ist eine Funktion. Was soll das also mit dem Index? Außerdem gibt die Funktion nichts zurück. Daher ist die Zuweisung falsch.

Aktiviere mal die Warnungen. Das compiliert vielleicht weil der Name einer Funktion deren Adresse ist. Aber es macht sicherlich nicht was du denkst

Hallo Serenifly,

Danke für deinen Hinweis. Ich hatte mir schon gedacht, das es nicht richtig sein könnte, da aber der Fehler nach Verweis auf pattern1 verschwand, dachte ich das es etwas anderes sein könnte...

Aber da lag ich wohl falsch, weil die Warnungen etwas ausgeben:

Z:\Make\Wordclock\tests\Wordclock_basic_button\Wordclock_basic_button.ino: In function 'void SwitchLED(int*, int)':

Z:\Make\Wordclock\tests\Wordclock_basic_button\Wordclock_basic_button.ino:124:33: warning: pointer to a function used in arithmetic [-Wpointer-arith]

    leds[i] = pattern1[colorindex];

                                 ^

Z:\Make\Wordclock\tests\Wordclock_basic_button\Wordclock_basic_button.ino:124:33: warning: invalid conversion from 'void (*)()' to 'uint32_t {aka long unsigned int}' [-fpermissive]

In file included from C:\Users\Arne\Documents\Arduino\libraries\FastLED/controller.h:9:0,

                 from C:\Users\Arne\Documents\Arduino\libraries\FastLED/FastLED.h:47,

                 from Z:\Make\Wordclock\tests\Wordclock_basic_button\Wordclock_basic_button.ino:4:

C:\Users\Arne\Documents\Arduino\libraries\FastLED/pixeltypes.h:176:15: note: initializing argument 1 of 'CRGB& CRGB::operator=(uint32_t)'

  inline CRGB& operator= (const uint32_t colorcode) __attribute__((always_inline))

Leider werde ich aus dem ersten Part nicht schlau... Kannst du mir einen Hinweis geben, wie mein Problem zu lösen ist?

Danke
Arne

Z:\Make\Wordclock\tests\Wordclock_basic_button\Wordclock_basic_button.ino:124:33: warning: pointer to a function used in arithmetic [-Wpointer-arith]

    leds[i] = pattern1[colorindex];

Das ist genau was ich gesagt habe. Der Compiler denkt du willst ein Array aus Funktionszeigern ansprechen. Der Name einer Funktion ist deren Adresse! Zeiger sind Adressen. Arrays sind Zeiger auf das erste Element. Daher compiliert dass wenn du den Subskript Operator darauf anwendest. Aber eigentlich sollte das eher ein Fehler sein.

Da aber überhaupt nicht klar ist was du eigentlich machen willst, kann ich dir auch nicht sagen was du tun solltest. Außer dir mal ansehen wie man Funktionen aufruft und verwendet

: warning: invalid conversion from 'void (*)()' to 'uint32_t {aka long unsigned int}' [-fpermissive]

Das ist der gleiche Käse in der gleichen Zeile. Ein Funktionzeiger soll in einen Integer umgewandelt werden. Das geht auch wieder weil ein Zeiger eben eine Adresse ist (die Nummer der Speicherzelle in der etwas steht)

Hallo,

ich versuche mich an einer Erklärung.

Also, diese Wordclock Datei wurde von jemanden konzipiert, der leider schon einige Zeit nicht mehr antwortet und ich versuche diese nun weiter zu entwickeln und benutzbar zu halten-

Was ich möchte, ist eine Umschaltung der LED Farbe des angezeigten Textes auf Button Druck.
Die Farbe der LEDs wird in der Funktion “Switch LED” aufgerufen, und das macht es (vermutlich) auch schwierig…

void SwitchLED(int MyArray[], int n) {
  //Umgebungshelligkeit überprüfen (sofern gewünscht)
  if (maxBrightness != 0) {
    Ambient = analogRead(AmbientLightPin);
    //Nur bei größeren Helligkeitsänderungen
    //soll die Helligkeit der LEDs angepasst werden:
    if ((Ambient > LastAmbient * 1.10) || (Ambient < LastAmbient * 0.90)) {
      BRIGHTNESS = map(Ambient, 0, 1023, maxBrightness, minBrightness);
      LastAmbient = Ambient;
    }
  }
  //Funktion zum Anschalten der LEDs in warmweiß
  for (i = MyArray[0]; i < MyArray[0] + n; i++) {
   leds[i] = Functions[colorindex];
    //leds[i].setRGB(255, 0, 0); // Red
    // HEX Warmweiß | Hier gewünschte LED Farbe (HEX) eintragen
    FastLED.setBrightness(BRIGHTNESS);
    //leds[i] = CHSV(140, 27, BRIGHTNESS);
    // ODER hier gewünschte Farbe in HSV
    //(  CHSV(FARBE, SÄTTIGUNG, BRIGHTNESS)  )
    //leds[i].setRGB(255, 68, 221);
    // ODER hier gewünschte Farbe in RGB
    //(  .setRGB(Rot,Grün,Blau)   )
  }
}

Meine bisherigen Versuche in der Funktion sind gescheitert, weil ich keine Funktion aufrufen kann.

Über den colorindex versuche ich die verschiedenen Farben später “durchzuschalten”, allerdings fehlt eine Verknüpfung des Indexes (der im seriellen Monitor schön hochgezählt wird wenn der Button gedrückt wird) zur Farbe.

Meine Lop Funktion sieht bisher so aus:

void loop() {
  /* Schleifen Funktion, die die Uhrzeit ausliest
      und dann in die entsprechende Funktionen übergibt.
  */
  Minute = minute();
  int Std = hour();
  if (Std > 12)
    Stunde = Std - 12;
  else if (Std == 0)
    Stunde = 12;
  else
    Stunde = Std;

  CheckDST();
  displaytime();
  FastLED.delay(250);
  Serial.println(Stunde);
  Serial.println(Minute);

/*Button
  // read that state of the pushbutton value;
  int buttonVal = digitalRead(buttonPin);
  if (buttonVal == LOW && oldButtonVal == HIGH) {
    // button has just been pressed
    lightPattern = lightPattern + 1;
  }
  if (lightPattern > nPatterns) lightPattern = 1;
  oldButtonVal = buttonVal;
*/


  bool buttonVal = digitalRead(buttonPin);
  if (!buttonVal && oldButtonVal) {
    // button has just been pressed
    colorindex = (colorindex + 1) % 16;
    Serial.print("colorindex ");
    Serial.println(colorindex);
  }
  oldButtonVal = buttonVal;
 
  switch (colorindex) {
    case 1:
      pattern1();
      break;
    case 2:
      Rainbow();
      break;
    case 3:
      pattern2();
      break;
  }
 }

Im Versuch einen richtigen Verweis zu bekommen, kam ich auf die Idee, so etwas zu verwenden:

SimplePatternList Functions = {pattern1, Rainbow, pattern2};

um den Aufruf über Functions (in der SwitchLED zu machen, hat aber nicht funktioniert…
leds[i] = Functions[colorindex];

Ich vermute, das ich einen richtigen Verbindung zwischen colorindex und den Farbenfunktionen hinbekommen muss, aber dafür reichen meine bescheidenen Kenntnisse nicht und benötige ein paar Hinweise…

Vielen Dank (auch für alle Geduld)
Arne

Wordclock_basic_button.ino (14.1 KB)

Hallo,

das Problem ist gelöst!!
Ich hatte die Hilfe von agmue nicht richtig verstanden… :grin: :-*

Also, die Farben ändern sich auf Knopfdruck und alles ist gut.

Für alle die auch diese Info brauchen, den funktionierenden Sketch unten.

Danke an alle für Hilfe und Geduld!!
Arne

Wordclock_basic_button_FINAL.ino (14 KB)