Blinken mit Verschiedenen Zeiten ohne delay

Hallo zusammen,

zu meinem Problem habe ich schon viel gesucht und auch ein bisschen was gefunden, zufrieden war ich damit aber nicht. Außerdem wollte ich das selber hinbekommen :slight_smile: Darum frage ich nun hier um Hilfe.

Folgende Situation:
Ich hab eine LED, die ich blinken lassen will. Die Zeiten, zu der sie an bzw. aus ist möchte ich frei wählen können, z.B. 1s an, 4s aus, 3s an, 6s aus und dann das ganze von vorne.
delay scheidet aus, und mit millis bekomme ich das nicht hin.

Mein Ansatz:
Wie bei dem Beispiel "blink without delay" eigentlich. Nur eben dass ich die Zeiten von an/ aus mit der Differenz von currentMillis - previousMillis verrechne. Weil es einfacher ist habe ich das bis jetzt nur mit einer Einschalt- und einer Ausschaltzeit versucht. Wenn das dann funktioniert kann ich die anderen Zeiten ja ergänzen.
Was bis jetzt passiert: Die LED geht an und bleibt an. :roll_eyes:
Ist dieser Ansatz möglich oder totaler Quatsch? Wenn das prinzipiell geht, wo liegt mein Fehler?

const int led1 =  8;      // the number of the LED pin

// Variables will change:
int ledState1 = LOW;             // ledState used to set the LED
long previousMillis1 = 0;        // will store last time LED was updated

long blink1 = 200;           // interval at which to blink (milliseconds)
long pause1 = 100;


void setup() {
  // set the digital pin as output:
  pinMode(led1, OUTPUT); 
}


void loop()
{
 
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis1 > blink1 + pause1) {
     
  if (ledState1 == LOW)
     {ledState1 = HIGH;}
  else {ledState1 = LOW;}


    // set the LED with the ledState of the variable:
    digitalWrite(led1, ledState1);
    }




   if(currentMillis - previousMillis1 + blink1 >  pause1 ) {
      previousMillis1 = currentMillis;   

    if (ledState1 == HIGH)
       {ledState1 = LOW;}
    else {ledState1 = HIGH; }

    // set the LED with the ledState of the variable:
    digitalWrite(led1, ledState1);
   }
 

}

Vielen Dank für eure Hilfe!
Simon

simon97:
Ich hab eine LED, die ich blinken lassen will. Die Zeiten, zu der sie an bzw. aus ist möchte ich frei wählen können, z.B. 1s an, 4s aus, 3s an, 6s aus und dann das ganze von vorne.
delay scheidet aus, und mit millis bekomme ich das nicht hin.

Ich habe hier mal was für jemanden gepostet, der eine "blinkende Leuchtturm-Karte" machen wollte, auf der jeder Leuchtturm mit seinem eigenen ein-aus-ein-aus-ein-aus Rhythmus blinken kann:
http://forum.arduino.cc/index.php?topic=146086.msg1099068#msg1099068

Schau Dir den Thread mal an.

@simon97: Jurs Vorschlag ist natürlich optimal.
Zu deinem Ansatz, habe den Sketch etwas verändert.
Kann das gerade nicht testen, ein Versuch kostet ja nicht nichts. :wink:

const int led1 =  8;      // the number of the LED pin

// Variables will change:
int ledState1 = LOW;             // ledState used to set the LED
long previousMillis1_on = 0;        // will store last time LED was on
long previousMillis1_off = 0;        // will store last time LED was off

long blink1 = 200;           // interval at which to blink (milliseconds)
long pause1 = 100;


void setup() {
  // set the digital pin as output:
  pinMode(led1, OUTPUT); 
}


void loop()
{
 
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis1_on > blink1) {
previousMillis1_off = currentMillis;   
     
 
ledState1=LOW; 

    // set the LED with the ledState of the variable:
    digitalWrite(led1, ledState1);
    }




if(currentMillis - previousMillis1_off  >  pause1 ) {
      previousMillis1_on = currentMillis;   

    
    
ledState1= HIGH; 

    // set the LED with the ledState of the variable:
    digitalWrite(led1, ledState1);
   }
 

}

Ich würde mir einen Grundtakt suchen - am besten das niedrigste Intervall und dann je nach gewünschtem Intervall mit einem regelbaren Zähler abfragen.

Dieses Thema passt sehr gut zu deiner Anfrage.

http://forum.arduino.cc/index.php?topic=215606.0

Mit leichten umschreiben kann man dein Problem damit lösen.

Danke für eure Hilfe!
@rudirabbit: Bei dem Code geht die LED einfach an und bleibt an :slight_smile:
@jurs und PhunThom: Ich hab mir beide Threads durchgeschaut und einige der jeweiligen Vorschläge ausprobiert.
Ich habe mich für den Code des Nutzers Theseus aus dem Thread "blink_without_delay für Fortgeschrittene" entschieden blink_without_delay für Fortgeschrittene - #8 by Theseus - Deutsch - Arduino Forum und an meine Bedürfnisse angepasst, indem ich die Zeiten geändert habe und den Code von drei auf zwei mal Blinken verkürzt habe.

Also nochmal vielen Dank für eure Hilfe und die verschiedenen Lösungsansätze!