Pages: [1]   Go Down
Author Topic: Frisse blik gevraagd.  (Read 1609 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

  
Code:
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:

« Last Edit: December 08, 2012, 07:49:15 am by Nald » Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 42
Posts: 1492
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
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);
}
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 42
Posts: 1492
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Forum Moderator
Belgium
Offline Offline
Edison Member
*****
Karma: 68
Posts: 1893
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Code:
switchTime= millis()+1000; //Switch the lights in 1 second
De schakelcode wordt dat
Code:
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.
Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

Forum Moderator
Belgium
Offline Offline
Edison Member
*****
Karma: 68
Posts: 1893
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nu ik de code zo herlees zie ik toch nog wat bugs  smiley-cool
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
Code:
if ( switchTime<millis () )
{
switchTime=-1; //Daar switchTime een unsigned long is wordt dit een enorm groot getal
...

Met vriendelijke groet
Jantje
Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ 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.


Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
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);
}
Logged

Pages: [1]   Go Up
Jump to: