Wechselblinker hängt sich auf

Hallo,
ich bin absoluter Anfänger und möchte zum Anfang ein Wechselblinker ohne Delay aufbauen.
Das funktioniert so weit auch, aber nach ca. 30 Sekunden hängt sich das Sketch auf und die beiden LEDs leuchten durchgehend.
Hat jemand eine Idee, was ich falsch mache?
Anbei mein Sketchausschnitt.

void blinken()
{
  if (blinkenEin == 1)
  {
    if ((millis() - led1millis > 100) && counter >= 0 && counter < 4)
    {
    led1Status = !led1Status;
    digitalWrite(LED1, led1Status);
    led1millis = millis();
    counter = counter + 1;
    }
    else if (counter == 4)
    {
      wartezeit = millis();
      counter = 5;
    }
    else if (counter == 5 && millis() - wartezeit > 100)
      {
        counter = 6;
      }
    if ((millis() - led2millis > 100) && counter >= 6 && counter < 10)
    {
    led2Status = !led2Status;
    digitalWrite(LED2, led2Status);
    led2millis = millis();
    counter = counter + 1;
    }
    else if (counter == 10)
    {
      wartezeit = millis();
      counter = 11;
    }
    else if (counter == 11 && millis() - wartezeit > 100)
      {
        counter = 0;
      }
  }
  else
  {
    reset();
  }
}

Der Code ist nicht testbar. Da fehlt zu viel.

Auch hast du vergessen zu sagen, was der Code genau tun soll.

Tipp:
Bedingungen weniger tief verschachteln.
Das ist so zu unübersichtlich (für mich und für dich wohl auch)

Nachtrag:
So würde ein Wechselblinker bei mir aussehen

// https://forum.arduino.cc/index.php?topic=415229.msg2859554
#include <TaskMacro.h>

const byte Led1 = 13;
const byte Led2 = 12;

bool BlinkAnforderung = true; // Merker, ob Blinken gewünscht ist.

void blinken()
{
   static bool BlinkMerker;
   
   taskBegin();
   while(1)   
   {
      taskWaitFor(BlinkAnforderung); // soll blinken?

      // Lichtbild setzen
      digitalWrite(Led1, BlinkMerker);
      digitalWrite(Led2,!BlinkMerker);

      // warten
      taskPause(100);

      // Lichtbild löschen   
      digitalWrite(Led1,false);
      digitalWrite(Led2,false);

      // Lichtbild wechseln
      BlinkMerker ^= true;
   }
   taskEnd();  
}


void setup() 
{
  pinMode(Led1,OUTPUT);
  pinMode(Led2,OUTPUT);
}

void loop() 
{
  blinken();
}

nach ca. 30 Sekunden hängt sich das Sketch auf

Einintreicht für 32,7 sec, sagt meine Glaskugel und eine Erinnerung an meine eigenen ersten Stolperfallen.

Aber dein Fehler ist zunächst, dass du vergessen hast, das Wichtigste mitzuposten:
Die Variablendefinitionen

michael_x:
Einintreicht für 32,7 sec

Ah das ist doch mal ein Ansatz.
Aber wenn ich long nehme, ist doch auch nach 33,3 Minuten Ende, oder?

Hier mal der komplette Sketch…

const int LED1 = 50;
const int LED2 = 51;

int tasterStatus = 0;
int neuerStatus = 0;
int blinkenEin = 0;
int entprellzeit = 0;
int led1millis = 0;
int led1Status = LOW;
int led2millis = 0;
int led2Status = LOW;
int counter = 0;
int wartezeit = 0;

void setup() {

  pinMode(50, OUTPUT);
  pinMode(51, OUTPUT);
  pinMode(49, INPUT);

}

void loop() {
  
  tasterStatus = digitalRead(49);

  if (tasterStatus == 1 && neuerStatus == 0 && (millis() - entprellzeit > 500))
  {
    blinkenEin = 1;
    neuerStatus = 1;
    entprellzeit = millis();
  }
  else if (tasterStatus == 1 && neuerStatus == 1 && (millis() - entprellzeit > 500))
  {
    blinkenEin = 0;
    neuerStatus = 0;
    entprellzeit = millis();
  }
  
blinken();
}

