Fadein, Fadeout über einen bestimmten Zeitraum

Hallo zusammen,

ich bin gerade dabei, mich damit zu befassen LEDs mit dem Arduino zu dimmen.
Das Blink without Delay Beispiel habe ich im großen und ganzen soweit verstanden
Da ich den Arduino für den Modellbau nutze, um die Lampen und LEDs zu steuern, bin ich nun auf ein Problem gestoßen, bei dem ich nicht weiter komme und Hilfe benötige:

Nun zu meinem Problem, das einfaden und ausfaden der Helligkeit mit den Arduino habe ich soweit geschafft nun möchte ich, wenn die analogen Ausgänge des Arduinos einen bestimmten PWM-Wert haben dieser über eine gewisse Zeit gehalten wird bevor dieser wieder runtergedimmt wird.
Das ganze müsste aber ohne Delay realisiert werden, da nebenbei noch andere Sachen über den UNO erledigt werden sollen.

Hier ersteinmal den Sketch wie er ohne die Haltefunktion aussieht.

[code]
int led = 3;
unsigned long fadestartzeit = 0;
unsigned long fadestartzeitalt = 0;
int fadedauer = 100;
int fadestartwert = 0;
int fadeoutdauer = 200;


boolean start = LOW;
boolean hochdimmen = true;


void setup() {
  // put your setup code here, to run once:
  pinMode(led, OUTPUT);
  

}

