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:
- 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.
-
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?
-
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 ![]()
Danke
Arne
Wordclock_basic_button.ino (13.3 KB)