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

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)