Hallo zusammen,
ich habe folgendes Problem:
Ich möchte eine LED zu einer bestimmten Uhrzeit (von einem DCF77-Empfänger) hochdimmen.
Dabei stoße ich beim folgenden Code auf das Problem, dass die Zeitmessung aufhört, wenn die LED hochdimmt bzw. wenn die Zeit, die ich im if-Statement angegeben habe, erreicht wurde.
#define STATUS_PIN LED_BUILTIN
#define DCF_PIN 2
int HIGH_Start = 0;
int HIGH_Ende = 0;
int HIGH_Zeit = 0;
int LOW_Start = 0;
int LOW_Ende = 0;
int LOW_Zeit = 0;
bool Signal = false;
bool neueMinute = false;
int BIT = -1;
int ZEIT[65];
int ZEIT_STUNDE;
int ZEIT_MINUTE;
int ZEIT_TAG;
int ZEIT_MONAT;
int ZEIT_JAHR;
int ZEIT_WOCHENTAG;
int PAR_STUNDE;
int PAR_MINUTE;
int PAR_BEGINN;
int ledPin = 10;
void setup() {
Serial.begin(115200);
pinMode(DCF_PIN, INPUT);
pinMode(STATUS_PIN, OUTPUT);
Serial.println("Syncronisierung");
}
void loop() {
if (BIT > 60) {
neueMinute = false;
}
int DCF_SIGNAL = digitalRead(DCF_PIN);
if (DCF_SIGNAL == HIGH && Signal == false) {
Signal = true;
HIGH_Start = millis();
LOW_Ende = HIGH_Start;
LOW_Zeit = LOW_Ende - LOW_Start;
Serial.print("\t");
Serial.print("hier2");
Serial.print("\n");
if (neueMinute == true) {
PrintBeschreibung(BIT);
//Serial.print("Bit");
//Serial.print (BIT);
//Serial.print (": ");
ZEIT[BIT] = (BIT_Zeit(LOW_Zeit));
Serial.print (ZEIT[BIT]);
//Serial.println ();
Serial.print("\t");
Serial.print("hier3");
Serial.print("\n");
}
else {
Serial.print(".");
Serial.print("\t");
Serial.print("hier4");
Serial.print("\n");
}
led_steuern();
}
if (DCF_SIGNAL == LOW && Signal == true) {
Signal = false;
HIGH_Ende = millis();
LOW_Start = HIGH_Ende;
HIGH_Zeit = HIGH_Ende - HIGH_Start;
NEUMINUTE(LOW_Zeit);
Serial.print("\t");
Serial.print("hier5");
Serial.print("\n");
}
}
int BIT_Zeit (int LOW_Zeit) {
if (LOW_Zeit >= 851 && LOW_Zeit <= 950) {return 0;}
if (LOW_Zeit >= 750 && LOW_Zeit <= 850) {return 1;}
if (LOW_Zeit <= 350) {BIT-=1;return "";}
}
void NEUMINUTE (int LOW_Zeit) {
if (LOW_Zeit >= 1700) {
BIT = 0;
neueMinute = true;
ZEIT_STUNDE = ZEIT[29]*1+ZEIT[30]*2+ZEIT[31]*4+ZEIT[32]*8+ZEIT[33]*10+ZEIT[34]*20;
ZEIT_MINUTE = ZEIT[21]*1+ZEIT[22]*2+ZEIT[23]*4+ZEIT[24]*8+ZEIT[25]*10+ZEIT[26]*20+ZEIT[27]*40;
PAR_STUNDE = ZEIT[35];
PAR_MINUTE = ZEIT[28];
ZEIT_TAG = ZEIT[36]*1+ZEIT[37]*2+ZEIT[38]*4+ZEIT[39]*8+ZEIT[40]*10+ZEIT[41]*20;
ZEIT_MONAT = ZEIT[45]*1+ZEIT[46]*2+ZEIT[47]*4+ZEIT[48]*8+ZEIT[49]*10;
ZEIT_JAHR = 2000+ZEIT[50]*1+ZEIT[51]*2+ZEIT[52]*4+ZEIT[53]*8+ZEIT[54]*10+ZEIT[55]*20+ZEIT[56]*40+ZEIT[57]*80;
PAR_BEGINN = ZEIT[20];
Serial.println();
Serial.println("*****************************");
Serial.print ("Uhrzeit: ");
Serial.println();
Serial.print (ZEIT_STUNDE);
Serial.print (":");
Serial.print (ZEIT_MINUTE);
Serial.println();
Serial.println();
Serial.print ("Datum: ");
Serial.println();
Serial.print (ZEIT_TAG);
Serial.print (".");
Serial.print (ZEIT_MONAT);
Serial.print (".");
Serial.print (ZEIT_JAHR);
Serial.println();
Serial.println("*****************************");
} else {BIT++;}
}
void PrintBeschreibung(int BitNummer) {
switch (BitNummer) {
case 0: Serial.println("\n# START MINUTE (IMMER 0)"); break;
case 1: Serial.println("\n# WETTERDATEN"); break;
case 15: Serial.println("\n# RUFBIT"); break;
case 16: Serial.println("\n# MEZ/MESZ"); break;
case 17: Serial.println("\n# MESZ"); break;
case 18: Serial.println("\n# MEZ"); break;
case 19: Serial.println("\n# SCHALTSEKUNDE"); break;
case 20: Serial.println("\n# BEGIN ZEITINFORMATION (IMMER 1)"); break;
case 21: Serial.println("\n# MINUTEN"); break;
case 28: Serial.println("\n# PARITAET MINUTE"); break;
case 29: Serial.println("\n# STUNDE");break;
case 35: Serial.println("\n# PARITAET STUNDE"); break;
case 36: Serial.println("\n# TAG"); break;
case 42: Serial.println("\n# WOCHENTAG"); break;
case 45: Serial.println("\n# MONAT"); break;
case 50: Serial.println("\n# JAHR"); break;
case 58: Serial.println("\n# PARITAET DATUM"); break;
}
}
void led_steuern(){
if(ZEIT_STUNDE == 15 && ZEIT_MINUTE == 2){
led_an();
}
else{
led_aus();
}
}
void led_an(){
for(int helligkeit = 0; helligkeit <= 255; helligkeit = helligkeit +1) {
analogWrite(ledPin, helligkeit);
delay(20);
}
}
void led_aus(){
analogWrite(ledPin, 0);
}
Wenn ich die LED mit einem anderen Sketch nur um eine bestimmt Zeit mit analogRead/digitalRead anschalte und im else-Statement mit analogRead/digitalRead die LED ausschalte, funktioniert dies. Das Problem liegt deswegen vermutlich in der for-Schleife.
Habt ihr eine Idee, wie man das Problem beheben kann?
Vielleicht mit return, goto, break, etc.?
Vielen Dank im Voraus für hoffentlich zahlreiche Antworten und viele Grüße
Noah