LED mit DCF77 dimmen

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

Hallo Noah,
Dein Feind ist das 'delay (20);' im void Led an()
Ddadurch wird Dein Sketch für mehr als 5 sekunden angehalten, respektive solange in der For schleife gefangen gehalten.
hier wäre millis() Dein Freund.
Siehe Dir in den Beispielen der IDE das Blink without Delay an. und löse das hochfahren der LED mit millis()

LG Stefan

(deleted)

Maker1212:
Habt ihr eine Idee, wie man das Problem beheben kann?
Vielleicht mit return, goto, break, etc.?

„Etc.“ ist Dein Freund :slight_smile:

Das Problem ist, dass mehrere Sachen gleichzeitig ablaufen sollen. Die Lösung heißt „endlicher Automat“. Such hier im Forum nach der Nachtwächtererklärung oder lies, was mir dazu eingefallen ist.

Gruß

Gregor

Deltaflyer:
Hallo Noah,
Dein Feind ist das 'delay (20);' im void Led an()
Ddadurch wird Dein Sketch für mehr als 5 sekunden angehalten, respektive solange in der For schleife gefangen gehalten.
hier wäre millis() Dein Freund.
Siehe Dir in den Beispielen der IDE das Blink without Delay an. und löse das hochfahren der LED mit millis()

LG Stefan

Hallo Stefan,

das ist auch meine Vermutung. Ich habe mir das "BlinkWithoutDelay"-Beispiel angeschaut, verstehe jedoch nicht, wie ich das auf meinen Sketch übertragen kann. Könntest du mir das netterweise anfängerfreundlich erklären oder den Sketch passend abändern. :wink: Würde mich darüber sehr freuen.
Viele Grüße und besten Dank vorab
Noah

Maker1212:
... Könntest du mir das netterweise anfängerfreundlich erklären ...

Was bitte ist an dem, was ich zur Lektüre vorschlage, nicht anfängerfreundlich?!

Maker1212:
...oder den Sketch passend abändern. :wink:

Du hast Nerven ...

Gruß

Gregor

Deine Idee eines "Programms" das den zeitlichen Verlauf beschreibt ( von oben nach unten in loop() ) behindert vermutlich dein Verständnis.

Die Idee ist: loop() dauert keine Zeit, kommt aber unendlich oft dran.
Beschreibt also immer nur den aktuellen Moment.

Neben millis() ist das Wesentliche, einen Startzeitpunkt zum Vergleichen zu haben. Das Prinzip kann neben Blinken natürlich auch auf alles andere Zeitabhängige angewendet werden.
Auch ereignisabhängige Sachen und auch die Aufgabe, mehrere Sachen "gleichzeitig" zu machen, bekommt man so in den Griff.

Hallo Noah,

im Gegensatz zu anderen hier bin ich nicht grundsätzlich abgeneigt, Deiner Bitte nach nem Sketch oder dem Abändern Deines Sketches zu entsprechen. Habe mit Dieser Art der Hilfe viele gute, aber auch schlechte Erfahrungen gemacht. Nur: ich stecke derzeit selbst in nem sehr sehr umfangreichen Hilfe-Projekt, andem ich fast Tag und Nacht arbeite, Ich mag im moment nicht noch an nem weiteren Sketch arbeiten, und bin heute auch sehr müde.
Deshalb muss ich Dir leider Deine Bitte nach so intensiver Hilfe ablehnen.
Sorry.

Dennoch, danke für Deine höfliche Nachfrage.

LG Stefan

Deltaflyer:
Hallo Noah,

im Gegensatz zu anderen hier bin ich nicht grundsätzlich abgeneigt, Deiner Bitte nach nem Sketch oder dem Abändern Deines Sketches zu entsprechen. Habe mit Dieser Art der Hilfe viele gute, aber auch schlechte Erfahrungen gemacht. Nur: ich stecke derzeit selbst in nem sehr sehr umfangreichen Hilfe-Projekt, andem ich fast Tag und Nacht arbeite, Ich mag im moment nicht noch an nem weiteren Sketch arbeiten, und bin heute auch sehr müde.
Deshalb muss ich Dir leider Deine Bitte nach so intensiver Hilfe ablehnen.
Sorry.

Dennoch, danke für Deine höfliche Nachfrage.

LG Stefan

Alles klar. Das ist vollkommen verständlich. Trotzdem danke für dein generelles nettes Angebot. Ich finde es sehr nett, dass du so etwas nicht generell ablehnst.

Viele Grüße

Noah

gregorss:
Was bitte ist an dem, was ich zur Lektüre vorschlage, nicht anfängerfreundlich?!

Du hast Nerven ...

Gruß

Gregor

Das hat sich nicht auf deine Nachricht bezogen...

