LED ohne Delay nach einer bestimmten zeit ausschalten

Hi,
Wir brauchen Hilfe bei unserem Lämpchen Projekt. Wir würden gerne einen Code programmieren mit dem sich unsere LED nach einer bestimmten Zeit ausschaltet.
//Variablendefinitionen:
int ROTE_LED=D1;
int LAST_MILLIS=0;

void setup() {
// put your setup code here, to run once:
pinMode(ROTE_LED, OUTPUT);
Serial.begin(9600);

}

void loop() {
// put your main code here, to run repeatedly:
digitalWrite(ROTE_LED,HIGH); //LED wird eingeschaltet
if(millis()<(LAST_MILLIS+5000)){

Serial.println("LED AN");
}

if(millis()>(LAST_MILLIS+5000)){ //millis = sekunden die vom start an vergangen sind
digitalWrite(ROTE_LED,LOW);
Serial.println("LED AUS");
LAST_MILLIS=millis();
}

}

Es sollte ca. diese Befehle beinhalten.
Vielen Dank

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Auf einem AVR reicht int nicht um die millis() zu halten.
Zudem ist der millis() Wert vorzeichenlos.

Die Additionsmethode versagt im Überlauf.

Tipp:
Orientiert euch bitte an dem "Blink without Delay" Beispiel.

man speichert millis() in einer Variable des Types "unsigned long"

das heißt egal was passiert, LED wird immer eingeschaltet.

welche Platine willst du programmieren? denn wenn es Uno/Nano sind, lässt man Pins 0 und 1 unberührt, so dass es zu keiner Kollision mit UART Port kommt.

Hallo,
bevor das jetzt scheibchenweise klarer wird die Frage :Wollt Ihr sie auch irgendwann mal wieder einschalten, z.B mit einem Taster.

Warum zeigst du uns nicht einfach die Aufgabe, die Ihr vom Lehrer bekommen habt.
Das macht alles einfacher.

Bitte verwende das Symbol <code> um Code einzufügen, oder kopiere den aus der IDE mit BEARBEITEN - FÜR FORUM KOPIEREN

const byte ROTE_LED = D1;
unsigned long LAST_MILLIS = 0;

void setup()
{
  pinMode(ROTE_LED, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  // put your main code here, to run repeatedly:
  if (millis() - LAST_MILLIS > 5000)
  {
    digitalWrite(ROTE_LED, !digitalRead(ROTE_LED)); //LED wird eingeschaltet
    Serial.print(F("LED "));
    if (digitalRead(ROTE_LED))
    { Serial.println("AN"); }
    else
    { Serial.print(F("AUS")); }
    LAST_MILLIS = millis();
  }
}

Auf was für einem Controller soll das laufen?

const int ROTE_LED = 13;

void setup() {
  pinMode(ROTE_LED, OUTPUT);
  digitalWrite(ROTE_LED, HIGH); //LED wird eingeschaltet
}

void loop() {
  static unsigned long LAST_MILLIS = millis();
  if (millis() - LAST_MILLIS >= 5000) { //millis = Millisekunden die vom Start an vergangen sind
    digitalWrite(ROTE_LED, LOW);
  }
}

Das hört sich nach einem Treppenhauslicht an.

//Variablendefinitionen:
constexpr uint8_t ROTE_LED {LED_BUILTIN};
constexpr uint8_t KNOP {A0};
uint32_t LAST_MILLIS = 0;
void setup() {
  pinMode(ROTE_LED, OUTPUT);
  pinMode(KNOP, INPUT_PULLUP);
  Serial.begin(9600);
}
void loop() {
  if (digitalRead(KNOP)?LOW:HIGH) 
  {
    digitalWrite(ROTE_LED, HIGH);
    Serial.println("LED AN");
    LAST_MILLIS=millis();
  }
  if (millis() > (LAST_MILLIS + 5000)) { //millis = sekunden die vom start an vergangen sind
    digitalWrite(ROTE_LED, LOW);
    Serial.println("LED AUS");
    LAST_MILLIS = millis();
  }
}

Wenn das Einschalten durch RESET erfolgt, wie in @kohala s Beispiel, reicht ein Einzeiler:

void loop() {
  if (millis() >= 5000) digitalWrite(ROTE_LED, LOW);
}

Dieser Code "funktioniert" sogar beim Überlauf nach 49 Tagen.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.