Programm nach 10 Minuten beenden und LED einschalten

Hallo,
ich bin blutiger Anfänger und komme einfach nicht weiter.
Ich habe diesen Code, damit blinkt eine LED gesoftet.
Aber nach 10 Minuten soll das blinken aufhören und die LED dauernd an sein.
Wie komme ich nach Zeit aus der Schleife raus ?
Vielen Dankl

int ledPin = 9;

void setup(){
}
void loop(){
  for (int helligkeit =1; helligkeit <= 255; helligkeit = helligkeit +8){
    analogWrite(ledPin, helligkeit);
    delay(30);
  }

  for (int helligkeit =255; helligkeit >= 0; helligkeit = helligkeit -8){
    analogWrite(ledPin, helligkeit);
    delay(30);
  }

analogWrite(ledPin, 0);
delay(500);
}
If (millis()<10*60*1000UL)

Was bedeutet was UL? Manchmal sehe ich auch andere Buchstaben hinter einer Zahl und ich habe noch nicht gelesen, was diese bewirken.
Danke für die Beantwortung der Zwischenfrage.

Grüße :slight_smile:

noiasca:
in deinen Worten: “gar nicht.”

Du kannst nach 10 Minuten nur “nichts mehr tun” oder umgekehrt generell nichts tun und die ersten 10 Minuten blinken.

also ein If (millis()<10601000UL) um dein geblinke rundherum packen.

Als Anfänger gar nicht so einfach, könntest du das bitte etwas besser beschreiben?
Vielen Dank

noiasca:
in deinen Worten: “gar nicht.”

Man kann loop() mittels return verlassen. Ich habe das von einem RFID-Beispiel gelernt, das immer mal wieder hier durch das Forum geistert und mich nervt. Auf dieses Thema und for angewendet, sieht das so aus:

const int ledPin = 9;
const uint32_t zeit = 10UL * 60 * 1000;

void setup() {
}

void loop() {
  if (millis() < zeit)
  {
    for (int helligkeit = 1; helligkeit <= 255; helligkeit = helligkeit + 8) {
      analogWrite(ledPin, helligkeit);
      if (millis() >= zeit) return;
      delay(30);
    }

    for (int helligkeit = 255; helligkeit >= 0; helligkeit = helligkeit - 8) {
      analogWrite(ledPin, helligkeit);
      if (millis() >= zeit) return;
      delay(30);
    }
  }
  analogWrite(ledPin, 0);
  delay(500);
}

Damit die Berechnung gleich zu Anfang von int nach uint32_t wechselt, verwende ich 10UL. Das ist nicht notwendig, lenkt aber hoffentlich die Aufmerksamkeit weg von der Konstanten hin zur Berechnung.

Ohne Berechnung versteht der Compiler auch eine Zahl ohne UL:

const uint32_t zeit = 600000;

Ich würde 2 millis() Kontrollen machen.
Eine die kontrolliert ob 10 minuten vorbei sind und somit von Blinken zu Dauerein Umschaltet und eine 2. Millis() Kontrolle das den zustand der LEd regelmäßig umschaltet = blinken.

Hast Du verstanden wie millis() zu verwenden ist?

Grüße Uwe

Vielen Dank agmue, so klappt es und ich habe es auch verstanden.
Ich bin froh, das es hier doch noch Leute gibt, die wissen, was ein Anfänger ist.

@Mit den millis ist es ok, denke ich, aber wie bekomme ich die LED am Ende der Zeit dauernd an ?

Hi

digitalWrite(LED_Pin,HIGH);
Wäre ein Versuch wert :o

So, Scherz beiseite - Du prüfst UNUNTERBROCHEN, ob Du noch in der Blink-Zeit bist - wenn Ja, blinkst Du.
Was hindert Dich daran, im anderen Fall - Du bist dann offensichtlich NICHT mehr in der Blinkzeit, die LED auf Dauer-AN zu stellen?

MfG