Ich habe deine Methode mit folgendem Sketch versucht, umzusetzen. Nun scheitert es jedoch daran den Case, bei dem eine bestimmte Uhrzeit definiert ist, zu beenden. Ich habe einen break am Ende, aber die for-Schleife hört trotzdem nicht auf.

Hier der Sketch:

#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 = 9;
int variabel = 1;

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");
    }
  }
 
  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");
  }
  led_steuern();
}
 
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(){
  switch (ZEIT_STUNDE, ZEIT_MINUTE) {
  case (20,42):
    for(int helligkeit = 0; helligkeit <= 255; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(20);
    }
      break;
  default:
    analogWrite(ledPin, 10); // Tue etwas, im Defaultfall
    break;
  }
}

Habt ihr eine Idee, wie ich das Problem lösen kann?

Die Idee die Zeit nur über einen DCF77 Empfänger zu bestimmen ist nicht zielführend.
Besser ist es einen RTC zu verwenden (zB einen DS3231), der bereits sehr genau ist (max Abweichung laut Datenblatt von ca 1 Minute pro Jahr bzw 0,17 Sekunden pro Tag bei Betriebstemperaturen zwischen 0 und 40°C) und diesen immer wieder mal durch den DCF77 synchronisiert. Es genügt eine Synchronisation einmal am Tag.
Das DCF77 Signal ist sehr leicht zu stören und nach dem Einschalten ist die Uhrzeit eine Weile nicht verfügbar.
Grüße Uwe

michael_x:
Deine Idee eines "Programms" das den zeitlichen Verlauf beschreibt ( von oben nach unten in loop() ) behindert vermutlich dein Verständnis.

Die Idee ist: loop() dauert keine Zeit, kommt aber unendlich oft dran.
Beschreibt also immer nur den aktuellen Moment.

Neben millis() ist das Wesentliche, einen Startzeitpunkt zum Vergleichen zu haben. Das Prinzip kann neben Blinken natürlich auch auf alles andere Zeitabhängige angewendet werden.
Auch ereignisabhängige Sachen und auch die Aufgabe, mehrere Sachen "gleichzeitig" zu machen, bekommt man so in den Griff.

Ich verstehe zwar halb, was du sagst, aber wüsste trotzdem nicht, wie ich das mit millis bei mir umsetzten soll. Ich habe noch nie damit gearbeitet und somit noch keine Erfahrung. Könntest du mir das vielleicht netterweise an meinem Problem erklären, wie ich vorzugehen habe? Ich würde mich freuen, weil das millis ja scheinbar sehr nützlich ist und ich es deshalb gerne verstehen würde...

Grüße

Noah

uwefed:
Die Idee die Zeit nur über einen DCF77 Empfänger zu bestimmen ist nicht zielführend.
Besser ist es einen RTC zu verwenden (zB einen DS3231), der bereits sehr genau ist (max Abweichung laut Datenblatt von ca 1 Minute pro Jahr bzw 0,17 Sekunden pro Tag bei Betriebstemperaturen zwischen 0 und 40°C) und diesen immer wieder mal durch den DCF77 synchronisiert. Es genügt eine Synchronisation einmal am Tag.
Das DCF77 Signal ist sehr leicht zu stören und nach dem Einschalten ist die Uhrzeit eine Weile nicht verfügbar.
Grüße Uwe

Habe ich mir auch überlegt, jedoch habe ich gerade einen DCF77 bei mir aus einem alten Wecker ausgebaut und würde den gerne benutzen. Einen DS3231 oder ähnliche RTCs habe ich nicht. Hast du vielleicht ansonsten eine Idee, wie ich meine o. g. Probleme lösen kann?

Hi

Deine Zeile case (20,42): macht WAS?
Also ich bin mir nicht wirklich sicher, WAS Da passiert, aber ganz ganz sicher NICHT, Was Du denkst, was Da passieren würde.

MfG

postmaster-ino:
Hi

Deine Zeile case (20,42): macht WAS?
Also ich bin mir nicht wirklich sicher, WAS Da passiert, aber ganz ganz sicher NICHT, Was Du denkst, was Da passieren würde.

MfG

Da trage ich vor dem Komma den Wert für die Stunde und nach dem Komma den Wert für die Minute ein, bei dem ich die Lampe hochdimmen will.

Hi

DAS ist mir soweit bewusst - macht aber nicht, was Du denkst.
Das Komma wirkt Da als Komma-Operator ... damit hat's sich aber leider schon - was Da GENAU passiert, wurde hier schon Mal auseinander klamüsert.
WAS Du machen könntest: Die zwei Variablen in Minuten vom Tag umzurechnen (Stunde*60+Minute) - Das wäre eindeutig und funktioniert - musst Du dann auf beiden Seiten machen, klar.

MfG

merke dir global ob du hochdimmen willst (ein flag) und den Dimmerwert dimmer

Dann ändere dein led_an: statt einer for mit delay, schaltest das flag ein,
eine separate Funktion led_tick() im Loop schaut nach, ob das flag gesetzt ist, ob es noch was zum hochdimmen gibt und ob die Zeit für den nächsten Schritt erfüllt ist.

in etwa so
ungeprüft, weil ich deine Hardware nicht habe, aber kompiliert:

#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;

bool hochdimmen = false;
byte dimmer = 0;

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");
  }

  led_tick();
}

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();
    hochdimmen = true;
  }
  else {
    led_aus();
  }
}

void led_tick() {
  static uint32_t previousMillis = 0;
  if (hochdimmen && millis() - previousMillis > 20 && dimmer < 255) // wir sind im hochdimmen UND  Zeit ist um UND es gibt was zum hochdimmen
  {
    dimmer++;
    analogWrite(ledPin, dimmer);
    previousMillis = millis();
  }
  if (dimmer == 255)
  {
    dimmer = 0;
    hochdimmen = false;
  }
}

/*
// brauchen wir nicht mehr
void led_an() {
  for (int helligkeit = 0; helligkeit <= 255; helligkeit = helligkeit + 1) {
    analogWrite(ledPin, helligkeit);
    delay(20);
  }
}
*/
void led_aus() {
  analogWrite(ledPin, 0);
}

man kann sicher hochdimmen und dimmer noch zusammenführen, besser geht immer ^^

Dein Code hat auf Anhieb funktioniert. Vielen Dank schon einmal. Nun stehe ich jedoch vor der nächsten Hürde:

Ich möchte nicht, dass der Wert für die Helligkeit konstant von 0 auf 255 steigt, sondern möchte die Lampe wie in folgendem Sketch heller dimmen:

int ledPin = 10;
int helligkeit;
int starttaster = 3;
int starttasterstatus = 0;

void setup(){
  pinMode(starttaster, INPUT); 
  Serial.begin(9600);
}

void loop(){
  starttasterstatus = digitalRead(starttaster);
  if(starttasterstatus == HIGH){
    analogWrite(ledPin, 1);
    delay(10000);
    
    for(helligkeit = 1; helligkeit <= 40; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(1825);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(8000);

    for(helligkeit = 41; helligkeit <= 44; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(40);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(8000);

    for(helligkeit = 45; helligkeit <= 48; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(40);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(8000);

    for(helligkeit = 49; helligkeit <= 52; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(40);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(8000);

    for(helligkeit = 53; helligkeit <= 56; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(40);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(8000);

    for(helligkeit = 57; helligkeit <= 60; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(40);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(8000);

    for(helligkeit = 61; helligkeit <= 69; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 70; helligkeit <= 78; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 79; helligkeit <= 87; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 88; helligkeit <= 96; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 97; helligkeit <= 105; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 106; helligkeit <= 114; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 115; helligkeit <= 123; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 124; helligkeit <= 132; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 133; helligkeit <= 141; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 142; helligkeit <= 150; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 151; helligkeit <= 159; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 160; helligkeit <= 168; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 169; helligkeit <= 177; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 178; helligkeit <= 186; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 187; helligkeit <= 195; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 196; helligkeit <= 204; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 205; helligkeit <= 213; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 214; helligkeit <= 222; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 223; helligkeit <= 231; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 232; helligkeit <= 240; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(2000);

    for(helligkeit = 241; helligkeit <= 255; helligkeit = helligkeit +1) {
     analogWrite(ledPin, helligkeit); 
     delay(50);
     Serial.print(helligkeit);
     Serial.print("\n");
    }
    delay(20000);
    analogWrite(ledPin, 0);
     
  }
}

Ich sitze hier seit Stunden und versuche die delays zu umschreiben, aber klappen tut nichts.

@noiasca:
Könntest du mir den oben genannten Code in den anderen Sketch "einbinden"? Anstelle des Tasters, müsste eben eine eingestellte Zeit stehen? Ich würde mich sehr freuen und wär dir sehr dankbar.

Viele Grüße

Noah

nein. Das musst du selber machen.

entweder machst aus der bool dimmen eine byte dimmen, und behandelst dann im led_tick die unterschiedliche Schrittweiten abhängig vom dimmen,
oder such dir eine halbwegs passende mathematische Funktion die für den Bereich 0..255 dir die Helligkeit und Zeiten ermittelt.

dritte Variante: ein Lookup Array im Progmem.

Alles klar. Ich habe trotzdem noch eine Frage:

In deinem Sketch, den du mir geschickt hast, hast du "static uint32_t previousMillis = 0;" definiert. Was hat das "static uint32_t" für eine Bedeutung? Ich habe davon noch nie gehört...

Grüße

Noah