void loop() {
  // put your main code here, to run repeatedly:




  //LANGSAMES EINFADEN 
  fadestartzeit = millis();

  //Langsames Einfaden, wenn Start LOW ist und fadedauer vergangen ist
  if ((start == LOW) && fadestartzeit - fadestartzeitalt >= fadedauer) {
    fadestartzeitalt = fadestartzeit;   
    fadestartwert++;                    
    analogWrite(led, fadestartwert);    
    

  }


  //Wennd er fadewert größer als 255 ist wird er auf 255 gesetzt
  if (fadestartwert >= 255) {
    fadestartwert = 255;

Meine Idee wäre diese gewesen, jedoch funktioniert diese nicht könnte mir jemand erklären, warum meine Idee nich funktioniert?

[code]
int led = 3;
unsigned long fadestartzeit = 0;
unsigned long fadestartzeitalt = 0;
int fadedauer = 100;
int fadestartwert = 0;
int fadeoutdauer = 200;

boolean start = LOW;
boolean hochdimmen = true;


boolean haltefunktion = LOW;
unsigned long haltezeit = 0;
unsigned long haltezeitstarten = 0;
int halteinterval = 3000;

void setup() {
  // put your setup code here, to run once:
  pinMode(led, OUTPUT);


}

void loop() {
  // put your main code here, to run repeatedly:





  //LANGSAMES EINFADEN
  fadestartzeit = millis();

  //Langsames Einfaden, wenn Start LOW ist und fadedauer vergangen ist
  if ((start == LOW) && fadestartzeit - fadestartzeitalt >= fadedauer) {
    fadestartzeitalt = fadestartzeit;
    fadestartwert++;
    analogWrite(led, fadestartwert);


  }


  //Wennd er fadewert größer als 255 ist wird er auf 255 gesetzt
  if (fadestartwert >= 255) {
    fadestartwert = 255;
    haltezeitstarten = millis();
    haltefunktion = HIGH;


  }


  if ((haltefunktion == HIGH) && haltezeitstarten - haltezeit >= halteinterval) {
    haltezeit = haltezeitstarten
    start = HIGH;
  }





  //LANGSAMNES AUSFADEN
  //Wenn Start HIGH und fadeoutdauer vergangen
  if ((start == HIGH) && fadestartzeit - fadestartzeitalt >= fadeoutdauer) {
    fadestartzeitalt = fadestartzeit;
    fadestartwert--;
    analogWrite(led, fadestartwert);

  }
  if (fadestartwert == 0) {
    start = LOW;
  }
}

Würde mich sehr freuen, wenn mir jemand meinen Fehler erklären könnte oder mir eine Idee geben könnte, wie ich die Haltefunktion realisieren könnte

Es wäre natürlich sinnvoll, wenn Du genauere Angaben machst, was nicht funktioniert, wie Du es Dir vorstellst.

Im Prinzip hast Du 4 Zustände. Aus(0) - hoch faden(1) - Halten(2) - runter faden(3) - Aus(0).
Du brauchst also wenigstens eine Statusvariable, die Dir anzeigt, wo Du gerade bist.

Gruß Tommy

Tommy56:
Es wäre natürlich sinnvoll, wenn Du genauere Angaben machst, was nicht funktioniert, wie Du es Dir vorstellst.

Im Prinzip hast Du 4 Zustände. Aus(0) - hoch faden(1) - Halten(2) - runter faden(3) - Aus(0).
Du brauchst also wenigstens eine Statusvariable, die Dir anzeigt, wo Du gerade bist.

Gruß Tommy

Also einfaden und ausfaden funktioniert soweit und beim halten passiert nichts die LED faded garnicht mehr runter, nachdem die Zeit abgelaufen ist und auch nicht mehr hoch.
Sprich die LED bleibt auf den Wert von 255

Du kommst mit dem Umschalten der Zustände durcheinander.
Suche mal nach endlicher Automat oder Zustandsmaschine.

Pseudocode:

byte status = 0; // 0 = aus, 1=hoch, 2 = halten, 3=runter
int ausgabe = 0;

void loop() {
  if (status == 0) status = 1; 

  if (status == 1 && Schrittzeit um) {
    ausgabe++;
    if (ausgabe >= 255) {
      ausgabe = 255;
      status = 2;
      startHalten = millis();
    }   
    analogWrite(ausgabe);
  } 
  if (status == 2 && Haltezeit um) status = 3;
  if (status == 3 && Schrittzeit um) {
    ausgabe--;
    if (ausgabe <=0) {
      ausgabe = 0;
      status = 0;
    }
    analogWrite(ausgabe);
  }
}

Gruß Tommy

Wie Tommy schon schrieb, ist das letzendlich ein kleiner Zustandsautomat, und Du musst dafür sorgen, dass in den jeweiligen Zuständen ( Aufblenden, Halten und Abblenden ) wirklich nur die entsprechenden Codeteile ausgeführt werden. Perfekt für diesen Zweck ist die switch() Anweisung.
Mal kurz ( und etwas 'schmutzig' ) in deinen Code eingebaut :

int led = 3;
unsigned long fadestartzeit = 0;
unsigned long fadestartzeitalt = 0;
int fadedauer = 100;
int fadestartwert = 0;
int fadeoutdauer = 200;

byte state = 0;
boolean hochdimmen = true;


boolean haltefunktion = LOW;
unsigned long haltezeit = 0;
unsigned long haltezeitstarten = 0;
int halteinterval = 3000;

void setup() {
  // put your setup code here, to run once:
  pinMode(led, OUTPUT);


}

void loop() {
  // put your main code here, to run repeatedly:


  fadestartzeit = millis();


  switch ( state ) {
    case 0://LANGSAMES EINFADEN

      //Langsames Einfaden, wenn Start LOW ist und fadedauer vergangen ist
      if ( fadestartzeit - fadestartzeitalt >= fadedauer) {
        fadestartzeitalt = fadestartzeit;
        fadestartwert++;
        analogWrite(led, fadestartwert);

      }


      //Wennd er fadewert größer als 255 ist wird er auf 255 gesetzt
      if (fadestartwert >= 255) {
        fadestartwert = 255;
        haltezeitstarten = millis();
        state = 1;


      }
      break;
    case 1:
      if ( millis() - haltezeitstarten >= halteinterval) {
        state = 2;
        fadestartzeit = millis();
      }

      break;



    case 2: //LANGSAMNES AUSFADEN
      //Wenn Start HIGH und fadeoutdauer vergangen
      if (fadestartzeit - fadestartzeitalt >= fadeoutdauer) {
        fadestartzeitalt = fadestartzeit;
        fadestartwert--;
        analogWrite(led, fadestartwert);

      }
      if (fadestartwert == 0) {
        state = 0;
      }
  }
}

Ersteinmal danke für euere Hilfe, haben den Sketch jetzt soweit ans laufen bekommen.
Da das ganze nachher auf den ATmega328PB soll nun meine Frage, kennt sich jemand mit den ATmega328PBaus, da dieser ja neu ist und noch nicht von der IDE unterstützt wird.
Habe schon versucht mit der Anleitung von Watterott den 328PB zum laufen zu bekommen leider ohne Erfolg.
Würde mich freuen, wenn jemand der sich mit den 328PB schon beschäftigt hat und über die IDE schon programmiert hat mir einen Tipp geben könnte warum sich der µC bei mir nicht programmieren lässt.
Es kommt immer die Fehlermeldung, dass der Sketch nicht komplementiert werden kann, obwohl es sich um den Blinksketch aus den Beispielen handelt.

Edit:
Beitrag entfernt, weil ich keine Multipostings unterstützen möchte.