So, alles läuft, vielen Dank.

Hi

Für die Nachwelt könntest Du Deinen aktuellen Sketch noch hier einbinden.
Danke für das Feedback :slight_smile:

MfG

Sorry, daran habe ich nicht gedacht:

const int ledPin = 9;
const uint32_t zeit = 10UL * 60 * 1000;

void setup() {
}

void loop() 
//---------------------------------------------------------------------------
{
  if (millis() < zeit)
  {
    for (int helligkeit = 1; helligkeit <= 255; helligkeit = helligkeit + 8) 
    {
      analogWrite(ledPin, helligkeit);
      if (millis() >= zeit) return;
      delay(30);
    }

    for (int helligkeit = 255; helligkeit >= 0; helligkeit = helligkeit - 8) 
    {
      analogWrite(ledPin, helligkeit);
      if (millis() >= zeit) return;
      delay(30);
    }
  }
  analogWrite(ledPin, 0);
  delay(500);
//----------------------------------------------------------------------------
  if (millis() > zeit)
  {
     analogWrite(ledPin, 255);
     delay(600000);
  }
  
}
 if (millis() > zeit)
  {
     analogWrite(ledPin, 255);
     delay(600000);
  }

Darf ich fragen, warum du am Ende die Wartezeit von 5 min eingefügt hast? Wäre mit und ohne nicht gleich?

Darf ich fragen, warum du am Ende die Wartezeit von 5 min eingefügt hast? Wäre mit und ohne nicht gleich?

Darfst du fragen, und ja das ist egal.

Man könnte es auch so machen:

void loop ( ) {
   If ( millis ( ) < zeit ) {
       // blinken
       ...
   } else {
      digitalWrite (ledPin, HIGH); 
   }
}

Da der arme Arduino nach der Startphase nichts mehr macht außer auf Reset zu warten, könnte man das auch ganz anders lösen. Man könnte auch sicherstellen , dass es nach 49 Tagen nicht kurz wieder blinkt, falls das relevant wäre.

Bin halt Anfänger, habe es jetzt mit "else" gelöst, Danke Michael.

Das sollte keine Kritik sein. Mich interessierte nur dein Beweggrund. Ich bin auch Anfänger und will einfach verstehen. :slight_smile:

michael_x:
Man könnte auch sicherstellen , dass es nach 49 Tagen nicht kurz wieder blinkt, falls das relevant wäre.

Jetzt machst du mich aber neugierig.

Ich dachte, dass auch beim Überlauf die Abfrage korrekt sei.
Siehe Arduino Referenz Seite 58.

Also: Auch bei einem Überlauf funktioniert der Vergleich korrekt, es gibt keine Fehlberechnungen.
Die angegebene Verfahrensweise gilt analog auch bei micros().

while(1) ?

Eine Abfrage wie

  if (millis( ) - startzeit < intervall)

geht auch wenn millis() gerade über 0 gekommen ist und startzeit knapp vor dem Überlauf steht.
Das kannst du mit einem kleineren Datentyp leicht überprüfen:

byte alt = 250;
byte neu = 1;
Serial.println(neu-alt); // Ausgabe: 7

Hier ist es was anderes, ausnahmsweise wird der Wert von millis() direkt verwendet.

Ja

while (1) {} // Hängt bis zum Reset

michael_x:
Hier ist es was anderes, ausnahmsweise wird der Wert von millis() direkt verwendet.

Es ist nicht wirklich anders, hier ist nur der Startzeipunkt 0 Millisekunden und das -0 wurde weggelassen.

Die Abfrage ist aber alle 49 Tage wahr, um es wirklich nur einmal zu machen,
könnte man noch einen Schalter einbauen, @wie michael_x ja schon vorschlug.

das -0 wurde weggelassen

So kann man es auch sehen, aber wir hätten eine Dauer > 49 Tage wenn wir die Startzeit bei 0 festhalten, und das ist so nunmal nicht möglich.