Probleme mit Timer

Hallo Ihr Programmierprofis.

Ich möchte keinen delay verwenden und benutze folgenden Code:

if ((fire == 1)&& (LaserDetectValue < schwellenwert)){
       
       led1State = HIGH;
       currentMillis=millis();
       
       } 
       if (millis() - currentMillis > 500)
       led1State =LOW;
       digitalWrite(24, led1State);

LED geht an wenn der Schwellenwert erreicht ist, aber sie geht geht nicht mehr aus.
Wo liegt mein Fehler?

Danke für Eure Hilfe

Schau Dir mal die Syntax von "If" an.

Hilf mir bitte auf die Sprünge, selbst wenn ich geschweifte Klammern verwende, ändert sich nichts dran

Hallo,

auch wenn die Formatierung ungünstig ist, liegt der Fehler bestimmt woanders.
Besser formatiert sieht dein Codeschnipsel so aus.

if ((fire == 1) && (LaserDetectValue < schwellenwert)) {
  led1State = HIGH;
  currentMillis = millis();
}

if (millis() - currentMillis > 500) {
  led1State = LOW;
}
  
digitalWrite(24, led1State);

wenn die LED nicht ausschaltet, laut die Frage, wird die erste if Bedingung weiterhin erfüllt?
Effekt wäre, die LED schaltet permanent ein und aus. Das macht sie so schnell, dass man das nicht sieht.
Wäre jetzt meine Vermutung an Hand des Codeschnipsels.

gonzo6969:
Hilf mir bitte auf die Sprünge, selbst wenn ich geschweifte Klammern verwende, ändert sich nichts dran

Das ist raten.

Zeige uns den kompletten Sketch.

Ihr habt recht, der Schwellenwert wird permanent aktualisiert. Ich benutze ein Nextion Display. Wie muss ich umbauen, dass sobald der Schwellenwert erreicht ist eine Verzögerung eintritt, die LED schaltet, eine Zeilang brennt, und dann ausschaltet und wieder in Bereitschaft geht

//-----------------------------------------------------------------------
// Funktionen Seite Laserlichtschranke
//-----------------------------------------------------------------------
void laser_01_backPopCallback(void *ptr)

{
 dbSerialPrintln("laser_01_backPopCallback");
 laser_01_status.setText("");
 LaserSwitchState =LOW;
 led1State = LOW;
 lichtschranke.show();
 
}  

void laser_01_startPopCallback(void *ptr)
{

 dbSerialPrintln("laser_01_startPopCallback");
 laser_01_status.setText("Running");
 fire=1;


 }

void laser_01_stopPopCallback(void *ptr)
{
 dbSerialPrintln("laser_01_stopPopCallback");
 
 laser_01_status.setText("Stop");
 memset(buffer, 0, sizeof(buffer));   //Buffer leeren
 laser_01_schwellenwert.getText(buffer, sizeof(buffer));  // Text holen
 schwellenwert = atoi(buffer);               //Text in integer konvertiern
 memset(buffer, 0, sizeof(buffer));   //Buffer leeren
 laser_01_verzoegerung.getText(buffer, sizeof(buffer));  // Text holen
 verzoegerung = atoi(buffer);               //Text in integer konvertiern
 digitalWrite(LaserSwitch, LaserSwitchState); 
 if ((!verzoegerung) && (!schwellenwert))
 {laser_01_status.setText("Eingabe erforderlich");}
 else
 {
  laser_01_status.setText("Ready");
    }
 
  led1State = LOW;
 
}
....
void loop() {
  // put your main code here, to run repeatedly:
  // We are going to check the list of touch events we enter previously to
  // know if any touch event just happened, and excecute the corresponding instructions:

  nexLoop(nex_listen_list);  // Check for any touch event
    


   
  switch (modul) {
    
    //-----------------------------------------------------------------------
    // Lasersteuerung
    //-----------------------------------------------------------------------
    case 1:

     //aktuellen Schwellenwert anzeigen
     if((long)(millis() - previousMillis1) >= 0) {
        previousMillis1 +=1000;   
        LaserDetectValue = analogRead(LaserDetect); //PIN für Schwellenwert lesen
        dbSerialPrintln();
        memset(buffer, 0, sizeof(buffer));
        laser_01_aktuell.getText(buffer, sizeof(buffer));
        memset(buffer, 0, sizeof(buffer));
        itoa(LaserDetectValue, buffer, 10);
        laser_01_aktuell.setText(buffer);
          
        }
    
      //if (fire==1){ currentMillis=millis();}
      if ((fire == 1)&& (LaserDetectValue < schwellenwert)){
        
       led1State = HIGH;
       currentMillis=millis();
       if (millis() - currentMillis > 500)
       {led1State =LOW;}
       } 
       
      digitalWrite(24, led1State);
      
      digitalWrite(LaserSwitch, LaserSwitchState);   
      
      Serial.begin(115200);
       
      
    break;
....
}

Hallo,

wenn du deine if Bedingung im Griff hast, könnte das kurze leuchten der LED so aussehen

const byte LED13 = 13;

void setup() {
  digitalWrite(LED13, LOW);
  pinMode(LED13, OUTPUT);
}

void loop() {
  
  flash_LED();
}

void flash_LED ()
{
  static unsigned long last_ms = 0;

  if (millis()-last_ms > 1800) {
    last_ms = millis();
    digitalWrite(LED13, HIGH);
  }

  if (millis()-last_ms > 200){
    digitalWrite(LED13, LOW);
  }
}

Hallo,

vielleicht noch ein besseres Bsp. für deine Anwendung, der Inhalt der ersten if Bedingung wäre dann bei dir der Einschaltschaltcode, wenn du deine if Bedingung im Griff hast ...

const byte LED13 = 13;

unsigned long last_ms = 0;
bool stateAktivLED = false;

void setup() {
  digitalWrite(LED13, LOW);
  pinMode(LED13, OUTPUT);
}

void loop() {

  if (millis()-last_ms > 1800) {
    last_ms = millis();
    digitalWrite(LED13, HIGH);
    stateAktivLED = true;
  }
  
  if (stateAktivLED == true){
    flash_LED(last_ms);
  }
}

void flash_LED (unsigned long &lastTimeOn)
{
  if (millis()-lastTimeOn > 200){
    digitalWrite(LED13, LOW);
    stateAktivLED = false;
  }
}