void blinken()
{
  if (blinkenEin == 1)
  {
    if ((millis() - led1millis > 100) && counter >= 0 && counter < 4)
    {
    led1Status = !led1Status;
    digitalWrite(LED1, led1Status);
    led1millis = millis();
    counter = counter + 1;
    }
    else if (counter == 4)
    {
      wartezeit = millis();
      counter = 5;
    }
    else if (counter == 5 && millis() - wartezeit > 100)
      {
        counter = 6;
      }
    if ((millis() - led2millis > 100) && counter >= 6 && counter < 10)
    {
    led2Status = !led2Status;
    digitalWrite(LED2, led2Status);
    led2millis = millis();
    counter = counter + 1;
    }
    else if (counter == 10)
    {
      wartezeit = millis();
      counter = 11;
    }
    else if (counter == 11 && millis() - wartezeit > 100)
      {
        counter = 0;
      }
  }
  else
  {
    reset();
  }
}

void reset()
{
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    counter = 0;
    led1Status = LOW;
    led2Status = LOW;
}

Aber wenn ich long nehme, ist doch auch nach 33,3 Minuten Ende, oder?

Nöö, das hält ca 25 Tage.

Nimm: "unsigned long" 49,x Tage...

millis() liefert einunsigned long Wenn entprellzeit ein anderer Datentyp ist, geht

  entprellzeit = millis();

irgendwann schief, und dann auch der Vergleich... ( bei unsigned int hast du 65 sek, bei (signed) long 25 Tage bis zum Fehler )

Wenn aber entprellzeit ebenfalls unsigned long ist, wird die Differenz (auch während eines Überlaufs) immer richtig...

112marv: Hallo, ich bin absoluter Anfänger und möchte zum Anfang ein Wechselblinker ohne Delay aufbauen. Das funktioniert so weit auch, aber nach ca. 30 Sekunden hängt sich das Sketch auf und die beiden LEDs leuchten durchgehend. Hat jemand eine Idee, was ich falsch mache? Anbei mein Sketchausschnitt.

?

OK, solche Spielchen will st Du hier machen? Du sendest einen Ausschnitt aus dem Sketch statt den vollständigen Sketch und möchtest darüber diskutieren?

Na danke auch, da bin ich mal wieder bedient für heute!

Dann sende ich Dir hier einen Ausschnitt aus der Antwort mit der Lösung zu Deinem Problem:

Eine int Variable kann Zahlen bis maximal 32767 aufnehmen.

Wenn Dein Sketch also Millisekunden in int packen würde, dann wäre eine fehlerfreie Funktion bis zu 32,767 Sekunden nach dem Programmstart garantiert, also etwas über 32 Sekunden. Was danach passiert, hängt von der gesamten Programmlogik im GANZEN Sketch ab.

Guten Rutsch!

Auf solche Spielchen mit "ich sende einen Ausschnitt" habeich eigentlich NULL BOCK!

Aber wenn Du das so willst, spiele ich auch den Scheiss hier mit.

Aber wenn Du das so willst, spiele ich auch den Scheiss hier mit.

Glückwunsch! :o :o :o :o :o

jurs: Aber wenn Du das so willst, spiele ich auch den Scheiss hier mit.

Ich wünsche Dir ein entspanntes Jahr 2017!

jurs: Auf solche Spielchen mit "ich sende einen Ausschnitt" habeich eigentlich NULL BOCK!

Aber wenn Du das so willst, spiele ich auch den Scheiss hier mit.

Dann lass es doch einfach, wenn du auf den "Scheiss NULL BOCK" hast!

Was soll denn diese aggressive Stimmung hier? Es ist mein erster Beitrag hier und ich dachte der Ausschnitt reicht. Ich habe den ganzen Sketch doch dann nachgereicht.

Vielen Dank an combie und michael_x, die hier versuchen zu helfen und aus auch getan haben!

Macht der Sketch denn jetzt, was Du willst?

Seit ca. zwei Stunden läuft er jetzt. Wobei ich mir die Lösung von combie auch nochmal anschauen werde.

112marv: Seit ca. zwei Stunden läuft er jetzt.

Dann schau in 49 Tagen nochmal genau hin, ob der Überlauf funktioniert :)

112marv: Wobei ich mir die Lösung von combie auch nochmal anschauen werde.

Wie immer gibt es mehrere Lösungsansätze und Dein Sketch könnte noch optimiert werden.

Wobei ich mir die Lösung von combie auch nochmal anschauen werde.

Tu du das... 8)

Aber sei gewarnt, die Lösung ist "brutal".