Habe hier eine Funktion bei der ich ein paar Probleme hab.
Kurz zur Funktionsweise:
Die Funktion rtcMinuten gibt auf einem LED Strip von 60 LEDs die Zeit an. Dabei ist der StartPunkt jedes mal jedes "Ziffernblatt" (0, 5, 10, 15, ....). Nun beginnt die Uhr bei Minute 0 mit dem leuchten der ersten LED 255.
Nun fadet die LED jede 12 Sekunden ein Feld weiter und lässt das vorherige aktiv. Sind die vollen 5 Minuten erreicht, werden die LEDs 0, 1, 2, 3, 4, nicht mehr angesprochen und der Vorgang startet erneut bei diesmal Startpunkt 5.
Habe nun das Problem, ich habe noch nicht die 60er Strips. Teste gerade immer nur 8 Leds. Deshalb setze ich jedes mal meinen DS3231 auf 0.
Die ersten 5 Minuten laufen wie gewünscht ab. Ab Minute 5 und Sekunde 0 funktioniert folgender Teil nicht mehr
static unsigned long test;
if(millis() - test > 1000) {
Serial << F(" m:") << m << F(" s:") << s
<< F(" ") << a << F(":") << b
<< F(":") << c << F(":") << d
<< F(":") << e << F(":") << f
<< F(" ") << hm1 << F(" ") << hm1+1
<< F(" ") << hm1+2 << F(" ") << hm1+3
<< F(" ") << hm1+4 << F(" ") << hm1+5
<< F(" ") << hm << F(" ") << hm2
<< endl;
test = millis();
}
Zu Beginn des Sketches sind er mir jede Sekunde einmal den aktuellen Stand. Ab 5 Minuten wird die If Abfrage nicht mehr beachetet und er schickt jeden Durchlauf die Daten.
// RTC
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <Streaming.h>
// LED Strip
#include <FastSPI_LED2.h>
#define NUM_LEDS 8
#define DATA_PIN 4
CRGB leds[NUM_LEDS];
void setup() {
// Serielle Schnittstelle
Serial.begin(9600);
time_t t;
tmElements_t tm;
tm.Year = 2000;
tm.Month = 1;
tm.Day = 1;
tm.Hour = 0;
tm.Minute = 0;
tm.Second = 0;
t = makeTime(tm);
RTC.write(tm);
setTime(t);
// LED Strip
FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
}
void loop() {
for(int x = 0; x < 8; x++) leds[x] = CRGB(0,0,0);
// RTC
tmElements_t tm;
RTC.read(tm);
byte h = tm.Hour * 5;
byte m = tm.Minute;
byte s = tm.Second;
rtcMinuten(m, s);
FastLED.show();
}
void rtcMinuten(byte m, byte s) {
byte hm = m / 5;
byte hm1 = hm * 5;// Startpunkt
byte hm2 = m%5;
byte sneu = s/5;
byte a = 0;
byte b = 0;
byte c = 0;
byte d = 0;
byte e = 0;
byte f = 0;
byte ledHelligkeit[] = {
0, 20, 25, 32, 40, 50, 64, 80, 101, 127, 161, 202, 255 };
switch(hm2) {
case 0:
// 0 - 11
a = ledHelligkeit[12];
b = ledHelligkeit[sneu];
break;
case 1:
// 12 - 23
a = ledHelligkeit[12];
b = ledHelligkeit[12];
c = ledHelligkeit[sneu];
break;
case 2:
// 24 - 35
a = ledHelligkeit[12];
b = ledHelligkeit[12];
c = ledHelligkeit[12];
d = ledHelligkeit[sneu];
break;
case 3:
// 36 - 47
a = ledHelligkeit[12];
b = ledHelligkeit[12];
c = ledHelligkeit[12];
d = ledHelligkeit[12];
e = ledHelligkeit[sneu];
break;
case 4:
// 48 - 59
a = ledHelligkeit[12];
b = ledHelligkeit[12];
c = ledHelligkeit[12];
d = ledHelligkeit[12];
e = ledHelligkeit[12];
f = ledHelligkeit[sneu];
break;
}
leds[hm1].g = a;
leds[hm1+1].g = b;
leds[hm1+2].g = c;
leds[hm1+3].g = d;
leds[hm1+4].g = e;
leds[hm1+5].g = f;
static unsigned long test;
if(millis() - test > 1000) {
Serial << F(" m:") << m << F(" s:") << s
<< F(" ") << a << F(":") << b
<< F(":") << c << F(":") << d
<< F(":") << e << F(":") << f
<< F(" ") << hm1 << F(" ") << hm1+1
<< F(" ") << hm1+2 << F(" ") << hm1+3
<< F(" ") << hm1+4 << F(" ") << hm1+5
<< F(" ") << hm << F(" ") << hm2
<< endl;
test = millis();
}
}