Led millis mit Pause

Hallo,

ich versuche mit dem millis Befehl eine led im Sekunden Takt fünf mal blinken zu lassen und danach soll sie 10 Sekunden pausieren und das ganze wieder von vorne.
Mit delay bekomme ich das hin aber mit millis bin ich etwas auf dem Kriegsfuß(irgendwann werden wir Freunde :slight_smile: )

Und wo ist der nicht funktionierende Kode?

  1. millis() ist eine Funktion. C hat keine Befehle.
  2. zeig Deinen Sketch.
    Grüße Uwe

Es ist nicht nur die Verwendung der millis().
Es ist auch der endliche Automat, welcher hier gerne implementiert werden möchte.

combie:
........ der endliche Automat, .....................

:smiley: :smiley: :smiley:

Was gibt es da zu lachen?

Hier der Link für den Fragesteller.

Gruß, H.

Hallo,

declarieren unsigned long m_alt;

m_alt = millis();

if (millis()>( m_alt +1000 ))
{

m_alt = millis();

}

1 Sekunde 1000
10 sec = 10 000
1 min = 60 000
1 Std = 3 600 000

Mußt du an der richtigen Stelle in dein Programm einbauen.

Gruß
Eckhard

Ersetze das falsche

if (millis()>( m_alt +1000 ))

durch

if (millis() - m_alt > 1000)

was hälst du davon?

void setup() {
             
              }
void loop() {
            blink_anz(5,13); //Aufruf mit 5 mal blinken, Led an Pin 13
            }
void blink_anz(byte anz,byte ledPin)
{
  pinMode(ledPin, OUTPUT);
  static uint32_t previousMillis_led;        
  static uint32_t millisalt_led;
  static boolean ledState;
  static uint8_t count;
  const uint16_t interval = 300;           
  if(millis()-millisalt_led>10000)
  {
   if(millis() - previousMillis_led > interval)
     {
       previousMillis_led = millis();   
       if (!ledState) ledState = HIGH;
       else{
            ledState = LOW; 
            count++;
            if(count>=anz){count=0;millisalt_led=millis();}
            }
       digitalWrite(ledPin, ledState);
     }
   }
}

Hallo,

if(millis()-millisalt_led>1000) ardubu

if (millis() - m_alt > 1000) Whandall

ist meiner Meinung nach nicht richtig.

Wenn schon dann noch eine Klammer.

if ((millis() - m_alt) > 1000)

Ich habe bis jetzt in cc-Basic und Maschinensprache programmiert.

Da hätte man es so schreiben müssen.

Könnt ja mal auf meine Homepage gehen.

www.eraetz.de

Gruß
Eckhard

Dein Kode funktionierte nicht, das gefällt mir natürlich nicht.

Ich würde das so lösen

const byte ledPin = 13;

void setup() {
  pinMode(ledPin, OUTPUT);
}
void loop() {
  blink_anz(5, ledPin); //Aufruf mit 5 mal blinken, Led an Pin 13
}

void blink_anz(byte anz, byte ledPin)
{
  static uint32_t ledStart;
  static uint32_t pauseStart;
  static boolean ledState;
  static uint8_t count;
  static boolean pausing;
  const uint16_t interval = 500;

  if (pausing) {
    if (millis() - pauseStart > 10000) {
      pausing = false;
    }
  } else {
    if (millis() - ledStart > interval) {
      ledStart = millis();
      if (!ledState) ledState = HIGH;
      else {
        ledState = LOW;
        count++;
        if (count >= anz) {
          count = 0;
          pausing = true;
          pauseStart = millis();
        }
      }
      digitalWrite(ledPin, ledState);
    }
  }
}

Eckhard24:
if (millis() - m_alt > 1000) Whandall

ist meiner Meinung nach nicht richtig.

Wenn schon dann noch eine Klammer.

Doch, doch das ist schon richtig so.

'-' bindet stärker als '>'.

Operator precedence

Arduama:
ich versuche mit dem millis Befehl eine led im Sekunden Takt fünf mal blinken zu lassen
und danach soll sie 10 Sekunden pausieren und das ganze wieder von vorne.

Beschreibe das Blinken mal genauer!

Ich verstehe das nicht eindeutig

Entweder meinst Dur: In der ersten Sekunde fünfmal ein/aus blinken, dann zehn Sekunden aus= Wiederholung nach 11 Sekunden.

Vielleicht meinst Du aber auch: In den ersten fünf Sekunden je eine halbe Sekunde ein und aus (=5s gesamt), und danach nochmal 10s aus = Gesamtdauer der Sequenz 15 Sekunden, bis sie sich wiederholt.

Oder vielleicht meinst Du noch was anderes.

Wenn Du die Sequenz auf Deutsch genau und eindeutig beschreiben kannst, kannst Du sie auch in eine Datenstruktur im Code packen und abarbeiten lassen. Jede Zweideutigkeit bei der sprachlichen Beschreibung führt am Ende zu Fehlermöglichkeiten beim Code. Code kann keine zweideutigen Definitionen auflösen, sondern nur eindeutige Definitionen abarbeiten.

Dein Kode funktionierte nicht, das gefällt mir natürlich nicht.

was funktioniert da nicht? Der Sketch beginnt nur mit 10 sek. Pause.

Arduama:
ich versuche mit dem millis Befehl eine led im Sekunden Takt fünf mal blinken zu lassen und danach soll sie 10 Sekunden pausieren und das ganze wieder von vorne.

Für mich bedeutet funktionieren sich anforderungsgemäß verhalten.

Aber auch mein Kode war nicht korrekt, es gab eine zusätzliche Pause von 500 mS am Anfang
und eine Bonus-mS auf alle Timings ('>' statt '>=').

Auf die LED State Variable kann man auch verzichten, wenn man den PIN zurückliest.

Hier eine Version mit Debug-Ausgaben

const byte ledPin = 13;
boolean starting = true;

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
}
void loop() {
  blink_anz(5, ledPin); //Aufruf mit 5 mal blinken, Led an Pin 13
}

void blink_anz(byte anz, byte ledPin)
{
  static uint32_t ledStart;
  static uint32_t pauseStart;
  static uint8_t count;
  static boolean pausing;
  const uint16_t interval = 500;

  if (pausing) {
    if (millis() - pauseStart >= 10000) {
      Serial.print(F("Pause Ende "));
      Serial.println(millis());
      pausing = false;
    }
  } else {
    if (starting || (millis() - ledStart >= interval)) {
      starting = false;
      ledStart = millis();
      digitalWrite(ledPin, !digitalRead(ledPin));
      Serial.print(F("LED "));
      Serial.print(digitalRead(ledPin) ? F("ein ") : F("aus "));
      Serial.println(millis());
      if (!digitalRead(ledPin)) {
        if (++count >= anz) {
          count = 0;
          Serial.print(F("Pause Anfang "));
          Serial.println(millis());
          pausing = true;
          pauseStart = millis();
        }
      }
    }
  }
}
LED ein 0
LED aus 500
LED ein 1000
LED aus 1500
LED ein 2000
LED aus 2500
LED ein 3000
LED aus 3500
LED ein 4000
LED aus 4500
Pause Anfang 4500
Pause Ende 14500
LED ein 14500
LED aus 15000
LED ein 15500
LED aus 16000
LED ein 16500
LED aus 17000
LED ein 17500
LED aus 18000
LED ein 18500
LED aus 19000
Pause Anfang 19000
Pause Ende 29000
LED ein 29000
LED aus 29500
LED ein 30000

Bei blinkWithoutDelay kann man das Intervall auch als Variable definieren und die Zeiten als Feld (das habe ich von jurs gelernt):

const byte ledPin = 13;
//                              H     L     H     L     H     L     H     L     H      L
const unsigned int zeit[] = {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 10000};
const byte anzahl = sizeof(zeit) / sizeof(zeit[0]);
byte index;
unsigned long aktMillis, blinkMillis, intervall;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  aktMillis = millis();
  if (aktMillis - blinkMillis >= intervall) {
    digitalWrite(ledPin, !digitalRead(ledPin));
    blinkMillis = aktMillis;
    intervall = zeit[index];
    index++;
    index = index % anzahl;
  }
}

Arduama:
Mit delay bekomme ich das hin aber mit millis bin ich etwas auf dem Kriegsfuß(irgendwann werden wir Freunde :slight_smile: )

Das will ich doch hoffen :slight_smile: