Frisse blik gevraagd.

Ik heb een stukje code geschreven voor "meesturende" mistlampen.

ik meet via een potmeter mijn huidige stuurpositie (rechtdoor = 511) en als deze meer dan "30" afwijkt gaat respectievelijk de linker of rechter mistlamp branden. Alle gegeven waarden zijn genoteerd als een "int" .

Ik wil alleen graag dat als ik weer recht vooruit stuur dat deze vertraagd uitgaan. (seconde of 3) ik deed dit eerst met delay; , maar daar werk ik liever niet mee.

Ik ben nu al 2 dagen aan het puzzelen en ik krijg het niet voor elkaar, misschien dat iemand anders een frisse kijk erop kan geven.

if (Potmeter - 511 > 30 && Koplampen==HIGH){
    mistLstate=HIGH;
    mistRstate=LOW;
    }  
           
  else if (511 - Potmeter > 30 && Koplampen==HIGH){
    mistRstate=HIGH;
    mistLstate=LOW;
      }

  else if (andere knop==LOW && nog een andere knop==LOW){
    mistRstate=LOW;
    mistLstate=LOW;
  }

  digitalWrite(MistR,mistRstate);
  digitalWrite(MistL,mistLstate);
}

Hier een filmpje wat het uiteindelijke doel is:

Er loopt volgens mij constant een teller, en die kun je hiervoor gebruiken.
Daarmee bedoel ik millis; die zijn er altijd als ik me niet vergis
Wanneer je stuurt, houd je een extra variabele op een door jou te kiezen waarde.
Dus tijdens het branden van een van de lampen zet je die waarde telkens terug.
Vervolgens ga je als er geen lamp brandt, deze waarde aftellen met behulp van millis*1000 (als je in seconden wil werken).
Ff kijken hoe je dat kunt doen.

Je kunt altijd kijken wat millis is, die delen door 1000 en er vervolgens 4 bij tellen in je routine waar je 1 van de 2 lampen aanzet.
Dat aanzetten word continu gedaan, dus het resetten van de teller ook.
In de routine waar je beide lampen uitzet, kun je dan gaan aftellen.
Alleen wil je niet dat je uitkomt onder nul.
Daarom tel je van 4 naar 1.
Is de waarde 1 of lager, dan reset je m weer naar 1 en schakel je de lampen uit.
Das dus een extra if else.

Volgens mij moet dit op deze wijze kunnen, geen idee of het efficiënter kan.
Succes.

ik ben ook die 2 dagen bezig geweest met te puzzelen met millis(); Na het een middag te laten rusten en nog eens jouw post doorgelezen te hebben ben ik tot de volgende opzet gekomen. Dit lijkt te werken.

if (Potmeter - 511 > 30 && Koplampen==HIGH){
    stuur=100;
    mistLstate=HIGH;
    mistRstate=LOW;
    Delay=millis();
    }  
           
  else if (511 - Potmeter > 30 && Koplampen==HIGH){
    stuur=200;
    mistRstate=HIGH;
    mistLstate=LOW;
    Delay=millis();
      }

 else if (millis()-Delay<1000 && Koplampen==HIGH){
    if (stuur>150){
      mistRstate=HIGH;
      mistLstate=LOW;}
      else{
        mistLstate=HIGH;
        mistRstate=LOW;}

else{
mistLstate=LOW;
        mistRstate=LOW;}


  digitalWrite(MistR,mistRstate);
  digitalWrite(MistL,mistLstate);
}

Ja dit is dus efficiënter omdat je rechtstreeks met millis werkt en niet eerst een waarde instelt en daar vervolgens mee gaat werken.
Je hoeft zo ook niet bang te zijn om onder nul uit te komen en daar dan ook geen speciale rekening mee te houden.
Alleen kom je met je voorbeeld uit op 1 seconde "nagloeien", maar dat is eenvoudig aan te passen.

Ik vindt de code persoonlijk verwarrend omdat je de naam "Delay" gebruikt voor de tijd dat je "delay timer" start.
Ik zou eerder weken met een naam in de trend van "switchTime"
dan zou ik zeggen

switchTime= millis()+1000; //Switch the lights in 1 second

De schakelcode wordt dat

if (( switchTime<millis ()) && Koplampen==HIGH )

Met vriendelijke groet
Jantje

PS Ik zie ook dat je in de gegeven code Koplampen nooit laag of hoog zet.

dank je voor de tip.

ik wil dat mijn mistlampen alleen branden als de koplampen aan staan.
dit staat ook ergens anders in mijn code weergegeven(niet gepost)

Nu ik de code zo herlees zie ik toch nog wat bugs 8)
Zo is de koplampen==HIGH niet nodig en verwarrend.
Meer nog als je de Koplampen uitzet tijdens de delay gaat de code toch nog werken en misschien iets aanzetten wat je niet aan wilt.
Met andere woorden als je beslit op om de lampen te schakelen moet je die beslissing misschien herzien als je de koplampen uit of aan zet.

Verder is het zo dat de huidige code Delay of te switchTime niet "gereset" wordt. Dit betekend dat eens getriggered de code bij elke loop opniew uitevoerd wordt.
Wat je moet doen is iets als

if ( switchTime<millis () )
{
switchTime=-1; //Daar switchTime een unsigned long is wordt dit een enorm groot getal 
...

Met vriendelijke groet
Jantje

@ jantje ik snap je verhaal niet helemaal.

ik heb inmiddels een heel gedeelte veranderd.

Maar, ik reset de Delay tijd toch? Dit doe ik zodra 1 van beide lampen aan gaan. als de seconde is verlopen gaan beide lampen uit. Of zie ik iets over het hoofd.

ik doe de code nu ook in 3 delen:
even wat achtergrond info. ik heb een schakelaar met 3 standen (onlogisch ding, maar hij hoort thuis in het interieur van de auto)
Stand 1 A+F
stand 2 A
stand 3 A+W

Verder zit er nog een spiegellamp (verstraler met autospiegel) en een achtermistlamp in.

ik kom nu tot de volgende code, zit een boel overbodige informatie, maar ik heb nu dit:

void stuurmeting(){
  reading = analogRead(potPin);

  if (MillisNu - VorigeMillis > wachttijdA){
    VorigeMillis = MillisNu;
    firstreading = analogRead(potPin);
  }

  if (MillisNu - VorigeMillis > wachttijdB){
    if (0 < (firstreading - reading) < Marge){
      calibrate = firstreading; 
    }
    else if (0 < (reading - firstreading) < Marge){
      calibrate = firstreading; 
    }
    else{
      calibrate = calibrate; 
    }
  }
}

void miststanden(){

  if (MistA==HIGH && MistF==HIGH && lichtstate==HIGH ){
    if(MillisNu-DelayB>1000){
      mistrstate=HIGH;
      mistlstate=HIGH;
      mistastate=LOW;
      spiegelstate=LOW;
      DelayC=MillisNu;
      mistcounter=1;
    }
    else{
      DelayC=MillisNu;   
      mistastate=LOW;
    }
  }

  if (MistA==HIGH && MistF==LOW && MistW==LOW && lichtstate==HIGH){
    if(MillisNu-DelayB>1000){
      mistrstate=HIGH;
      mistlstate=HIGH;
      spiegelstate=LOW;
      mistastate=LOW;
      DelayD=MillisNu;
      mistcounter=1;
    }
    if(MillisNu-DelayC>1000){
      mistrstate=HIGH;
      mistlstate=HIGH;
      mistastate=HIGH;
      spiegelstate=LOW;
      DelayD=MillisNu;
      mistcounter=1;
    }
    else{
      DelayD=MillisNu;
      spiegelstate=LOW;
      mistastate=LOW;
    }
  }

  if (MistA==HIGH && MistF==LOW && MistW==HIGH && mistcounter ==2 && lichtstate==HIGH){
    if(MillisNu-DelayD>1000){
      spiegelstate=HIGH;
      mistrstate=HIGH;
      mistlstate=HIGH;
      mistastate=LOW;
      DelayC=MillisNu;
    }
    else{ 
      DelayC=MillisNu;
      DelayB=MillisNu;
      mistastate=LOW;
      spiegelstate=LOW;
    }
  }

  if (MistA==HIGH && MistF==LOW && MistW==HIGH && mistcounter ==1 && lichtstate==HIGH){
    if(MillisNu-DelayD>1000){
      if (reading - calibrate > Stuuruitslag){
        stur=100;
        mistlstate=HIGH;
        mistrstate=LOW;
        Delay=MillisNu;
        mistastate=LOW;
        spiegelstate=HIGH;
        DelayB=MillisNu;
        DelayC=MillisNu;
      }
      else if (calibrate - reading > Stuuruitslag){
        stur=200;
        mistrstate=HIGH;
        mistlstate=LOW;
        Delay=MillisNu;
        mistastate=LOW;
        spiegelstate=HIGH;
        DelayB=MillisNu;
        DelayC=MillisNu;
      }
      else if (MillisNu-Delay<1000 && lichtstate==HIGH){
        if (stur>150){
          mistrstate=HIGH;
          mistlstate=LOW;
          mistastate=LOW;
          spiegelstate=HIGH;
          DelayB=MillisNu;
          DelayC=MillisNu;
        }
        else{
          mistlstate=HIGH;  
          mistrstate=LOW;
          mistastate=LOW;
          spiegelstate=HIGH;
          DelayB=MillisNu;
          DelayC=MillisNu;
        }
      }
      else{
        mistlstate=LOW;  
        mistrstate=LOW;
        mistastate=LOW;
        spiegelstate=HIGH;
        DelayB=MillisNu;
        DelayC=MillisNu;
      }
    }
  }

  if (MistA==LOW && MistF==LOW && MistW==LOW && lichtstate==HIGH){
    mistastate=LOW;
    spiegelstate=LOW;
    DelayB=MillisNu;
    DelayC=MillisNu;
    DelayD=MillisNu;
    mistcounter=0; 

    if (reading - calibrate > Stuuruitslag){
      stur=100;
      mistlstate=HIGH;
      mistrstate=LOW;
      Delay=MillisNu;
      mistastate=LOW;
      spiegelstate=LOW;
      DelayB=MillisNu;
      DelayC=MillisNu;
      DelayD=MillisNu;
      mistcounter=0;
    }
    else if (calibrate - reading > Stuuruitslag){
      stur=200;
      mistrstate=HIGH;
      mistlstate=LOW;
      Delay=MillisNu;
      mistastate=LOW;
      spiegelstate=LOW;
      DelayB=MillisNu;
      DelayC=MillisNu;
      DelayD=MillisNu;
      mistcounter=0;
    }
    else if (MillisNu-Delay<1000 && lichtstate==HIGH){
      if (stur>150){
        mistrstate=HIGH;
        mistlstate=LOW;
        mistastate=LOW;
        spiegelstate=LOW;
        DelayB=MillisNu;
        DelayC=MillisNu;
        DelayD=MillisNu;
        mistcounter=0;
      }
      else{
        mistlstate=HIGH;  
        mistrstate=LOW;
        mistastate=LOW;
        spiegelstate=LOW;
        DelayB=MillisNu;
        DelayC=MillisNu;
        DelayD=MillisNu;
        mistcounter=0;
      }
    }
    else{
      mistlstate=LOW;  
      mistrstate=LOW;
      mistastate=LOW;
      spiegelstate=LOW;
      DelayB=MillisNu;
      DelayC=MillisNu;
      DelayD=MillisNu;
      mistcounter=0;
    }
  }

  if (lichtstate==LOW){
    mistastate=LOW;
    spiegelstate=LOW;
    DelayB=MillisNu;
    DelayC=MillisNu;
    DelayD=MillisNu;
    mistcounter=0;
    mistlstate=LOW;  
    mistrstate=LOW;
  }

  digitalWrite(MistR,mistrstate);
  digitalWrite(MistL, mistlstate);
  IOexp.digitalWrite(1,7,mistastate);
  IOexp.digitalWrite(1,6,spiegelstate);
}

void Mistlampen(){

  MistA=IOexp.digitalRead(0,5);
  MistF=IOexp.digitalRead(0,6);
  MistW=IOexp.digitalRead(0,7);

  if (MistA==HIGH && MistF==LOW && MistW==HIGH && lichtstate==HIGH){
    miststate=HIGH;
  }
  else{
    miststate=LOW;
  }

  if (miststate != lastmiststate){
    if (miststate==HIGH){
      mistcounter++;
    }
  }

  if (mistcounter ==3){
    mistcounter = 1;
  } 

  lastmiststate= miststate;
}

void lichten(){

  lichtstate=IOexp.digitalRead(0,3);

  if (lichtstate==HIGH){
    koplamp=HIGH;   
  }
  else{
    koplamp =LOW;
  }
  digitalWrite(KopL,koplamp);
  digitalWrite(KopR,koplamp);
}